aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64
diff options
context:
space:
mode:
authorCatalin Marinas <catalin.marinas@arm.com>2013-09-16 10:19:27 -0400
committerCatalin Marinas <catalin.marinas@arm.com>2014-05-09 10:47:49 -0400
commit15af1942dd61ee236a48b3de14d6f31c0b9e8116 (patch)
treed4f0163789eff325e8fd5088a70592abc3186c14 /arch/arm64
parent0e0276d1e1dd063cd14ce377707970d0417a0792 (diff)
arm64: Expose ESR_EL1 information to user when SIGSEGV/SIGBUS
This information is useful for instruction emulators to detect read/write and access size without having to decode the faulting instruction. The current patch exports it via sigcontext (struct esr_context) and is only valid for SIGSEGV and SIGBUS. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r--arch/arm64/include/uapi/asm/sigcontext.h7
-rw-r--r--arch/arm64/kernel/signal.c10
2 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm64/include/uapi/asm/sigcontext.h b/arch/arm64/include/uapi/asm/sigcontext.h
index 690ad51cc901..b72cf405b3fe 100644
--- a/arch/arm64/include/uapi/asm/sigcontext.h
+++ b/arch/arm64/include/uapi/asm/sigcontext.h
@@ -53,5 +53,12 @@ struct fpsimd_context {
53 __uint128_t vregs[32]; 53 __uint128_t vregs[32];
54}; 54};
55 55
56/* ESR_EL1 context */
57#define ESR_MAGIC 0x45535201
58
59struct esr_context {
60 struct _aarch64_ctx head;
61 u64 esr;
62};
56 63
57#endif /* _UAPI__ASM_SIGCONTEXT_H */ 64#endif /* _UAPI__ASM_SIGCONTEXT_H */
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index 7ff2eee96c6b..dc2ab1b0ac0d 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -194,6 +194,16 @@ static int setup_sigframe(struct rt_sigframe __user *sf,
194 aux += sizeof(*fpsimd_ctx); 194 aux += sizeof(*fpsimd_ctx);
195 } 195 }
196 196
197 /* fault information, if valid */
198 if (current->thread.fault_code) {
199 struct esr_context *esr_ctx =
200 container_of(aux, struct esr_context, head);
201 __put_user_error(ESR_MAGIC, &esr_ctx->head.magic, err);
202 __put_user_error(sizeof(*esr_ctx), &esr_ctx->head.size, err);
203 __put_user_error(current->thread.fault_code, &esr_ctx->esr, err);
204 aux += sizeof(*esr_ctx);
205 }
206
197 /* set the "end" magic */ 207 /* set the "end" magic */
198 end = aux; 208 end = aux;
199 __put_user_error(0, &end->magic, err); 209 __put_user_error(0, &end->magic, err);