arm64: add SIGSYS siginfo for compat task
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Thu, 4 Sep 2014 14:48:01 +0000 (15:48 +0100)
committerJP Abgrall <jpa@google.com>
Tue, 7 Oct 2014 22:31:24 +0000 (15:31 -0700)
Note: This patch is from v6 of Takahiro's proposed
"arm64: add seccomp support" patchset (leecam@google.com)

SIGSYS is primarily used in secure computing to notify tracer.
This patch allows signal handler on compat task to get correct information
with SA_SYSINFO specified when this signal is delivered.

Signed-off-by: AKASHI Takahiro <takahiro.akashi <at> linaro.org>
arch/arm64/include/asm/compat.h
arch/arm64/kernel/signal32.c

index ae0004fe6c230b354187a77b44981001763a889b..a79da08994f2fa8d8503a0a5ab8cc628abde52fd 100644 (file)
@@ -191,6 +191,13 @@ typedef struct compat_siginfo {
                        compat_long_t _band;    /* POLL_IN, POLL_OUT, POLL_MSG */
                        int _fd;
                } _sigpoll;
+
+               /* SIGSYS */
+               struct {
+                       compat_uptr_t _call_addr; /* calling user insn */
+                       int _syscall;   /* triggering system call number */
+                       unsigned int _arch;     /* AUDIT_ARCH_* of syscall */
+               } _sigsys;
        } _sifields;
 } compat_siginfo_t;
 
index b4692837e7ab5db508048d7abb5c02b22d66ba95..e1b8b9fb274ebc4050254ace826c49760e8c3689 100644 (file)
@@ -211,6 +211,14 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
                err |= __put_user(from->si_uid, &to->si_uid);
                err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr);
                break;
+#ifdef __ARCH_SIGSYS
+       case __SI_SYS:
+               err |= __put_user((compat_uptr_t)(unsigned long)
+                               from->si_call_addr, &to->si_call_addr);
+               err |= __put_user(from->si_syscall, &to->si_syscall);
+               err |= __put_user(from->si_arch, &to->si_arch);
+               break;
+#endif
        default: /* this is just in case for now ... */
                err |= __put_user(from->si_pid, &to->si_pid);
                err |= __put_user(from->si_uid, &to->si_uid);