aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64
diff options
context:
space:
mode:
authorAKASHI Takahiro <takahiro.akashi@linaro.org>2014-11-28 00:26:38 -0500
committerWill Deacon <will.deacon@arm.com>2014-11-28 05:24:59 -0500
commitcc5e9097c9aad6b186a568c534e26746d6bfa483 (patch)
tree2136fca62197665c6740bfac8f35a4d4841efb9c /arch/arm64
parente185fab7e13087cbd1f7e281d2698f07dbcdd44e (diff)
arm64: add SIGSYS siginfo for compat task
SIGSYS is primarily used in secure computing to notify tracer of syscall events. This patch allows signal handler on compat task to get correct information with SA_SIGINFO specified when this signal is delivered. Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64')
-rw-r--r--arch/arm64/include/asm/compat.h7
-rw-r--r--arch/arm64/kernel/signal32.c6
2 files changed, 13 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h
index 56de5aadede2..3fb053fa6e98 100644
--- a/arch/arm64/include/asm/compat.h
+++ b/arch/arm64/include/asm/compat.h
@@ -205,6 +205,13 @@ typedef struct compat_siginfo {
205 compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */ 205 compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */
206 int _fd; 206 int _fd;
207 } _sigpoll; 207 } _sigpoll;
208
209 /* SIGSYS */
210 struct {
211 compat_uptr_t _call_addr; /* calling user insn */
212 int _syscall; /* triggering system call number */
213 compat_uint_t _arch; /* AUDIT_ARCH_* of syscall */
214 } _sigsys;
208 } _sifields; 215 } _sifields;
209} compat_siginfo_t; 216} compat_siginfo_t;
210 217
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index 1b9ad02837cf..5a1ba6e80d4e 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -186,6 +186,12 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
186 err |= __put_user(from->si_uid, &to->si_uid); 186 err |= __put_user(from->si_uid, &to->si_uid);
187 err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr); 187 err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr);
188 break; 188 break;
189 case __SI_SYS:
190 err |= __put_user((compat_uptr_t)(unsigned long)
191 from->si_call_addr, &to->si_call_addr);
192 err |= __put_user(from->si_syscall, &to->si_syscall);
193 err |= __put_user(from->si_arch, &to->si_arch);
194 break;
189 default: /* this is just in case for now ... */ 195 default: /* this is just in case for now ... */
190 err |= __put_user(from->si_pid, &to->si_pid); 196 err |= __put_user(from->si_pid, &to->si_pid);
191 err |= __put_user(from->si_uid, &to->si_uid); 197 err |= __put_user(from->si_uid, &to->si_uid);