diff options
| -rw-r--r-- | arch/arm/mm/alignment.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 1df38e833570..cfbcf8b95599 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/uaccess.h> | 23 | #include <linux/uaccess.h> |
| 24 | 24 | ||
| 25 | #include <asm/system.h> | ||
| 25 | #include <asm/unaligned.h> | 26 | #include <asm/unaligned.h> |
| 26 | 27 | ||
| 27 | #include "fault.h" | 28 | #include "fault.h" |
| @@ -913,9 +914,16 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
| 913 | if (ai_usermode & UM_FIXUP) | 914 | if (ai_usermode & UM_FIXUP) |
| 914 | goto fixup; | 915 | goto fixup; |
| 915 | 916 | ||
| 916 | if (ai_usermode & UM_SIGNAL) | 917 | if (ai_usermode & UM_SIGNAL) { |
| 917 | force_sig(SIGBUS, current); | 918 | siginfo_t si; |
| 918 | else { | 919 | |
| 920 | si.si_signo = SIGBUS; | ||
| 921 | si.si_errno = 0; | ||
| 922 | si.si_code = BUS_ADRALN; | ||
| 923 | si.si_addr = (void __user *)addr; | ||
| 924 | |||
| 925 | force_sig_info(si.si_signo, &si, current); | ||
| 926 | } else { | ||
| 919 | /* | 927 | /* |
| 920 | * We're about to disable the alignment trap and return to | 928 | * We're about to disable the alignment trap and return to |
| 921 | * user space. But if an interrupt occurs before actually | 929 | * user space. But if an interrupt occurs before actually |
