Commit 4ccbba3a authored by Mark Rutland's avatar Mark Rutland Committed by Jinjie Ruan
Browse files

arm64: allow kprobes on EL0 handlers

stable inclusion
from stable-v5.10.199
commit 8a8d4cc303ef53b456af2660e0f5753cb3622d31
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I65RG3?from=project-issue
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=8a8d4cc303ef53b456af2660e0f5753cb3622d31



-------------------------------------------------

commit b3a0c010 upstream.

Currently do_sysinstr() and do_cp15instr() are marked with
NOKPROBE_SYMBOL(). However, these are only called for exceptions taken
from EL0, and there is no risk of recursion in kprobes, so this is not
necessary.

Remove the NOKPROBE_SYMBOL() annotation, and rename the two functions to
more clearly indicate that these are solely for exceptions taken from
EL0, better matching the names used by the lower level entry points in
entry-common.c.

Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Joey Gouly <joey.gouly@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20221019144123.612388-2-mark.rutland@arm.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarJinjie Ruan <ruanjinjie@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJinjie Ruan <ruanjinjie@huawei.com>
parent c7dc668d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -47,10 +47,10 @@ void do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr,
void do_fpsimd_acc(unsigned int esr, struct pt_regs *regs);
void do_sve_acc(unsigned int esr, struct pt_regs *regs);
void do_fpsimd_exc(unsigned int esr, struct pt_regs *regs);
void do_sysinstr(unsigned int esr, struct pt_regs *regs);
void do_el0_sys(unsigned long esr, struct pt_regs *regs);
void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr);
void do_cp15instr(unsigned int esr, struct pt_regs *regs);
void do_el0_cp15(unsigned long esr, struct pt_regs *regs);
void do_el0_svc(struct pt_regs *regs);
void do_el0_svc_compat(struct pt_regs *regs);
void do_el0_fpac(struct pt_regs *regs, unsigned long esr);
+2 −2
Original line number Diff line number Diff line
@@ -314,7 +314,7 @@ static void noinstr el0_sys(struct pt_regs *regs, unsigned long esr)
{
	enter_from_user_mode();
	local_daif_restore(DAIF_PROCCTX);
	do_sysinstr(esr, regs);
	do_el0_sys(esr, regs);
}

static void noinstr el0_pc(struct pt_regs *regs, unsigned long esr)
@@ -438,7 +438,7 @@ static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
{
	enter_from_user_mode();
	local_daif_restore(DAIF_PROCCTX);
	do_cp15instr(esr, regs);
	do_el0_cp15(esr, regs);
}

static void noinstr el0_svc_compat(struct pt_regs *regs)
+2 −4
Original line number Diff line number Diff line
@@ -662,7 +662,7 @@ static const struct sys64_hook cp15_64_hooks[] = {
	{},
};

void do_cp15instr(unsigned int esr, struct pt_regs *regs)
void do_el0_cp15(unsigned long esr, struct pt_regs *regs)
{
	const struct sys64_hook *hook, *hook_base;

@@ -700,10 +700,9 @@ void do_cp15instr(unsigned int esr, struct pt_regs *regs)
	 */
	do_undefinstr(regs, esr);
}
NOKPROBE_SYMBOL(do_cp15instr);
#endif

void do_sysinstr(unsigned int esr, struct pt_regs *regs)
void do_el0_sys(unsigned long esr, struct pt_regs *regs)
{
	const struct sys64_hook *hook;

@@ -720,7 +719,6 @@ void do_sysinstr(unsigned int esr, struct pt_regs *regs)
	 */
	do_undefinstr(regs, esr);
}
NOKPROBE_SYMBOL(do_sysinstr);

static const char *esr_class_str[] = {
	[0 ... ESR_ELx_EC_MAX]		= "UNRECOGNIZED EC",