Commit f2838018 authored by Eric W. Biederman's avatar Eric W. Biederman

signal: Remove the need for __ARCH_SI_PREABLE_SIZE and SI_PAD_SIZE

Rework the defintion of struct siginfo so that the array padding
struct siginfo to SI_MAX_SIZE can be placed in a union along side of
the rest of the struct siginfo members.  The result is that we no
longer need the __ARCH_SI_PREAMBLE_SIZE or SI_PAD_SIZE definitions.
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent e75dc036
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#ifndef _ALPHA_SIGINFO_H #ifndef _ALPHA_SIGINFO_H
#define _ALPHA_SIGINFO_H #define _ALPHA_SIGINFO_H
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#define __ARCH_SI_TRAPNO #define __ARCH_SI_TRAPNO
#include <asm-generic/siginfo.h> #include <asm-generic/siginfo.h>
......
...@@ -19,3 +19,4 @@ generic-y += swab.h ...@@ -19,3 +19,4 @@ generic-y += swab.h
generic-y += termbits.h generic-y += termbits.h
generic-y += termios.h generic-y += termios.h
generic-y += types.h generic-y += types.h
generic-y += siginfo.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* Copyright (C) 2012 ARM Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ASM_SIGINFO_H
#define __ASM_SIGINFO_H
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#include <asm-generic/siginfo.h>
#endif
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
#define _UAPI_ASM_IA64_SIGINFO_H #define _UAPI_ASM_IA64_SIGINFO_H
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#include <asm-generic/siginfo.h> #include <asm-generic/siginfo.h>
#define si_imm _sifields._sigfault._imm /* as per UNIX SysV ABI spec */ #define si_imm _sifields._sigfault._imm /* as per UNIX SysV ABI spec */
......
...@@ -14,17 +14,6 @@ ...@@ -14,17 +14,6 @@
#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int)) #define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int))
#undef __ARCH_SI_TRAPNO /* exception code needs to fill this ... */ #undef __ARCH_SI_TRAPNO /* exception code needs to fill this ... */
/*
* Careful to keep union _sifields from shifting ...
*/
#if _MIPS_SZLONG == 32
#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
#elif _MIPS_SZLONG == 64
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#else
#error _MIPS_SZLONG neither 32 nor 64
#endif
#define __ARCH_HAS_SWAPPED_SIGINFO #define __ARCH_HAS_SWAPPED_SIGINFO
#include <asm-generic/siginfo.h> #include <asm-generic/siginfo.h>
......
...@@ -7,3 +7,4 @@ generic-y += kvm_para.h ...@@ -7,3 +7,4 @@ generic-y += kvm_para.h
generic-y += param.h generic-y += param.h
generic-y += poll.h generic-y += poll.h
generic-y += resource.h generic-y += resource.h
generic-y += siginfo.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _PARISC_SIGINFO_H
#define _PARISC_SIGINFO_H
#if defined(__LP64__)
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#endif
#include <asm-generic/siginfo.h>
#endif
...@@ -7,3 +7,4 @@ generic-y += poll.h ...@@ -7,3 +7,4 @@ generic-y += poll.h
generic-y += resource.h generic-y += resource.h
generic-y += sockios.h generic-y += sockios.h
generic-y += statfs.h generic-y += statfs.h
generic-y += siginfo.h
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
#ifndef _ASM_POWERPC_SIGINFO_H
#define _ASM_POWERPC_SIGINFO_H
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifdef __powerpc64__
# define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#endif
#include <asm-generic/siginfo.h>
#endif /* _ASM_POWERPC_SIGINFO_H */
...@@ -26,3 +26,4 @@ generic-y += swab.h ...@@ -26,3 +26,4 @@ generic-y += swab.h
generic-y += termbits.h generic-y += termbits.h
generic-y += termios.h generic-y += termios.h
generic-y += types.h generic-y += types.h
generic-y += siginfo.h
/*
* Copyright (C) 2012 ARM Ltd.
* Copyright (C) 2016 SiFive, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ASM_SIGINFO_H
#define __ASM_SIGINFO_H
#define __ARCH_SI_PREAMBLE_SIZE (__SIZEOF_POINTER__ == 4 ? 12 : 16)
#include <asm-generic/siginfo.h>
#endif
...@@ -18,3 +18,4 @@ generic-y += shmbuf.h ...@@ -18,3 +18,4 @@ generic-y += shmbuf.h
generic-y += sockios.h generic-y += sockios.h
generic-y += swab.h generic-y += swab.h
generic-y += termbits.h generic-y += termbits.h
generic-y += siginfo.h
\ No newline at end of file
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
* S390 version
*
* Derived from "include/asm-i386/siginfo.h"
*/
#ifndef _S390_SIGINFO_H
#define _S390_SIGINFO_H
#ifdef __s390x__
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#endif
#include <asm-generic/siginfo.h>
#endif
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#if defined(__sparc__) && defined(__arch64__) #if defined(__sparc__) && defined(__arch64__)
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#define __ARCH_SI_BAND_T int #define __ARCH_SI_BAND_T int
#endif /* defined(__sparc__) && defined(__arch64__) */ #endif /* defined(__sparc__) && defined(__arch64__) */
......
...@@ -7,8 +7,6 @@ ...@@ -7,8 +7,6 @@
typedef long long __kernel_si_clock_t __attribute__((aligned(4))); typedef long long __kernel_si_clock_t __attribute__((aligned(4)));
# define __ARCH_SI_CLOCK_T __kernel_si_clock_t # define __ARCH_SI_CLOCK_T __kernel_si_clock_t
# define __ARCH_SI_ATTRIBUTES __attribute__((aligned(8))) # define __ARCH_SI_ATTRIBUTES __attribute__((aligned(8)))
# else /* x86-64 */
# define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
# endif # endif
#endif #endif
......
...@@ -10,18 +10,7 @@ typedef union sigval { ...@@ -10,18 +10,7 @@ typedef union sigval {
void __user *sival_ptr; void __user *sival_ptr;
} sigval_t; } 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 #define SI_MAX_SIZE 128
#ifndef SI_PAD_SIZE
#define SI_PAD_SIZE ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
#endif
/* /*
* The default "si_band" type is "long", as specified by POSIX. * The default "si_band" type is "long", as specified by POSIX.
...@@ -40,96 +29,108 @@ typedef union sigval { ...@@ -40,96 +29,108 @@ typedef union sigval {
#define __ARCH_SI_ATTRIBUTES #define __ARCH_SI_ATTRIBUTES
#endif #endif
typedef struct siginfo { union __sifields {
int si_signo; /* kill() */
#ifndef __ARCH_HAS_SWAPPED_SIGINFO struct {
int si_errno; __kernel_pid_t _pid; /* sender's pid */
int si_code; __kernel_uid32_t _uid; /* sender's uid */
#else } _kill;
int si_code;
int si_errno; /* POSIX.1b timers */
#endif struct {
__kernel_timer_t _tid; /* timer id */
union { int _overrun; /* overrun count */
int _pad[SI_PAD_SIZE]; sigval_t _sigval; /* same as below */
int _sys_private; /* not to be passed to user */
/* kill() */ } _timer;
struct {
__kernel_pid_t _pid; /* sender's pid */ /* POSIX.1b signals */
__kernel_uid32_t _uid; /* sender's uid */ struct {
} _kill; __kernel_pid_t _pid; /* sender's pid */
__kernel_uid32_t _uid; /* sender's uid */
/* POSIX.1b timers */ sigval_t _sigval;
struct { } _rt;
__kernel_timer_t _tid; /* timer id */
int _overrun; /* overrun count */ /* SIGCHLD */
sigval_t _sigval; /* same as below */ struct {
int _sys_private; /* not to be passed to user */ __kernel_pid_t _pid; /* which child */
} _timer; __kernel_uid32_t _uid; /* sender's uid */
int _status; /* exit code */
/* POSIX.1b signals */ __ARCH_SI_CLOCK_T _utime;
struct { __ARCH_SI_CLOCK_T _stime;
__kernel_pid_t _pid; /* sender's pid */ } _sigchld;
__kernel_uid32_t _uid; /* sender's uid */
sigval_t _sigval; /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
} _rt; struct {
void __user *_addr; /* faulting insn/memory ref. */
/* SIGCHLD */
struct {
__kernel_pid_t _pid; /* which child */
__kernel_uid32_t _uid; /* sender's uid */
int _status; /* exit code */
__ARCH_SI_CLOCK_T _utime;
__ARCH_SI_CLOCK_T _stime;
} _sigchld;
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
struct {
void __user *_addr; /* faulting insn/memory ref. */
#ifdef __ARCH_SI_TRAPNO #ifdef __ARCH_SI_TRAPNO
int _trapno; /* TRAP # which caused the signal */ int _trapno; /* TRAP # which caused the signal */
#endif #endif
#ifdef __ia64__ #ifdef __ia64__
int _imm; /* immediate value for "break" */ int _imm; /* immediate value for "break" */
unsigned int _flags; /* see ia64 si_flags */ unsigned int _flags; /* see ia64 si_flags */
unsigned long _isr; /* isr */ unsigned long _isr; /* isr */
#endif #endif
#define __ADDR_BND_PKEY_PAD (__alignof__(void *) < sizeof(short) ? \ #define __ADDR_BND_PKEY_PAD (__alignof__(void *) < sizeof(short) ? \
sizeof(short) : __alignof__(void *)) sizeof(short) : __alignof__(void *))
union { union {
/* /*
* used when si_code=BUS_MCEERR_AR or * used when si_code=BUS_MCEERR_AR or
* used when si_code=BUS_MCEERR_AO * used when si_code=BUS_MCEERR_AO
*/ */
short _addr_lsb; /* LSB of the reported address */ short _addr_lsb; /* LSB of the reported address */
/* used when si_code=SEGV_BNDERR */ /* used when si_code=SEGV_BNDERR */
struct { struct {
char _dummy_bnd[__ADDR_BND_PKEY_PAD]; char _dummy_bnd[__ADDR_BND_PKEY_PAD];
void __user *_lower; void __user *_lower;
void __user *_upper; void __user *_upper;
} _addr_bnd; } _addr_bnd;
/* used when si_code=SEGV_PKUERR */ /* used when si_code=SEGV_PKUERR */
struct { struct {
char _dummy_pkey[__ADDR_BND_PKEY_PAD]; char _dummy_pkey[__ADDR_BND_PKEY_PAD];
__u32 _pkey; __u32 _pkey;
} _addr_pkey; } _addr_pkey;
}; };
} _sigfault; } _sigfault;
/* SIGPOLL */ /* SIGPOLL */
struct { struct {
__ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */ __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
int _fd; int _fd;
} _sigpoll; } _sigpoll;
/* SIGSYS */
struct {
void __user *_call_addr; /* calling user insn */
int _syscall; /* triggering system call number */
unsigned int _arch; /* AUDIT_ARCH_* of syscall */
} _sigsys;
};
/* SIGSYS */ #ifndef __ARCH_HAS_SWAPPED_SIGINFO
struct { #define __SIGINFO \
void __user *_call_addr; /* calling user insn */ struct { \
int _syscall; /* triggering system call number */ int si_signo; \
unsigned int _arch; /* AUDIT_ARCH_* of syscall */ int si_errno; \
} _sigsys; int si_code; \
} _sifields; union __sifields _sifields; \
}
#else
#define __SIGINFO \
struct { \
int si_signo; \
int si_code; \
int si_errno; \
union __sifields _sifields; \
}
#endif /* __ARCH_HAS_SWAPPED_SIGINFO */
typedef struct siginfo {
union {
__SIGINFO;
int _si_pad[SI_MAX_SIZE/sizeof(int)];
};
} __ARCH_SI_ATTRIBUTES siginfo_t; } __ARCH_SI_ATTRIBUTES siginfo_t;
/* /*
......
...@@ -3963,9 +3963,6 @@ __weak const char *arch_vma_name(struct vm_area_struct *vma) ...@@ -3963,9 +3963,6 @@ __weak const char *arch_vma_name(struct vm_area_struct *vma)
void __init signals_init(void) void __init signals_init(void)
{ {
/* If this check fails, the __ARCH_SI_PREAMBLE_SIZE value is wrong! */
BUILD_BUG_ON(__ARCH_SI_PREAMBLE_SIZE
!= offsetof(struct siginfo, _sifields._pad));
BUILD_BUG_ON(sizeof(struct siginfo) != SI_MAX_SIZE); BUILD_BUG_ON(sizeof(struct siginfo) != SI_MAX_SIZE);
sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC); sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment