aboutsummaryrefslogtreecommitdiffstats
path: root/arch/parisc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 21:50:11 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-23 21:50:11 -0500
commit9e2d59ad580d590134285f361a0e80f0e98c0207 (patch)
treef3232be75781484193413f32ec82c21f6d8eb76e /arch/parisc
parent5ce1a70e2f00f0bce0cab57f798ca354b9496169 (diff)
parent235b80226b986dabcbba844968f7807866bd0bfe (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal handling cleanups from Al Viro: "This is the first pile; another one will come a bit later and will contain SYSCALL_DEFINE-related patches. - a bunch of signal-related syscalls (both native and compat) unified. - a bunch of compat syscalls switched to COMPAT_SYSCALL_DEFINE (fixing several potential problems with missing argument validation, while we are at it) - a lot of now-pointless wrappers killed - a couple of architectures (cris and hexagon) forgot to save altstack settings into sigframe, even though they used the (uninitialized) values in sigreturn; fixed. - microblaze fixes for delivery of multiple signals arriving at once - saner set of helpers for signal delivery introduced, several architectures switched to using those." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (143 commits) x86: convert to ksignal sparc: convert to ksignal arm: switch to struct ksignal * passing alpha: pass k_sigaction and siginfo_t using ksignal pointer burying unused conditionals make do_sigaltstack() static arm64: switch to generic old sigaction() (compat-only) arm64: switch to generic compat rt_sigaction() arm64: switch compat to generic old sigsuspend arm64: switch to generic compat rt_sigqueueinfo() arm64: switch to generic compat rt_sigpending() arm64: switch to generic compat rt_sigprocmask() arm64: switch to generic sigaltstack sparc: switch to generic old sigsuspend sparc: COMPAT_SYSCALL_DEFINE does all sign-extension as well as SYSCALL_DEFINE sparc: kill sign-extending wrappers for native syscalls kill sparc32_open() sparc: switch to use of generic old sigaction sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE mips: switch to generic sys_fork() and sys_clone() ...
Diffstat (limited to 'arch/parisc')
-rw-r--r--arch/parisc/include/asm/signal.h6
-rw-r--r--arch/parisc/include/asm/unistd.h3
-rw-r--r--arch/parisc/kernel/entry.S38
-rw-r--r--arch/parisc/kernel/signal.c19
-rw-r--r--arch/parisc/kernel/signal32.c149
-rw-r--r--arch/parisc/kernel/signal32.h23
-rw-r--r--arch/parisc/kernel/sys32.h12
-rw-r--r--arch/parisc/kernel/syscall_table.S8
8 files changed, 10 insertions, 248 deletions
diff --git a/arch/parisc/include/asm/signal.h b/arch/parisc/include/asm/signal.h
index b1a7c4c4a53a..81a545773971 100644
--- a/arch/parisc/include/asm/signal.h
+++ b/arch/parisc/include/asm/signal.h
@@ -20,15 +20,13 @@ typedef struct {
20 unsigned long sig[_NSIG_WORDS]; 20 unsigned long sig[_NSIG_WORDS];
21} sigset_t; 21} sigset_t;
22 22
23#ifndef __KERNEL__
23struct sigaction { 24struct sigaction {
24 __sighandler_t sa_handler; 25 __sighandler_t sa_handler;
25 unsigned long sa_flags; 26 unsigned long sa_flags;
26 sigset_t sa_mask; /* mask last for extensibility */ 27 sigset_t sa_mask; /* mask last for extensibility */
27}; 28};
28 29#endif
29struct k_sigaction {
30 struct sigaction sa;
31};
32 30
33#include <asm/sigcontext.h> 31#include <asm/sigcontext.h>
34 32
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h
index 74f801ebbe77..ae9a46cbfd92 100644
--- a/arch/parisc/include/asm/unistd.h
+++ b/arch/parisc/include/asm/unistd.h
@@ -161,9 +161,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
161#define __ARCH_WANT_SYS_OLDUMOUNT 161#define __ARCH_WANT_SYS_OLDUMOUNT
162#define __ARCH_WANT_SYS_SIGPENDING 162#define __ARCH_WANT_SYS_SIGPENDING
163#define __ARCH_WANT_SYS_SIGPROCMASK 163#define __ARCH_WANT_SYS_SIGPROCMASK
164#define __ARCH_WANT_SYS_RT_SIGACTION
165#define __ARCH_WANT_SYS_RT_SIGSUSPEND
166#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
167#define __ARCH_WANT_SYS_FORK 164#define __ARCH_WANT_SYS_FORK
168#define __ARCH_WANT_SYS_VFORK 165#define __ARCH_WANT_SYS_VFORK
169#define __ARCH_WANT_SYS_CLONE 166#define __ARCH_WANT_SYS_CLONE
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index 7c9648919c91..f33201bf8977 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -1748,44 +1748,6 @@ ENTRY(sys_rt_sigreturn_wrapper)
1748 LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ 1748 LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */
1749ENDPROC(sys_rt_sigreturn_wrapper) 1749ENDPROC(sys_rt_sigreturn_wrapper)
1750 1750
1751ENTRY(sys_sigaltstack_wrapper)
1752 /* Get the user stack pointer */
1753 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
1754 ldo TASK_REGS(%r1),%r24 /* get pt regs */
1755 LDREG TASK_PT_GR30(%r24),%r24
1756 STREG %r2, -RP_OFFSET(%r30)
1757#ifdef CONFIG_64BIT
1758 ldo FRAME_SIZE(%r30), %r30
1759 BL do_sigaltstack,%r2
1760 ldo -16(%r30),%r29 /* Reference param save area */
1761#else
1762 BL do_sigaltstack,%r2
1763 ldo FRAME_SIZE(%r30), %r30
1764#endif
1765
1766 ldo -FRAME_SIZE(%r30), %r30
1767 LDREG -RP_OFFSET(%r30), %r2
1768 bv %r0(%r2)
1769 nop
1770ENDPROC(sys_sigaltstack_wrapper)
1771
1772#ifdef CONFIG_64BIT
1773ENTRY(sys32_sigaltstack_wrapper)
1774 /* Get the user stack pointer */
1775 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24
1776 LDREG TASK_PT_GR30(%r24),%r24
1777 STREG %r2, -RP_OFFSET(%r30)
1778 ldo FRAME_SIZE(%r30), %r30
1779 BL do_sigaltstack32,%r2
1780 ldo -16(%r30),%r29 /* Reference param save area */
1781
1782 ldo -FRAME_SIZE(%r30), %r30
1783 LDREG -RP_OFFSET(%r30), %r2
1784 bv %r0(%r2)
1785 nop
1786ENDPROC(sys32_sigaltstack_wrapper)
1787#endif
1788
1789ENTRY(syscall_exit) 1751ENTRY(syscall_exit)
1790 /* NOTE: HP-UX syscalls also come through here 1752 /* NOTE: HP-UX syscalls also come through here
1791 * after hpux_syscall_exit fixes up return 1753 * after hpux_syscall_exit fixes up return
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 52c85b2f502e..98e9e7126565 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -143,7 +143,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
143 goto give_sigsegv; 143 goto give_sigsegv;
144 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 144 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
145 usp, &compat_frame->uc.uc_stack); 145 usp, &compat_frame->uc.uc_stack);
146 if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT) 146 if (compat_restore_altstack(&compat_frame->uc.uc_stack))
147 goto give_sigsegv; 147 goto give_sigsegv;
148 } else 148 } else
149#endif 149#endif
@@ -154,7 +154,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
154 goto give_sigsegv; 154 goto give_sigsegv;
155 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 155 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n",
156 usp, &frame->uc.uc_stack); 156 usp, &frame->uc.uc_stack);
157 if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT) 157 if (restore_altstack(&frame->uc.uc_stack))
158 goto give_sigsegv; 158 goto give_sigsegv;
159 } 159 }
160 160
@@ -262,15 +262,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
262 if (is_compat_task()) { 262 if (is_compat_task()) {
263 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); 263 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
264 err |= copy_siginfo_to_user32(&compat_frame->info, info); 264 err |= copy_siginfo_to_user32(&compat_frame->info, info);
265 DBG(1,"SETUP_RT_FRAME: 1\n"); 265 err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
266 compat_val = (compat_int_t)current->sas_ss_sp;
267 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
268 DBG(1,"SETUP_RT_FRAME: 2\n");
269 compat_val = (compat_int_t)current->sas_ss_size;
270 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
271 DBG(1,"SETUP_RT_FRAME: 3\n");
272 compat_val = sas_ss_flags(regs->gr[30]);
273 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);
274 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc); 266 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
275 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext); 267 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
276 err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 268 err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
@@ -282,10 +274,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
282 { 274 {
283 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info); 275 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
284 err |= copy_siginfo_to_user(&frame->info, info); 276 err |= copy_siginfo_to_user(&frame->info, info);
285 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 277 err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
286 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
287 err |= __put_user(sas_ss_flags(regs->gr[30]),
288 &frame->uc.uc_stack.ss_flags);
289 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc); 278 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
290 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext); 279 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
291 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall); 280 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c
index 2ddcabb616ce..33eca1b04926 100644
--- a/arch/parisc/kernel/signal32.c
+++ b/arch/parisc/kernel/signal32.c
@@ -60,136 +60,6 @@ sigset_64to32(compat_sigset_t *s32, sigset_t *s64)
60 s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL; 60 s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL;
61} 61}
62 62
63static int
64put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
65{
66 compat_sigset_t s;
67
68 if (sz != sizeof(compat_sigset_t))
69 return -EINVAL;
70 sigset_64to32(&s, set);
71
72 return copy_to_user(up, &s, sizeof s);
73}
74
75static int
76get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
77{
78 compat_sigset_t s;
79 int r;
80
81 if (sz != sizeof(compat_sigset_t))
82 return -EINVAL;
83
84 if ((r = copy_from_user(&s, up, sz)) == 0) {
85 sigset_32to64(set, &s);
86 }
87
88 return r;
89}
90
91int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset,
92 unsigned int sigsetsize)
93{
94 sigset_t old_set, new_set;
95 int ret;
96
97 if (set) {
98 ret = get_sigset32(set, &new_set, sigsetsize);
99 if (ret)
100 return ret;
101 }
102
103 KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL,
104 oset ? (sigset_t __user *)&old_set : NULL, sigsetsize);
105
106 if (!ret && oset && put_sigset32(oset, &old_set, sigsetsize))
107 return -EFAULT;
108
109 return ret;
110}
111
112
113int sys32_rt_sigpending(compat_sigset_t __user *uset, unsigned int sigsetsize)
114{
115 int ret;
116 sigset_t set;
117
118 KERNEL_SYSCALL(ret, sys_rt_sigpending, (sigset_t __user *)&set, sigsetsize);
119
120 if (!ret && put_sigset32(uset, &set, sigsetsize))
121 return -EFAULT;
122
123 return ret;
124}
125
126long
127sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigaction32 __user *oact,
128 size_t sigsetsize)
129{
130 struct k_sigaction32 new_sa32, old_sa32;
131 struct k_sigaction new_sa, old_sa;
132 int ret = -EINVAL;
133
134 /* XXX: Don't preclude handling different sized sigset_t's. */
135 if (sigsetsize != sizeof(compat_sigset_t))
136 return -EINVAL;
137
138 if (act) {
139 if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa))
140 return -EFAULT;
141 new_sa.sa.sa_handler = (__sighandler_t)(unsigned long)new_sa32.sa.sa_handler;
142 new_sa.sa.sa_flags = new_sa32.sa.sa_flags;
143 sigset_32to64(&new_sa.sa.sa_mask, &new_sa32.sa.sa_mask);
144 }
145
146 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
147
148 if (!ret && oact) {
149 sigset_64to32(&old_sa32.sa.sa_mask, &old_sa.sa.sa_mask);
150 old_sa32.sa.sa_flags = old_sa.sa.sa_flags;
151 old_sa32.sa.sa_handler = (__sighandler_t32)(unsigned long)old_sa.sa.sa_handler;
152 if (copy_to_user(oact, &old_sa32.sa, sizeof old_sa32.sa))
153 return -EFAULT;
154 }
155 return ret;
156}
157
158int
159do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp)
160{
161 compat_stack_t ss32, oss32;
162 stack_t ss, oss;
163 stack_t *ssp = NULL, *ossp = NULL;
164 int ret;
165
166 if (uss32) {
167 if (copy_from_user(&ss32, uss32, sizeof ss32))
168 return -EFAULT;
169
170 ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp;
171 ss.ss_flags = ss32.ss_flags;
172 ss.ss_size = ss32.ss_size;
173
174 ssp = &ss;
175 }
176
177 if (uoss32)
178 ossp = &oss;
179
180 KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp);
181
182 if (!ret && uoss32) {
183 oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp;
184 oss32.ss_flags = oss.ss_flags;
185 oss32.ss_size = oss.ss_size;
186 if (copy_to_user(uoss32, &oss32, sizeof *uoss32))
187 return -EFAULT;
188 }
189
190 return ret;
191}
192
193long 63long
194restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, 64restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf,
195 struct pt_regs *regs) 65 struct pt_regs *regs)
@@ -506,22 +376,3 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
506 } 376 }
507 return err; 377 return err;
508} 378}
509
510asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig,
511 struct compat_siginfo __user *uinfo)
512{
513 siginfo_t info;
514
515 if (copy_siginfo_from_user32(&info, uinfo))
516 return -EFAULT;
517
518 /* Not even root can pretend to send signals from the kernel.
519 Nor can they impersonate a kill(), which adds source info. */
520 if (info.si_code >= 0)
521 return -EPERM;
522 info.si_signo = sig;
523
524 /* POSIX.1b doesn't mention process groups. */
525 return kill_proc_info(sig, &info, pid);
526}
527
diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
index 08a88b5349a2..72ab41a51f32 100644
--- a/arch/parisc/kernel/signal32.h
+++ b/arch/parisc/kernel/signal32.h
@@ -21,23 +21,6 @@
21 21
22#include <linux/compat.h> 22#include <linux/compat.h>
23 23
24typedef compat_uptr_t compat_sighandler_t;
25
26typedef struct compat_sigaltstack {
27 compat_uptr_t ss_sp;
28 compat_int_t ss_flags;
29 compat_size_t ss_size;
30} compat_stack_t;
31
32/* Most things should be clean enough to redefine this at will, if care
33 is taken to make libc match. */
34
35struct compat_sigaction {
36 compat_sighandler_t sa_handler;
37 compat_uint_t sa_flags;
38 compat_sigset_t sa_mask; /* mask last for extensibility */
39};
40
41/* 32-bit ucontext as seen from an 64-bit kernel */ 24/* 32-bit ucontext as seen from an 64-bit kernel */
42struct compat_ucontext { 25struct compat_ucontext {
43 compat_uint_t uc_flags; 26 compat_uint_t uc_flags;
@@ -51,10 +34,6 @@ struct compat_ucontext {
51 34
52/* ELF32 signal handling */ 35/* ELF32 signal handling */
53 36
54struct k_sigaction32 {
55 struct compat_sigaction sa;
56};
57
58int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from); 37int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from);
59int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from); 38int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from);
60 39
@@ -102,8 +81,6 @@ struct compat_rt_sigframe {
102 81
103void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); 82void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
104void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); 83void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
105int do_sigaltstack32 (const compat_stack_t __user *uss32,
106 compat_stack_t __user *uoss32, unsigned long sp);
107long restore_sigcontext32(struct compat_sigcontext __user *sc, 84long restore_sigcontext32(struct compat_sigcontext __user *sc,
108 struct compat_regfile __user *rf, 85 struct compat_regfile __user *rf,
109 struct pt_regs *regs); 86 struct pt_regs *regs);
diff --git a/arch/parisc/kernel/sys32.h b/arch/parisc/kernel/sys32.h
index 06c2090cfaba..60dd470f39f8 100644
--- a/arch/parisc/kernel/sys32.h
+++ b/arch/parisc/kernel/sys32.h
@@ -33,16 +33,4 @@
33 set_fs (old_fs); \ 33 set_fs (old_fs); \
34} 34}
35 35
36#ifdef CONFIG_COMPAT
37
38typedef __u32 __sighandler_t32;
39
40struct sigaction32 {
41 __sighandler_t32 sa_handler;
42 unsigned int sa_flags;
43 compat_sigset_t sa_mask; /* mask last for extensibility */
44};
45
46#endif
47
48#endif 36#endif
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S
index 129fd472c471..fc9cab1cc2df 100644
--- a/arch/parisc/kernel/syscall_table.S
+++ b/arch/parisc/kernel/syscall_table.S
@@ -252,7 +252,7 @@
252 ENTRY_SAME(mremap) 252 ENTRY_SAME(mremap)
253 ENTRY_SAME(setresuid) 253 ENTRY_SAME(setresuid)
254 ENTRY_SAME(getresuid) /* 165 */ 254 ENTRY_SAME(getresuid) /* 165 */
255 ENTRY_DIFF(sigaltstack_wrapper) 255 ENTRY_COMP(sigaltstack)
256 ENTRY_SAME(ni_syscall) /* query_module */ 256 ENTRY_SAME(ni_syscall) /* query_module */
257 ENTRY_SAME(poll) 257 ENTRY_SAME(poll)
258 /* structs contain pointers and an in_addr... */ 258 /* structs contain pointers and an in_addr... */
@@ -262,9 +262,9 @@
262 ENTRY_SAME(prctl) 262 ENTRY_SAME(prctl)
263 /* signals need a careful review */ 263 /* signals need a careful review */
264 ENTRY_SAME(rt_sigreturn_wrapper) 264 ENTRY_SAME(rt_sigreturn_wrapper)
265 ENTRY_DIFF(rt_sigaction) 265 ENTRY_COMP(rt_sigaction)
266 ENTRY_DIFF(rt_sigprocmask) /* 175 */ 266 ENTRY_COMP(rt_sigprocmask) /* 175 */
267 ENTRY_DIFF(rt_sigpending) 267 ENTRY_COMP(rt_sigpending)
268 ENTRY_COMP(rt_sigtimedwait) 268 ENTRY_COMP(rt_sigtimedwait)
269 /* even though the struct siginfo_t is different, it appears like 269 /* even though the struct siginfo_t is different, it appears like
270 * all the paths use values which should be same wide and narrow. 270 * all the paths use values which should be same wide and narrow.