diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2014-04-06 18:04:12 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2014-05-09 10:47:47 -0400 |
commit | 9141300a5884b57cea6d32c4e3fd16a337cfc99a (patch) | |
tree | d717d0ae66c7458c922b885c689b9c192b0f4083 /arch/arm64/kernel/traps.c | |
parent | 6400111399e16a535231ebd76389c894ea1837ff (diff) |
arm64: Provide read/write fault information in compat signal handlers
For AArch32, bit 11 (WnR) of the FSR/ESR register is set when the fault
was caused by a write access and applications like Qemu rely on such
information being provided in sigcontext. This patch introduces the
ESR_EL1 tracking for the arm64 kernel faults and sets bit 11 accordingly
in compat sigcontext.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/kernel/traps.c')
-rw-r--r-- | arch/arm64/kernel/traps.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 7ffadddb645d..c43cfa9b8304 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c | |||
@@ -251,10 +251,13 @@ void die(const char *str, struct pt_regs *regs, int err) | |||
251 | void arm64_notify_die(const char *str, struct pt_regs *regs, | 251 | void arm64_notify_die(const char *str, struct pt_regs *regs, |
252 | struct siginfo *info, int err) | 252 | struct siginfo *info, int err) |
253 | { | 253 | { |
254 | if (user_mode(regs)) | 254 | if (user_mode(regs)) { |
255 | current->thread.fault_address = 0; | ||
256 | current->thread.fault_code = err; | ||
255 | force_sig_info(info->si_signo, info, current); | 257 | force_sig_info(info->si_signo, info, current); |
256 | else | 258 | } else { |
257 | die(str, regs, err); | 259 | die(str, regs, err); |
260 | } | ||
258 | } | 261 | } |
259 | 262 | ||
260 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | 263 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |