From 96c935cba0071f70eaa8ceffce991d46c6f1a0f1 Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Tue, 15 Oct 2002 03:44:31 -0700 Subject: [SPARC]: Move over to generic siginfo. --- include/asm-generic/siginfo.h | 28 ++++++++++++++--- include/asm-sparc/siginfo.h | 71 ++---------------------------------------- include/asm-sparc64/siginfo.h | 72 ++----------------------------------------- 3 files changed, 27 insertions(+), 144 deletions(-) (limited to 'include') diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index 8e6f81b7a524..f246b2a15eb5 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h @@ -8,9 +8,21 @@ typedef union sigval { void *sival_ptr; } sigval_t; +/* + * This is the size (including padding) of the part of the + * struct siginfo that is before the union. + */ +#ifndef __ARCH_SI_PREAMBLE_SIZE +#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int)) +#endif + #define SI_MAX_SIZE 128 #ifndef SI_PAD_SIZE -#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3) +#define SI_PAD_SIZE ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int)) +#endif + +#ifndef __ARCH_SI_UID_T +#define __ARCH_SI_UID_T uid_t #endif #ifndef HAVE_ARCH_SIGINFO_T @@ -26,7 +38,7 @@ typedef struct siginfo { /* kill() */ struct { pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ + __ARCH_SI_UID_T _uid; /* sender's uid */ } _kill; /* POSIX.1b timers */ @@ -38,14 +50,14 @@ typedef struct siginfo { /* POSIX.1b signals */ struct { pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ + __ARCH_SI_UID_T _uid; /* sender's uid */ sigval_t _sigval; } _rt; /* SIGCHLD */ struct { pid_t _pid; /* which child */ - uid_t _uid; /* sender's uid */ + __ARCH_SI_UID_T _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; @@ -54,6 +66,9 @@ typedef struct siginfo { /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ struct { void *_addr; /* faulting insn/memory ref. */ +#ifdef __ARCH_SI_TRAPNO + int _trapno; /* TRAP # which caused the signal */ +#endif } _sigfault; /* SIGPOLL */ @@ -80,6 +95,9 @@ typedef struct siginfo { #define si_int _sifields._rt._sigval.sival_int #define si_ptr _sifields._rt._sigval.sival_ptr #define si_addr _sifields._sigfault._addr +#ifdef __ARCH_SI_TRAPNO +#define si_trapno _sifields._sigfault._trapno +#endif #define si_band _sifields._sigpoll._band #define si_fd _sifields._sigpoll._fd @@ -244,7 +262,7 @@ static inline void copy_siginfo(struct siginfo *to, struct siginfo *from) memcpy(to, from, sizeof(*to)); else /* _sigchld is currently the largest know union member */ - memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld)); + memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld)); } #endif diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h index b5127b06416f..849af17a3e08 100644 --- a/include/asm-sparc/siginfo.h +++ b/include/asm-sparc/siginfo.h @@ -5,64 +5,12 @@ #ifndef _SPARC_SIGINFO_H #define _SPARC_SIGINFO_H -#define HAVE_ARCH_SIGINFO_T -#define HAVE_ARCH_COPY_SIGINFO +#define __ARCH_SI_UID_T unsigned int +#define __ARCH_SI_TRAPNO #define HAVE_ARCH_COPY_SIGINFO_TO_USER #include -typedef struct siginfo { - int si_signo; - int si_errno; - int si_code; - - union { - int _pad[SI_PAD_SIZE]; - - /* kill() */ - struct { - pid_t _pid; /* sender's pid */ - unsigned int _uid; /* sender's uid */ - } _kill; - - /* POSIX.1b timers */ - struct { - unsigned int _timer1; - unsigned int _timer2; - } _timer; - - /* POSIX.1b signals */ - struct { - pid_t _pid; /* sender's pid */ - unsigned int _uid; /* sender's uid */ - sigval_t _sigval; - } _rt; - - /* SIGCHLD */ - struct { - pid_t _pid; /* which child */ - unsigned int _uid; /* sender's uid */ - int _status; /* exit code */ - clock_t _utime; - clock_t _stime; - } _sigchld; - - /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */ - struct { - void *_addr; /* faulting insn/memory ref. */ - int _trapno; /* TRAP # which caused the signal */ - } _sigfault; - - /* SIGPOLL */ - struct { - int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ - int _fd; - } _sigpoll; - } _sifields; -} siginfo_t; - -#define si_trapno _sifields._sigfault._trapno - #define SI_NOINFO 32767 /* no information in siginfo_t */ /* @@ -71,19 +19,4 @@ typedef struct siginfo { #define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */ #define NSIGEMT 1 -#ifdef __KERNEL__ - -#include - -extern inline void copy_siginfo(siginfo_t *to, siginfo_t *from) -{ - if (from->si_code < 0) - *to = *from; - else - /* _sigchld is currently the largest know union member */ - memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld)); -} - -#endif /* __KERNEL__ */ - #endif /* !(_SPARC_SIGINFO_H) */ diff --git a/include/asm-sparc64/siginfo.h b/include/asm-sparc64/siginfo.h index f8d1959ea8dc..dc566189b133 100644 --- a/include/asm-sparc64/siginfo.h +++ b/include/asm-sparc64/siginfo.h @@ -1,14 +1,13 @@ #ifndef _SPARC64_SIGINFO_H #define _SPARC64_SIGINFO_H -#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 4) #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3) #define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 4) #define SIGEV_PAD_SIZE32 ((SIGEV_MAX_SIZE/sizeof(int)) - 3) -#define HAVE_ARCH_SIGINFO_T -#define HAVE_ARCH_COPY_SIGINFO +#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +#define __ARCH_SI_TRAPNO #define HAVE_ARCH_COPY_SIGINFO_TO_USER #include @@ -20,60 +19,6 @@ typedef union sigval32 { u32 sival_ptr; } sigval_t32; -#endif /* __KERNEL__ */ - -typedef struct siginfo { - int si_signo; - int si_errno; - int si_code; - - union { - int _pad[SI_PAD_SIZE]; - - /* kill() */ - struct { - pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ - } _kill; - - /* POSIX.1b timers */ - struct { - unsigned int _timer1; - unsigned int _timer2; - } _timer; - - /* POSIX.1b signals */ - struct { - pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ - sigval_t _sigval; - } _rt; - - /* SIGCHLD */ - struct { - pid_t _pid; /* which child */ - uid_t _uid; /* sender's uid */ - int _status; /* exit code */ - clock_t _utime; - clock_t _stime; - } _sigchld; - - /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */ - struct { - void *_addr; /* faulting insn/memory ref. */ - int _trapno; /* TRAP # which caused the signal */ - } _sigfault; - - /* SIGPOLL */ - struct { - long _band; /* POLL_IN, POLL_OUT, POLL_MSG */ - int _fd; - } _sigpoll; - } _sifields; -} siginfo_t; - -#ifdef __KERNEL__ - typedef struct siginfo32 { int si_signo; int si_errno; @@ -126,8 +71,6 @@ typedef struct siginfo32 { #endif /* __KERNEL__ */ -#define si_trapno _sifields._sigfault._trapno - #define SI_NOINFO 32767 /* no information in siginfo_t */ /* @@ -152,17 +95,6 @@ typedef struct sigevent32 { } _sigev_un; } sigevent_t32; -#include - -static inline void copy_siginfo(siginfo_t *to, siginfo_t *from) -{ - if (from->si_code < 0) - *to = *from; - else - /* _sigchld is currently the largest know union member */ - memcpy(to, from, 4*sizeof(int) + sizeof(from->_sifields._sigchld)); -} - extern int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from); #endif /* __KERNEL__ */ -- cgit v1.2.3 From 130f7f9246884c8cbe92e68c54370a515482df10 Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Tue, 15 Oct 2002 03:46:12 -0700 Subject: [SPARC]: arch specific copy_siginfo_to_user no longer needed. --- arch/sparc/kernel/signal.c | 32 -------------------------------- arch/sparc64/kernel/signal.c | 32 -------------------------------- include/asm-sparc/siginfo.h | 1 - include/asm-sparc64/siginfo.h | 1 - kernel/signal.c | 3 +++ 5 files changed, 3 insertions(+), 66 deletions(-) (limited to 'include') diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c index 978cd2af2193..1b321429d7f6 100644 --- a/arch/sparc/kernel/signal.c +++ b/arch/sparc/kernel/signal.c @@ -90,38 +90,6 @@ struct rt_signal_frame { __siginfo_fpu_t fpu_state; }; -int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) -{ - if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t))) - return -EFAULT; - if (from->si_code < 0) - return __copy_to_user(to, from, sizeof(siginfo_t)); - else { - int err; - - /* If you change siginfo_t structure, please be sure - this code is fixed accordingly. - It should never copy any pad contained in the structure - to avoid security leaks, but must copy the generic - 3 ints plus the relevant union member. */ - err = __put_user(from->si_signo, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - switch (from->si_code >> 16) { - case __SI_CHLD >> 16: - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - /* case __SI_RT: This is not generated by the kernel as of now. */ - err |= __put_user(from->si_status, &to->si_status); - default: - err |= __put_user(from->si_uid, &to->si_uid); - err |= __put_user(from->si_pid, &to->si_pid); - break; - } - return err; - } -} - /* Align macros */ #define SF_ALIGNEDSZ (((sizeof(struct signal_sframe) + 7) & (~7))) #define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7))) diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 549184add483..00a208b72338 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c @@ -36,38 +36,6 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs, unsigned long orig_o0, int ret_from_syscall); -int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) -{ - if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t))) - return -EFAULT; - if (from->si_code < 0) - return __copy_to_user(to, from, sizeof(siginfo_t)); - else { - int err; - - /* If you change siginfo_t structure, please be sure - this code is fixed accordingly. - It should never copy any pad contained in the structure - to avoid security leaks, but must copy the generic - 3 ints plus the relevant union member. */ - err = __put_user(*(long *)&from->si_signo, (long *)&to->si_signo); - err |= __put_user((short)from->si_code, &to->si_code); - switch (from->si_code >> 16) { - case __SI_CHLD >> 16: - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - case __SI_FAULT >> 16: - case __SI_POLL >> 16: - err |= __put_user(from->si_trapno, &to->si_trapno); - default: - err |= __put_user(from->si_addr, &to->si_addr); - break; - /* case __SI_RT: This is not generated by the kernel as of now. */ - } - return err; - } -} - /* {set, get}context() needed for 64-bit SparcLinux userland. */ asmlinkage void sparc64_set_context(struct pt_regs *regs) { diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h index 849af17a3e08..2c3ea8b22448 100644 --- a/include/asm-sparc/siginfo.h +++ b/include/asm-sparc/siginfo.h @@ -7,7 +7,6 @@ #define __ARCH_SI_UID_T unsigned int #define __ARCH_SI_TRAPNO -#define HAVE_ARCH_COPY_SIGINFO_TO_USER #include diff --git a/include/asm-sparc64/siginfo.h b/include/asm-sparc64/siginfo.h index dc566189b133..f4bb94656634 100644 --- a/include/asm-sparc64/siginfo.h +++ b/include/asm-sparc64/siginfo.h @@ -8,7 +8,6 @@ #define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) #define __ARCH_SI_TRAPNO -#define HAVE_ARCH_COPY_SIGINFO_TO_USER #include diff --git a/kernel/signal.c b/kernel/signal.c index b037b12ce04b..17ba94f17942 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1427,6 +1427,9 @@ int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) break; case __SI_FAULT: err |= __put_user(from->si_addr, &to->si_addr); +#ifdef __ARCH_SI_TRAPNO + err |= __put_user(from->si_trapno, &to->si_trapno); +#endif break; case __SI_CHLD: err |= __put_user(from->si_pid, &to->si_pid); -- cgit v1.2.3