aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/ia32/ia32_signal.c4
-rw-r--r--arch/x86/include/asm/ia32.h6
-rw-r--r--include/asm-generic/siginfo.h22
-rw-r--r--kernel/signal.c9
4 files changed, 40 insertions, 1 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index a69245ba27e3..0b3f2354f6aa 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -67,6 +67,10 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
67 switch (from->si_code >> 16) { 67 switch (from->si_code >> 16) {
68 case __SI_FAULT >> 16: 68 case __SI_FAULT >> 16:
69 break; 69 break;
70 case __SI_SYS >> 16:
71 put_user_ex(from->si_syscall, &to->si_syscall);
72 put_user_ex(from->si_arch, &to->si_arch);
73 break;
70 case __SI_CHLD >> 16: 74 case __SI_CHLD >> 16:
71 if (ia32) { 75 if (ia32) {
72 put_user_ex(from->si_utime, &to->si_utime); 76 put_user_ex(from->si_utime, &to->si_utime);
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h
index ee52760549f0..b04cbdb138cd 100644
--- a/arch/x86/include/asm/ia32.h
+++ b/arch/x86/include/asm/ia32.h
@@ -144,6 +144,12 @@ typedef struct compat_siginfo {
144 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ 144 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
145 int _fd; 145 int _fd;
146 } _sigpoll; 146 } _sigpoll;
147
148 struct {
149 unsigned int _call_addr; /* calling insn */
150 int _syscall; /* triggering system call number */
151 unsigned int _arch; /* AUDIT_ARCH_* of syscall */
152 } _sigsys;
147 } _sifields; 153 } _sifields;
148} compat_siginfo_t; 154} compat_siginfo_t;
149 155
diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h
index 0dd4e87f6fba..31306f55eb02 100644
--- a/include/asm-generic/siginfo.h
+++ b/include/asm-generic/siginfo.h
@@ -90,9 +90,18 @@ typedef struct siginfo {
90 __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */ 90 __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
91 int _fd; 91 int _fd;
92 } _sigpoll; 92 } _sigpoll;
93
94 /* SIGSYS */
95 struct {
96 void __user *_call_addr; /* calling insn */
97 int _syscall; /* triggering system call number */
98 unsigned int _arch; /* AUDIT_ARCH_* of syscall */
99 } _sigsys;
93 } _sifields; 100 } _sifields;
94} siginfo_t; 101} siginfo_t;
95 102
103/* If the arch shares siginfo, then it has SIGSYS. */
104#define __ARCH_SIGSYS
96#endif 105#endif
97 106
98/* 107/*
@@ -116,6 +125,11 @@ typedef struct siginfo {
116#define si_addr_lsb _sifields._sigfault._addr_lsb 125#define si_addr_lsb _sifields._sigfault._addr_lsb
117#define si_band _sifields._sigpoll._band 126#define si_band _sifields._sigpoll._band
118#define si_fd _sifields._sigpoll._fd 127#define si_fd _sifields._sigpoll._fd
128#ifdef __ARCH_SIGSYS
129#define si_call_addr _sifields._sigsys._call_addr
130#define si_syscall _sifields._sigsys._syscall
131#define si_arch _sifields._sigsys._arch
132#endif
119 133
120#ifdef __KERNEL__ 134#ifdef __KERNEL__
121#define __SI_MASK 0xffff0000u 135#define __SI_MASK 0xffff0000u
@@ -126,6 +140,7 @@ typedef struct siginfo {
126#define __SI_CHLD (4 << 16) 140#define __SI_CHLD (4 << 16)
127#define __SI_RT (5 << 16) 141#define __SI_RT (5 << 16)
128#define __SI_MESGQ (6 << 16) 142#define __SI_MESGQ (6 << 16)
143#define __SI_SYS (7 << 16)
129#define __SI_CODE(T,N) ((T) | ((N) & 0xffff)) 144#define __SI_CODE(T,N) ((T) | ((N) & 0xffff))
130#else 145#else
131#define __SI_KILL 0 146#define __SI_KILL 0
@@ -135,6 +150,7 @@ typedef struct siginfo {
135#define __SI_CHLD 0 150#define __SI_CHLD 0
136#define __SI_RT 0 151#define __SI_RT 0
137#define __SI_MESGQ 0 152#define __SI_MESGQ 0
153#define __SI_SYS 0
138#define __SI_CODE(T,N) (N) 154#define __SI_CODE(T,N) (N)
139#endif 155#endif
140 156
@@ -232,6 +248,12 @@ typedef struct siginfo {
232#define NSIGPOLL 6 248#define NSIGPOLL 6
233 249
234/* 250/*
251 * SIGSYS si_codes
252 */
253#define SYS_SECCOMP (__SI_SYS|1) /* seccomp triggered */
254#define NSIGSYS 1
255
256/*
235 * sigevent definitions 257 * sigevent definitions
236 * 258 *
237 * It seems likely that SIGEV_THREAD will have to be handled from 259 * It seems likely that SIGEV_THREAD will have to be handled from
diff --git a/kernel/signal.c b/kernel/signal.c
index 17afcaf582d0..1a006b5d9d9d 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -160,7 +160,7 @@ void recalc_sigpending(void)
160 160
161#define SYNCHRONOUS_MASK \ 161#define SYNCHRONOUS_MASK \
162 (sigmask(SIGSEGV) | sigmask(SIGBUS) | sigmask(SIGILL) | \ 162 (sigmask(SIGSEGV) | sigmask(SIGBUS) | sigmask(SIGILL) | \
163 sigmask(SIGTRAP) | sigmask(SIGFPE)) 163 sigmask(SIGTRAP) | sigmask(SIGFPE) | sigmask(SIGSYS))
164 164
165int next_signal(struct sigpending *pending, sigset_t *mask) 165int next_signal(struct sigpending *pending, sigset_t *mask)
166{ 166{
@@ -2706,6 +2706,13 @@ int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from)
2706 err |= __put_user(from->si_uid, &to->si_uid); 2706 err |= __put_user(from->si_uid, &to->si_uid);
2707 err |= __put_user(from->si_ptr, &to->si_ptr); 2707 err |= __put_user(from->si_ptr, &to->si_ptr);
2708 break; 2708 break;
2709#ifdef __ARCH_SIGSYS
2710 case __SI_SYS:
2711 err |= __put_user(from->si_call_addr, &to->si_call_addr);
2712 err |= __put_user(from->si_syscall, &to->si_syscall);
2713 err |= __put_user(from->si_arch, &to->si_arch);
2714 break;
2715#endif
2709 default: /* this is just in case for now ... */ 2716 default: /* this is just in case for now ... */
2710 err |= __put_user(from->si_pid, &to->si_pid); 2717 err |= __put_user(from->si_pid, &to->si_pid);
2711 err |= __put_user(from->si_uid, &to->si_uid); 2718 err |= __put_user(from->si_uid, &to->si_uid);