Message ID | 20190301132809.24653-9-will.deacon@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Rework debug exception handling code | expand |
On Fri, Mar 01, 2019 at 01:28:07PM +0000, Will Deacon wrote: > Now that the debug hook dispatching code takes the triggering exception > level into account, there's no need for the hooks themselves to poke > around with user_mode(regs). > > Signed-off-by: Will Deacon <will.deacon@arm.com> Reviewed-by: Mark Rutland <mark.rutland@arm.com> Mark. > --- > arch/arm64/kernel/kgdb.c | 8 +------- > arch/arm64/kernel/probes/kprobes.c | 6 ------ > arch/arm64/kernel/probes/uprobes.c | 12 ++++-------- > arch/arm64/kernel/traps.c | 6 ------ > 4 files changed, 5 insertions(+), 27 deletions(-) > > diff --git a/arch/arm64/kernel/kgdb.c b/arch/arm64/kernel/kgdb.c > index 4c01f299aeb2..30853d5b7859 100644 > --- a/arch/arm64/kernel/kgdb.c > +++ b/arch/arm64/kernel/kgdb.c > @@ -244,9 +244,6 @@ int kgdb_arch_handle_exception(int exception_vector, int signo, > > static int kgdb_brk_fn(struct pt_regs *regs, unsigned int esr) > { > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > kgdb_handle_exception(1, SIGTRAP, 0, regs); > return DBG_HOOK_HANDLED; > } > @@ -254,9 +251,6 @@ NOKPROBE_SYMBOL(kgdb_brk_fn) > > static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int esr) > { > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > compiled_break = 1; > kgdb_handle_exception(1, SIGTRAP, 0, regs); > > @@ -266,7 +260,7 @@ NOKPROBE_SYMBOL(kgdb_compiled_brk_fn); > > static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr) > { > - if (user_mode(regs) || !kgdb_single_step) > + if (!kgdb_single_step) > return DBG_HOOK_ERROR; > > kgdb_handle_exception(1, SIGTRAP, 0, regs); > diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c > index 3066ffd70cf5..30502a3c8cf0 100644 > --- a/arch/arm64/kernel/probes/kprobes.c > +++ b/arch/arm64/kernel/probes/kprobes.c > @@ -450,9 +450,6 @@ kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr) > struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); > int retval; > > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > /* return error if this is not our step */ > retval = kprobe_ss_hit(kcb, instruction_pointer(regs)); > > @@ -473,9 +470,6 @@ static struct step_hook kprobes_step_hook = { > static int __kprobes > kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr) > { > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > kprobe_handler(regs); > return DBG_HOOK_HANDLED; > } > diff --git a/arch/arm64/kernel/probes/uprobes.c b/arch/arm64/kernel/probes/uprobes.c > index 7d6ea88796a6..f37ab9567676 100644 > --- a/arch/arm64/kernel/probes/uprobes.c > +++ b/arch/arm64/kernel/probes/uprobes.c > @@ -171,7 +171,7 @@ int arch_uprobe_exception_notify(struct notifier_block *self, > static int uprobe_breakpoint_handler(struct pt_regs *regs, > unsigned int esr) > { > - if (user_mode(regs) && uprobe_pre_sstep_notifier(regs)) > + if (uprobe_pre_sstep_notifier(regs)) > return DBG_HOOK_HANDLED; > > return DBG_HOOK_ERROR; > @@ -182,13 +182,9 @@ static int uprobe_single_step_handler(struct pt_regs *regs, > { > struct uprobe_task *utask = current->utask; > > - if (user_mode(regs)) { > - WARN_ON(utask && > - (instruction_pointer(regs) != utask->xol_vaddr + 4)); > - > - if (uprobe_post_sstep_notifier(regs)) > - return DBG_HOOK_HANDLED; > - } > + WARN_ON(utask && (instruction_pointer(regs) != utask->xol_vaddr + 4)); > + if (uprobe_post_sstep_notifier(regs)) > + return DBG_HOOK_HANDLED; > > return DBG_HOOK_ERROR; > } > diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c > index 4be52bdcede6..3bcd56dd94fa 100644 > --- a/arch/arm64/kernel/traps.c > +++ b/arch/arm64/kernel/traps.c > @@ -943,9 +943,6 @@ int is_valid_bugaddr(unsigned long addr) > > static int bug_handler(struct pt_regs *regs, unsigned int esr) > { > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > switch (report_bug(regs->pc, regs)) { > case BUG_TRAP_TYPE_BUG: > die("Oops - BUG", regs, 0); > @@ -984,9 +981,6 @@ static int kasan_handler(struct pt_regs *regs, unsigned int esr) > u64 addr = regs->regs[0]; > u64 pc = regs->pc; > > - if (user_mode(regs)) > - return DBG_HOOK_ERROR; > - > kasan_report(addr, size, write, pc); > > /* > -- > 2.11.0 >
diff --git a/arch/arm64/kernel/kgdb.c b/arch/arm64/kernel/kgdb.c index 4c01f299aeb2..30853d5b7859 100644 --- a/arch/arm64/kernel/kgdb.c +++ b/arch/arm64/kernel/kgdb.c @@ -244,9 +244,6 @@ int kgdb_arch_handle_exception(int exception_vector, int signo, static int kgdb_brk_fn(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs)) - return DBG_HOOK_ERROR; - kgdb_handle_exception(1, SIGTRAP, 0, regs); return DBG_HOOK_HANDLED; } @@ -254,9 +251,6 @@ NOKPROBE_SYMBOL(kgdb_brk_fn) static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs)) - return DBG_HOOK_ERROR; - compiled_break = 1; kgdb_handle_exception(1, SIGTRAP, 0, regs); @@ -266,7 +260,7 @@ NOKPROBE_SYMBOL(kgdb_compiled_brk_fn); static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs) || !kgdb_single_step) + if (!kgdb_single_step) return DBG_HOOK_ERROR; kgdb_handle_exception(1, SIGTRAP, 0, regs); diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c index 3066ffd70cf5..30502a3c8cf0 100644 --- a/arch/arm64/kernel/probes/kprobes.c +++ b/arch/arm64/kernel/probes/kprobes.c @@ -450,9 +450,6 @@ kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr) struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); int retval; - if (user_mode(regs)) - return DBG_HOOK_ERROR; - /* return error if this is not our step */ retval = kprobe_ss_hit(kcb, instruction_pointer(regs)); @@ -473,9 +470,6 @@ static struct step_hook kprobes_step_hook = { static int __kprobes kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs)) - return DBG_HOOK_ERROR; - kprobe_handler(regs); return DBG_HOOK_HANDLED; } diff --git a/arch/arm64/kernel/probes/uprobes.c b/arch/arm64/kernel/probes/uprobes.c index 7d6ea88796a6..f37ab9567676 100644 --- a/arch/arm64/kernel/probes/uprobes.c +++ b/arch/arm64/kernel/probes/uprobes.c @@ -171,7 +171,7 @@ int arch_uprobe_exception_notify(struct notifier_block *self, static int uprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs) && uprobe_pre_sstep_notifier(regs)) + if (uprobe_pre_sstep_notifier(regs)) return DBG_HOOK_HANDLED; return DBG_HOOK_ERROR; @@ -182,13 +182,9 @@ static int uprobe_single_step_handler(struct pt_regs *regs, { struct uprobe_task *utask = current->utask; - if (user_mode(regs)) { - WARN_ON(utask && - (instruction_pointer(regs) != utask->xol_vaddr + 4)); - - if (uprobe_post_sstep_notifier(regs)) - return DBG_HOOK_HANDLED; - } + WARN_ON(utask && (instruction_pointer(regs) != utask->xol_vaddr + 4)); + if (uprobe_post_sstep_notifier(regs)) + return DBG_HOOK_HANDLED; return DBG_HOOK_ERROR; } diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 4be52bdcede6..3bcd56dd94fa 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -943,9 +943,6 @@ int is_valid_bugaddr(unsigned long addr) static int bug_handler(struct pt_regs *regs, unsigned int esr) { - if (user_mode(regs)) - return DBG_HOOK_ERROR; - switch (report_bug(regs->pc, regs)) { case BUG_TRAP_TYPE_BUG: die("Oops - BUG", regs, 0); @@ -984,9 +981,6 @@ static int kasan_handler(struct pt_regs *regs, unsigned int esr) u64 addr = regs->regs[0]; u64 pc = regs->pc; - if (user_mode(regs)) - return DBG_HOOK_ERROR; - kasan_report(addr, size, write, pc); /*
Now that the debug hook dispatching code takes the triggering exception level into account, there's no need for the hooks themselves to poke around with user_mode(regs). Signed-off-by: Will Deacon <will.deacon@arm.com> --- arch/arm64/kernel/kgdb.c | 8 +------- arch/arm64/kernel/probes/kprobes.c | 6 ------ arch/arm64/kernel/probes/uprobes.c | 12 ++++-------- arch/arm64/kernel/traps.c | 6 ------ 4 files changed, 5 insertions(+), 27 deletions(-)