OSDN Git Service

signal: Remove the need for __ARCH_SI_PREABLE_SIZE and SI_PAD_SIZE
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 18 Apr 2018 22:48:49 +0000 (17:48 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 3 Oct 2018 14:46:43 +0000 (16:46 +0200)
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: "Eric W. Biederman" <ebiederm@xmission.com>
17 files changed:
arch/alpha/include/uapi/asm/siginfo.h
arch/arm64/include/uapi/asm/Kbuild
arch/arm64/include/uapi/asm/siginfo.h [deleted file]
arch/ia64/include/uapi/asm/siginfo.h
arch/mips/include/uapi/asm/siginfo.h
arch/parisc/include/uapi/asm/Kbuild
arch/parisc/include/uapi/asm/siginfo.h [deleted file]
arch/powerpc/include/uapi/asm/Kbuild
arch/powerpc/include/uapi/asm/siginfo.h [deleted file]
arch/riscv/include/uapi/asm/Kbuild
arch/riscv/include/uapi/asm/siginfo.h [deleted file]
arch/s390/include/uapi/asm/Kbuild
arch/s390/include/uapi/asm/siginfo.h [deleted file]
arch/sparc/include/uapi/asm/siginfo.h
arch/x86/include/uapi/asm/siginfo.h
include/uapi/asm-generic/siginfo.h
kernel/signal.c

index db3f013..6e1a2af 100644 (file)
@@ -2,7 +2,6 @@
 #ifndef _ALPHA_SIGINFO_H
 #define _ALPHA_SIGINFO_H
 
-#define __ARCH_SI_PREAMBLE_SIZE                (4 * sizeof(int))
 #define __ARCH_SI_TRAPNO
 
 #include <asm-generic/siginfo.h>
index 198afbf..6c5adf4 100644 (file)
@@ -19,3 +19,4 @@ generic-y += swab.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += types.h
+generic-y += siginfo.h
diff --git a/arch/arm64/include/uapi/asm/siginfo.h b/arch/arm64/include/uapi/asm/siginfo.h
deleted file mode 100644 (file)
index 574d12f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* 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
index 52b5af4..796af1c 100644 (file)
@@ -9,8 +9,6 @@
 #define _UAPI_ASM_IA64_SIGINFO_H
 
 
-#define __ARCH_SI_PREAMBLE_SIZE        (4 * sizeof(int))
-
 #include <asm-generic/siginfo.h>
 
 #define si_imm         _sifields._sigfault._imm        /* as per UNIX SysV ABI spec */
index 262504b..c34c7ee 100644 (file)
 #define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int))
 #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
 
 #include <asm-generic/siginfo.h>
index 286ef5a..adb5c64 100644 (file)
@@ -7,3 +7,4 @@ generic-y += kvm_para.h
 generic-y += param.h
 generic-y += poll.h
 generic-y += resource.h
+generic-y += siginfo.h
diff --git a/arch/parisc/include/uapi/asm/siginfo.h b/arch/parisc/include/uapi/asm/siginfo.h
deleted file mode 100644 (file)
index 4a1062e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/* 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
index 1a6ed59..a658091 100644 (file)
@@ -7,3 +7,4 @@ generic-y += poll.h
 generic-y += resource.h
 generic-y += sockios.h
 generic-y += statfs.h
+generic-y += siginfo.h
diff --git a/arch/powerpc/include/uapi/asm/siginfo.h b/arch/powerpc/include/uapi/asm/siginfo.h
deleted file mode 100644 (file)
index 1d51d9b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* 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 */
index 7e91f48..5511b99 100644 (file)
@@ -26,3 +26,4 @@ generic-y += swab.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += types.h
+generic-y += siginfo.h
diff --git a/arch/riscv/include/uapi/asm/siginfo.h b/arch/riscv/include/uapi/asm/siginfo.h
deleted file mode 100644 (file)
index f96849a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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
index e364873..dc38a90 100644 (file)
@@ -18,3 +18,4 @@ generic-y += shmbuf.h
 generic-y += sockios.h
 generic-y += swab.h
 generic-y += termbits.h
+generic-y += siginfo.h
\ No newline at end of file
diff --git a/arch/s390/include/uapi/asm/siginfo.h b/arch/s390/include/uapi/asm/siginfo.h
deleted file mode 100644 (file)
index 6984820..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* 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
index 6c820ea..68bdde4 100644 (file)
@@ -4,7 +4,6 @@
 
 #if defined(__sparc__) && defined(__arch64__)
 
-#define __ARCH_SI_PREAMBLE_SIZE        (4 * sizeof(int))
 #define __ARCH_SI_BAND_T int
 
 #endif /* defined(__sparc__) && defined(__arch64__) */
index b3d1579..6642d8b 100644 (file)
@@ -7,8 +7,6 @@
 typedef long long __kernel_si_clock_t __attribute__((aligned(4)));
 #  define __ARCH_SI_CLOCK_T            __kernel_si_clock_t
 #  define __ARCH_SI_ATTRIBUTES         __attribute__((aligned(8)))
-# else /* x86-64 */
-#  define __ARCH_SI_PREAMBLE_SIZE      (4 * sizeof(int))
 # endif
 #endif
 
index 1811b81..cb3d6c2 100644 (file)
@@ -10,18 +10,7 @@ typedef union sigval {
        void __user *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 - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
-#endif
 
 /*
  * The default "si_band" type is "long", as specified by POSIX.
@@ -40,96 +29,108 @@ typedef union sigval {
 #define __ARCH_SI_ATTRIBUTES
 #endif
 
-typedef struct siginfo {
-       int si_signo;
-#ifndef __ARCH_HAS_SWAPPED_SIGINFO
-       int si_errno;
-       int si_code;
-#else
-       int si_code;
-       int si_errno;
-#endif
-
-       union {
-               int _pad[SI_PAD_SIZE];
-
-               /* kill() */
-               struct {
-                       __kernel_pid_t _pid;    /* sender's pid */
-                       __kernel_uid32_t _uid;  /* sender's uid */
-               } _kill;
-
-               /* POSIX.1b timers */
-               struct {
-                       __kernel_timer_t _tid;  /* timer id */
-                       int _overrun;           /* overrun count */
-                       sigval_t _sigval;       /* same as below */
-                       int _sys_private;       /* not to be passed to user */
-               } _timer;
-
-               /* POSIX.1b signals */
-               struct {
-                       __kernel_pid_t _pid;    /* sender's pid */
-                       __kernel_uid32_t _uid;  /* sender's uid */
-                       sigval_t _sigval;
-               } _rt;
-
-               /* 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. */
+union __sifields {
+       /* kill() */
+       struct {
+               __kernel_pid_t _pid;    /* sender's pid */
+               __kernel_uid32_t _uid;  /* sender's uid */
+       } _kill;
+
+       /* POSIX.1b timers */
+       struct {
+               __kernel_timer_t _tid;  /* timer id */
+               int _overrun;           /* overrun count */
+               sigval_t _sigval;       /* same as below */
+               int _sys_private;       /* not to be passed to user */
+       } _timer;
+
+       /* POSIX.1b signals */
+       struct {
+               __kernel_pid_t _pid;    /* sender's pid */
+               __kernel_uid32_t _uid;  /* sender's uid */
+               sigval_t _sigval;
+       } _rt;
+
+       /* 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
-                       int _trapno;    /* TRAP # which caused the signal */
+               int _trapno;    /* TRAP # which caused the signal */
 #endif
 #ifdef __ia64__
-                       int _imm;               /* immediate value for "break" */
-                       unsigned int _flags;    /* see ia64 si_flags */
-                       unsigned long _isr;     /* isr */
+               int _imm;               /* immediate value for "break" */
+               unsigned int _flags;    /* see ia64 si_flags */
+               unsigned long _isr;     /* isr */
 #endif
 
 #define __ADDR_BND_PKEY_PAD  (__alignof__(void *) < sizeof(short) ? \
                              sizeof(short) : __alignof__(void *))
-                       union {
-                               /*
-                                * used when si_code=BUS_MCEERR_AR or
-                                * used when si_code=BUS_MCEERR_AO
-                                */
-                               short _addr_lsb; /* LSB of the reported address */
-                               /* used when si_code=SEGV_BNDERR */
-                               struct {
-                                       char _dummy_bnd[__ADDR_BND_PKEY_PAD];
-                                       void __user *_lower;
-                                       void __user *_upper;
-                               } _addr_bnd;
-                               /* used when si_code=SEGV_PKUERR */
-                               struct {
-                                       char _dummy_pkey[__ADDR_BND_PKEY_PAD];
-                                       __u32 _pkey;
-                               } _addr_pkey;
-                       };
-               } _sigfault;
-
-               /* SIGPOLL */
-               struct {
-                       __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
-                       int _fd;
-               } _sigpoll;
+               union {
+                       /*
+                        * used when si_code=BUS_MCEERR_AR or
+                        * used when si_code=BUS_MCEERR_AO
+                        */
+                       short _addr_lsb; /* LSB of the reported address */
+                       /* used when si_code=SEGV_BNDERR */
+                       struct {
+                               char _dummy_bnd[__ADDR_BND_PKEY_PAD];
+                               void __user *_lower;
+                               void __user *_upper;
+                       } _addr_bnd;
+                       /* used when si_code=SEGV_PKUERR */
+                       struct {
+                               char _dummy_pkey[__ADDR_BND_PKEY_PAD];
+                               __u32 _pkey;
+                       } _addr_pkey;
+               };
+       } _sigfault;
+
+       /* SIGPOLL */
+       struct {
+               __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
+               int _fd;
+       } _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 */
-               struct {
-                       void __user *_call_addr; /* calling user insn */
-                       int _syscall;   /* triggering system call number */
-                       unsigned int _arch;     /* AUDIT_ARCH_* of syscall */
-               } _sigsys;
-       } _sifields;
+#ifndef __ARCH_HAS_SWAPPED_SIGINFO
+#define __SIGINFO                      \
+struct {                               \
+       int si_signo;                   \
+       int si_errno;                   \
+       int si_code;                    \
+       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;
 
 /*
index e445b0a..debb485 100644 (file)
@@ -3963,9 +3963,6 @@ __weak const char *arch_vma_name(struct vm_area_struct *vma)
 
 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);
 
        sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC);