|
@@ -625,8 +625,8 @@ static int do_bad(unsigned long addr, unsigned int esr, struct pt_regs *regs)
|
|
|
|
|
|
static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs)
|
|
|
{
|
|
|
- struct siginfo info;
|
|
|
const struct fault_info *inf;
|
|
|
+ void __user *siaddr;
|
|
|
|
|
|
inf = esr_to_fault_info(esr);
|
|
|
|
|
@@ -645,15 +645,11 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs)
|
|
|
nmi_exit();
|
|
|
}
|
|
|
|
|
|
- clear_siginfo(&info);
|
|
|
- info.si_signo = inf->sig;
|
|
|
- info.si_errno = 0;
|
|
|
- info.si_code = inf->code;
|
|
|
if (esr & ESR_ELx_FnV)
|
|
|
- info.si_addr = NULL;
|
|
|
+ siaddr = NULL;
|
|
|
else
|
|
|
- info.si_addr = (void __user *)addr;
|
|
|
- arm64_notify_die(inf->name, regs, &info, esr);
|
|
|
+ siaddr = (void __user *)addr;
|
|
|
+ arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -734,7 +730,6 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
|
|
|
struct pt_regs *regs)
|
|
|
{
|
|
|
const struct fault_info *inf = esr_to_fault_info(esr);
|
|
|
- struct siginfo info;
|
|
|
|
|
|
if (!inf->fn(addr, esr, regs))
|
|
|
return;
|
|
@@ -745,12 +740,8 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
|
|
|
show_pte(addr);
|
|
|
}
|
|
|
|
|
|
- clear_siginfo(&info);
|
|
|
- info.si_signo = inf->sig;
|
|
|
- info.si_errno = 0;
|
|
|
- info.si_code = inf->code;
|
|
|
- info.si_addr = (void __user *)addr;
|
|
|
- arm64_notify_die(inf->name, regs, &info, esr);
|
|
|
+ arm64_notify_die(inf->name, regs,
|
|
|
+ inf->sig, inf->code, (void __user *)addr, esr);
|
|
|
}
|
|
|
|
|
|
asmlinkage void __exception do_el0_irq_bp_hardening(void)
|
|
@@ -780,20 +771,14 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
|
|
|
unsigned int esr,
|
|
|
struct pt_regs *regs)
|
|
|
{
|
|
|
- struct siginfo info;
|
|
|
-
|
|
|
if (user_mode(regs)) {
|
|
|
if (instruction_pointer(regs) > TASK_SIZE)
|
|
|
arm64_apply_bp_hardening();
|
|
|
local_irq_enable();
|
|
|
}
|
|
|
|
|
|
- clear_siginfo(&info);
|
|
|
- info.si_signo = SIGBUS;
|
|
|
- info.si_errno = 0;
|
|
|
- info.si_code = BUS_ADRALN;
|
|
|
- info.si_addr = (void __user *)addr;
|
|
|
- arm64_notify_die("SP/PC alignment exception", regs, &info, esr);
|
|
|
+ arm64_notify_die("SP/PC alignment exception", regs,
|
|
|
+ SIGBUS, BUS_ADRALN, (void __user *)addr, esr);
|
|
|
}
|
|
|
|
|
|
int __init early_brk64(unsigned long addr, unsigned int esr,
|
|
@@ -847,14 +832,8 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
|
|
if (!inf->fn(addr, esr, regs)) {
|
|
|
rv = 1;
|
|
|
} else {
|
|
|
- struct siginfo info;
|
|
|
-
|
|
|
- clear_siginfo(&info);
|
|
|
- info.si_signo = inf->sig;
|
|
|
- info.si_errno = 0;
|
|
|
- info.si_code = inf->code;
|
|
|
- info.si_addr = (void __user *)addr;
|
|
|
- arm64_notify_die(inf->name, regs, &info, esr);
|
|
|
+ arm64_notify_die(inf->name, regs,
|
|
|
+ inf->sig, inf->code, (void __user *)addr, esr);
|
|
|
rv = 0;
|
|
|
}
|
|
|
|