aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2022-05-15 18:05:01 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2022-06-17 19:35:20 +0000
commit43dbc72cc5602c41f1767b187ebc50c1ce781282 (patch)
treea09e458dc7af60cbab91d9537b976271b7255cce
parent3f3bfb826601d0d5581438c357a5dabd35aef9d2 (diff)
downloadsrc-43dbc72cc5602c41f1767b187ebc50c1ce781282.tar.gz
src-43dbc72cc5602c41f1767b187ebc50c1ce781282.zip
linux(4): Rework the definition of struct siginfo to match Linux actual one
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. Move struct siginfo definition under /compat/linux to reduce MD part. To avoid headers polution include linux_siginfo.h in the MD linux.h MFC after: 2 weeks (cherry picked from commit af557e649cf229e45a83767c3c4a7daeb92f0b01)
-rw-r--r--sys/amd64/linux/linux.h71
-rw-r--r--sys/amd64/linux32/linux.h70
-rw-r--r--sys/arm64/linux/linux.h71
-rw-r--r--sys/compat/linux/linux_siginfo.h113
-rw-r--r--sys/i386/linux/linux.h70
5 files changed, 121 insertions, 274 deletions
diff --git a/sys/amd64/linux/linux.h b/sys/amd64/linux/linux.h
index 51a2906f45cf..02aede96ce23 100644
--- a/sys/amd64/linux/linux.h
+++ b/sys/amd64/linux/linux.h
@@ -74,6 +74,8 @@ typedef l_int l_mqd_t;
typedef l_size_t l_socklen_t;
typedef l_ulong l_fd_mask;
+#include <compat/linux/linux_siginfo.h>
+
typedef struct {
l_int val[2];
} l_fsid_t;
@@ -182,75 +184,6 @@ typedef struct {
l_size_t ss_size;
} l_stack_t;
-#define LINUX_SI_PREAMBLE_SIZE (4 * sizeof(int))
-#define LINUX_SI_MAX_SIZE 128
-#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE - \
- LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
-typedef union l_sigval {
- l_int sival_int;
- l_uintptr_t sival_ptr;
-} l_sigval_t;
-
-typedef struct l_siginfo {
- l_int lsi_signo;
- l_int lsi_errno;
- l_int lsi_code;
- union {
- l_int _pad[LINUX_SI_PAD_SIZE];
-
- struct {
- l_pid_t _pid;
- l_uid_t _uid;
- } _kill;
-
- struct {
- l_timer_t _tid;
- l_int _overrun;
- char _pad[sizeof(l_uid_t) - sizeof(int)];
- union l_sigval _sigval;
- l_uint _sys_private;
- } _timer;
-
- struct {
- l_pid_t _pid; /* sender's pid */
- l_uid_t _uid; /* sender's uid */
- union l_sigval _sigval;
- } _rt;
-
- struct {
- l_pid_t _pid; /* which child */
- l_uid_t _uid; /* sender's uid */
- l_int _status; /* exit code */
- l_clock_t _utime;
- l_clock_t _stime;
- } _sigchld;
-
- struct {
- l_uintptr_t _addr; /* Faulting insn/memory ref. */
- } _sigfault;
-
- struct {
- l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
- l_int _fd;
- } _sigpoll;
- } _sifields;
-} l_siginfo_t;
-
-#define lsi_pid _sifields._kill._pid
-#define lsi_uid _sifields._kill._uid
-#define lsi_tid _sifields._timer._tid
-#define lsi_overrun _sifields._timer._overrun
-#define lsi_sys_private _sifields._timer._sys_private
-#define lsi_status _sifields._sigchld._status
-#define lsi_utime _sifields._sigchld._utime
-#define lsi_stime _sifields._sigchld._stime
-#define lsi_value _sifields._rt._sigval
-#define lsi_int _sifields._rt._sigval.sival_int
-#define lsi_ptr _sifields._rt._sigval.sival_ptr
-#define lsi_addr _sifields._sigfault._addr
-#define lsi_band _sifields._sigpoll._band
-#define lsi_fd _sifields._sigpoll._fd
-
/*
* mount flags
*/
diff --git a/sys/amd64/linux32/linux.h b/sys/amd64/linux32/linux.h
index 1987ff515275..5cdf7624fef5 100644
--- a/sys/amd64/linux32/linux.h
+++ b/sys/amd64/linux32/linux.h
@@ -82,6 +82,8 @@ typedef l_int l_timer_t;
typedef l_int l_mqd_t;
typedef l_ulong l_fd_mask;
+#include <compat/linux/linux_siginfo.h>
+
typedef struct {
l_int val[2];
} l_fsid_t;
@@ -287,74 +289,6 @@ typedef struct {
l_size_t ss_size;
} l_stack_t;
-#define LINUX_SI_MAX_SIZE 128
-#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
-
-typedef union l_sigval {
- l_int sival_int;
- l_uintptr_t sival_ptr;
-} l_sigval_t;
-
-typedef struct l_siginfo {
- l_int lsi_signo;
- l_int lsi_errno;
- l_int lsi_code;
- union {
- l_int _pad[LINUX_SI_PAD_SIZE];
-
- struct {
- l_pid_t _pid;
- l_uid_t _uid;
- } _kill;
-
- struct {
- l_timer_t _tid;
- l_int _overrun;
- char _pad[sizeof(l_uid_t) - sizeof(l_int)];
- l_sigval_t _sigval;
- l_int _sys_private;
- } _timer;
-
- struct {
- l_pid_t _pid; /* sender's pid */
- l_uid_t _uid; /* sender's uid */
- l_sigval_t _sigval;
- } _rt;
-
- struct {
- l_pid_t _pid; /* which child */
- l_uid_t _uid; /* sender's uid */
- l_int _status; /* exit code */
- l_clock_t _utime;
- l_clock_t _stime;
- } _sigchld;
-
- struct {
- l_uintptr_t _addr; /* Faulting insn/memory ref. */
- } _sigfault;
-
- struct {
- l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
- l_int _fd;
- } _sigpoll;
- } _sifields;
-} l_siginfo_t;
-
-#define lsi_pid _sifields._kill._pid
-#define lsi_uid _sifields._kill._uid
-#define lsi_tid _sifields._timer._tid
-#define lsi_overrun _sifields._timer._overrun
-#define lsi_sys_private _sifields._timer._sys_private
-#define lsi_status _sifields._sigchld._status
-#define lsi_utime _sifields._sigchld._utime
-#define lsi_stime _sifields._sigchld._stime
-#define lsi_value _sifields._rt._sigval
-#define lsi_int _sifields._rt._sigval.sival_int
-#define lsi_ptr _sifields._rt._sigval.sival_ptr
-#define lsi_addr _sifields._sigfault._addr
-#define lsi_band _sifields._sigpoll._band
-#define lsi_fd _sifields._sigpoll._fd
-
/*
* arch specific open/fcntl flags
*/
diff --git a/sys/arm64/linux/linux.h b/sys/arm64/linux/linux.h
index b6e2af506ad2..402f7aa39bb9 100644
--- a/sys/arm64/linux/linux.h
+++ b/sys/arm64/linux/linux.h
@@ -67,6 +67,8 @@ typedef l_int l_timer_t; /* XXX */
typedef l_int l_mqd_t;
typedef l_ulong l_fd_mask;
+#include <compat/linux/linux_siginfo.h>
+
typedef struct {
l_int val[2];
} l_fsid_t;
@@ -179,75 +181,6 @@ typedef struct {
l_size_t ss_size;
} l_stack_t;
-#define LINUX_SI_PREAMBLE_SIZE (4 * sizeof(int))
-#define LINUX_SI_MAX_SIZE 128
-#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE - \
- LINUX_SI_PREAMBLE_SIZE) / sizeof(l_int))
-typedef union l_sigval {
- l_int sival_int;
- l_uintptr_t sival_ptr;
-} l_sigval_t;
-
-typedef struct l_siginfo {
- l_int lsi_signo;
- l_int lsi_errno;
- l_int lsi_code;
- union {
- l_int _pad[LINUX_SI_PAD_SIZE];
-
- struct {
- l_pid_t _pid;
- l_uid_t _uid;
- } _kill;
-
- struct {
- l_timer_t _tid;
- l_int _overrun;
- char _pad[sizeof(l_uid_t) - sizeof(int)];
- union l_sigval _sigval;
- l_uint _sys_private;
- } _timer;
-
- struct {
- l_pid_t _pid; /* sender's pid */
- l_uid_t _uid; /* sender's uid */
- union l_sigval _sigval;
- } _rt;
-
- struct {
- l_pid_t _pid; /* which child */
- l_uid_t _uid; /* sender's uid */
- l_int _status; /* exit code */
- l_clock_t _utime;
- l_clock_t _stime;
- } _sigchld;
-
- struct {
- l_uintptr_t _addr; /* Faulting insn/memory ref. */
- } _sigfault;
-
- struct {
- l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
- l_int _fd;
- } _sigpoll;
- } _sifields;
-} l_siginfo_t;
-
-#define lsi_pid _sifields._kill._pid
-#define lsi_uid _sifields._kill._uid
-#define lsi_tid _sifields._timer._tid
-#define lsi_overrun _sifields._timer._overrun
-#define lsi_sys_private _sifields._timer._sys_private
-#define lsi_status _sifields._sigchld._status
-#define lsi_utime _sifields._sigchld._utime
-#define lsi_stime _sifields._sigchld._stime
-#define lsi_value _sifields._rt._sigval
-#define lsi_int _sifields._rt._sigval.sival_int
-#define lsi_ptr _sifields._rt._sigval.sival_ptr
-#define lsi_addr _sifields._sigfault._addr
-#define lsi_band _sifields._sigpoll._band
-#define lsi_fd _sifields._sigpoll._fd
-
union l_semun {
l_int val;
l_uintptr_t buf;
diff --git a/sys/compat/linux/linux_siginfo.h b/sys/compat/linux/linux_siginfo.h
new file mode 100644
index 000000000000..cb5c3e76482c
--- /dev/null
+++ b/sys/compat/linux/linux_siginfo.h
@@ -0,0 +1,113 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 2004 Tim J. Robbins
+ * Copyright (c) 2001 Doug Rabson
+ * Copyright (c) 1994-1996 Søren Schmidt
+ * All rights reserved.
+ * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _LINUX_SIGINFO_H_
+#define _LINUX_SIGINFO_H_
+
+typedef union l_sigval {
+ l_int sival_int;
+ l_uintptr_t sival_ptr;
+} l_sigval_t;
+
+#define LINUX_SI_MAX_SIZE 128
+
+union __sifields {
+ struct {
+ l_pid_t _pid;
+ l_uid_t _uid;
+ } _kill;
+
+ struct {
+ l_timer_t _tid;
+ l_int _overrun;
+ char _pad[sizeof(l_uid_t) - sizeof(int)];
+ union l_sigval _sigval;
+ l_uint _sys_private;
+ } _timer;
+
+ struct {
+ l_pid_t _pid; /* sender's pid */
+ l_uid_t _uid; /* sender's uid */
+ union l_sigval _sigval;
+ } _rt;
+
+ struct {
+ l_pid_t _pid; /* which child */
+ l_uid_t _uid; /* sender's uid */
+ l_int _status; /* exit code */
+ l_clock_t _utime;
+ l_clock_t _stime;
+ } _sigchld;
+
+ struct {
+ l_uintptr_t _addr; /* Faulting insn/memory ref. */
+ } _sigfault;
+
+ struct {
+ l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
+ l_int _fd;
+ } _sigpoll;
+};
+
+typedef struct l_siginfo {
+ union {
+ struct {
+ l_int lsi_signo;
+ l_int lsi_errno;
+ l_int lsi_code;
+ union __sifields _sifields;
+ };
+ l_int _pad[LINUX_SI_MAX_SIZE/sizeof(l_int)];
+ };
+} l_siginfo_t;
+
+_Static_assert(sizeof(l_siginfo_t) == LINUX_SI_MAX_SIZE, "l_siginfo_t size");
+
+#define lsi_pid _sifields._kill._pid
+#define lsi_uid _sifields._kill._uid
+#define lsi_tid _sifields._timer._tid
+#define lsi_overrun _sifields._timer._overrun
+#define lsi_sys_private _sifields._timer._sys_private
+#define lsi_status _sifields._sigchld._status
+#define lsi_utime _sifields._sigchld._utime
+#define lsi_stime _sifields._sigchld._stime
+#define lsi_value _sifields._rt._sigval
+#define lsi_int _sifields._rt._sigval.sival_int
+#define lsi_ptr _sifields._rt._sigval.sival_ptr
+#define lsi_addr _sifields._sigfault._addr
+#define lsi_band _sifields._sigpoll._band
+#define lsi_fd _sifields._sigpoll._fd
+
+#endif /* _LINUX_SIGINFO_H_ */
diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h
index 75995587373b..210fb6ca5778 100644
--- a/sys/i386/linux/linux.h
+++ b/sys/i386/linux/linux.h
@@ -74,6 +74,8 @@ typedef l_int l_timer_t;
typedef l_int l_mqd_t;
typedef l_ulong l_fd_mask;
+#include <compat/linux/linux_siginfo.h>
+
typedef struct {
l_int val[2];
} l_fsid_t;
@@ -260,74 +262,6 @@ typedef struct {
l_size_t ss_size;
} l_stack_t;
-#define LINUX_SI_MAX_SIZE 128
-#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
-
-typedef union l_sigval {
- l_int sival_int;
- l_uintptr_t sival_ptr;
-} l_sigval_t;
-
-typedef struct l_siginfo {
- l_int lsi_signo;
- l_int lsi_errno;
- l_int lsi_code;
- union {
- l_int _pad[LINUX_SI_PAD_SIZE];
-
- struct {
- l_pid_t _pid;
- l_uid_t _uid;
- } _kill;
-
- struct {
- l_timer_t _tid;
- l_int _overrun;
- char _pad[sizeof(l_uid_t) - sizeof(l_int)];
- l_sigval_t _sigval;
- l_int _sys_private;
- } _timer;
-
- struct {
- l_pid_t _pid; /* sender's pid */
- l_uid_t _uid; /* sender's uid */
- l_sigval_t _sigval;
- } _rt;
-
- struct {
- l_pid_t _pid; /* which child */
- l_uid_t _uid; /* sender's uid */
- l_int _status; /* exit code */
- l_clock_t _utime;
- l_clock_t _stime;
- } _sigchld;
-
- struct {
- l_uintptr_t _addr; /* Faulting insn/memory ref. */
- } _sigfault;
-
- struct {
- l_long _band; /* POLL_IN,POLL_OUT,POLL_MSG */
- l_int _fd;
- } _sigpoll;
- } _sifields;
-} l_siginfo_t;
-
-#define lsi_pid _sifields._kill._pid
-#define lsi_uid _sifields._kill._uid
-#define lsi_tid _sifields._timer._tid
-#define lsi_overrun _sifields._timer._overrun
-#define lsi_sys_private _sifields._timer._sys_private
-#define lsi_status _sifields._sigchld._status
-#define lsi_utime _sifields._sigchld._utime
-#define lsi_stime _sifields._sigchld._stime
-#define lsi_value _sifields._rt._sigval
-#define lsi_int _sifields._rt._sigval.sival_int
-#define lsi_ptr _sifields._rt._sigval.sival_ptr
-#define lsi_addr _sifields._sigfault._addr
-#define lsi_band _sifields._sigpoll._band
-#define lsi_fd _sifields._sigpoll._fd
-
extern struct sysentvec linux_sysvec;
/*