|
@@ -843,7 +843,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
|
|
|
|
|
void alignment_exception(struct pt_regs *regs)
|
|
|
{
|
|
|
- int fixed = 0;
|
|
|
+ int sig, code, fixed = 0;
|
|
|
|
|
|
/* we don't implement logging of alignment exceptions */
|
|
|
if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))
|
|
@@ -857,14 +857,16 @@ void alignment_exception(struct pt_regs *regs)
|
|
|
|
|
|
/* Operand address was bad */
|
|
|
if (fixed == -EFAULT) {
|
|
|
- if (user_mode(regs))
|
|
|
- _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar);
|
|
|
- else
|
|
|
- /* Search exception table */
|
|
|
- bad_page_fault(regs, regs->dar, SIGSEGV);
|
|
|
- return;
|
|
|
+ sig = SIGSEGV;
|
|
|
+ code = SEGV_ACCERR;
|
|
|
+ } else {
|
|
|
+ sig = SIGBUS;
|
|
|
+ code = BUS_ADRALN;
|
|
|
}
|
|
|
- _exception(SIGBUS, regs, BUS_ADRALN, regs->dar);
|
|
|
+ if (user_mode(regs))
|
|
|
+ _exception(sig, regs, code, regs->dar);
|
|
|
+ else
|
|
|
+ bad_page_fault(regs, regs->dar, sig);
|
|
|
}
|
|
|
|
|
|
void StackOverflow(struct pt_regs *regs)
|