|
|
@@ -827,11 +827,12 @@ void __init hook_debug_fault_code(int nr,
|
|
|
debug_fault_info[nr].name = name;
|
|
|
}
|
|
|
|
|
|
-asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
|
+asmlinkage int __exception do_debug_exception(unsigned long addr_if_watchpoint,
|
|
|
unsigned int esr,
|
|
|
struct pt_regs *regs)
|
|
|
{
|
|
|
const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr);
|
|
|
+ unsigned long pc = instruction_pointer(regs);
|
|
|
int rv;
|
|
|
|
|
|
/*
|
|
|
@@ -841,10 +842,10 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
|
if (interrupts_enabled(regs))
|
|
|
trace_hardirqs_off();
|
|
|
|
|
|
- if (user_mode(regs) && instruction_pointer(regs) > TASK_SIZE)
|
|
|
+ if (user_mode(regs) && pc > TASK_SIZE)
|
|
|
arm64_apply_bp_hardening();
|
|
|
|
|
|
- if (!inf->fn(addr, esr, regs)) {
|
|
|
+ if (!inf->fn(addr_if_watchpoint, esr, regs)) {
|
|
|
rv = 1;
|
|
|
} else {
|
|
|
struct siginfo info;
|
|
|
@@ -853,7 +854,7 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
|
info.si_signo = inf->sig;
|
|
|
info.si_errno = 0;
|
|
|
info.si_code = inf->code;
|
|
|
- info.si_addr = (void __user *)addr;
|
|
|
+ info.si_addr = (void __user *)pc;
|
|
|
arm64_notify_die(inf->name, regs, &info, esr);
|
|
|
rv = 0;
|
|
|
}
|