2021-04-29 19:23:48

by Marco Elver

[permalink] [raw]
Subject: [PATCH 1/3] sparc64: Add compile-time asserts for siginfo_t offsets

To help catch ABI breaks at compile-time, add compile-time assertions to
verify the siginfo_t layout. Unlike other architectures, sparc64 is
special, because it is one of few architectures requiring si_trapno.
ABI breaks around that field would only be caught here.

Link: https://lkml.kernel.org/r/[email protected]
Suggested-by: Eric W. Biederman <[email protected]>
Signed-off-by: Marco Elver <[email protected]>
---
arch/sparc/kernel/signal32.c | 34 ++++++++++++++++++++++++++++++++++
arch/sparc/kernel/signal_64.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+)

diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
index e9695a06492f..778ed5c26d4a 100644
--- a/arch/sparc/kernel/signal32.c
+++ b/arch/sparc/kernel/signal32.c
@@ -745,3 +745,37 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
out:
return ret;
}
+
+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL == 11);
+static_assert(NSIGFPE == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS == 2);
+static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
+static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
+static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
+static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
+static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
+static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_trapno) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_lower) == 0x18);
+static_assert(offsetof(compat_siginfo_t, si_upper) == 0x1c);
+static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x18);
+static_assert(offsetof(compat_siginfo_t, si_perf) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c
index a0eec62c825d..c9bbf5f29078 100644
--- a/arch/sparc/kernel/signal_64.c
+++ b/arch/sparc/kernel/signal_64.c
@@ -556,3 +556,36 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long
user_enter();
}

+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL == 11);
+static_assert(NSIGFPE == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS == 2);
+static_assert(offsetof(siginfo_t, si_signo) == 0x00);
+static_assert(offsetof(siginfo_t, si_errno) == 0x04);
+static_assert(offsetof(siginfo_t, si_code) == 0x08);
+static_assert(offsetof(siginfo_t, si_pid) == 0x10);
+static_assert(offsetof(siginfo_t, si_uid) == 0x14);
+static_assert(offsetof(siginfo_t, si_tid) == 0x10);
+static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
+static_assert(offsetof(siginfo_t, si_status) == 0x18);
+static_assert(offsetof(siginfo_t, si_utime) == 0x20);
+static_assert(offsetof(siginfo_t, si_stime) == 0x28);
+static_assert(offsetof(siginfo_t, si_value) == 0x18);
+static_assert(offsetof(siginfo_t, si_int) == 0x18);
+static_assert(offsetof(siginfo_t, si_ptr) == 0x18);
+static_assert(offsetof(siginfo_t, si_addr) == 0x10);
+static_assert(offsetof(siginfo_t, si_trapno) == 0x18);
+static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x20);
+static_assert(offsetof(siginfo_t, si_lower) == 0x28);
+static_assert(offsetof(siginfo_t, si_upper) == 0x30);
+static_assert(offsetof(siginfo_t, si_pkey) == 0x28);
+static_assert(offsetof(siginfo_t, si_perf) == 0x20);
+static_assert(offsetof(siginfo_t, si_band) == 0x10);
+static_assert(offsetof(siginfo_t, si_fd) == 0x14);
--
2.31.1.527.g47e6f16901-goog


2021-04-29 19:23:48

by Marco Elver

[permalink] [raw]
Subject: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

To help catch ABI breaks at compile-time, add compile-time assertions to
verify the siginfo_t layout.

Signed-off-by: Marco Elver <[email protected]>
---
arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+)

diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index 6237486ff6bb..af8bd2af1298 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -973,3 +973,39 @@ void __init minsigstksz_setup(void)
round_up(sizeof(struct frame_record), 16) +
16; /* max alignment padding */
}
+
+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL == 11);
+static_assert(NSIGFPE == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS == 2);
+static_assert(offsetof(siginfo_t, si_signo) == 0x00);
+static_assert(offsetof(siginfo_t, si_errno) == 0x04);
+static_assert(offsetof(siginfo_t, si_code) == 0x08);
+static_assert(offsetof(siginfo_t, si_pid) == 0x10);
+static_assert(offsetof(siginfo_t, si_uid) == 0x14);
+static_assert(offsetof(siginfo_t, si_tid) == 0x10);
+static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
+static_assert(offsetof(siginfo_t, si_status) == 0x18);
+static_assert(offsetof(siginfo_t, si_utime) == 0x20);
+static_assert(offsetof(siginfo_t, si_stime) == 0x28);
+static_assert(offsetof(siginfo_t, si_value) == 0x18);
+static_assert(offsetof(siginfo_t, si_int) == 0x18);
+static_assert(offsetof(siginfo_t, si_ptr) == 0x18);
+static_assert(offsetof(siginfo_t, si_addr) == 0x10);
+static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x18);
+static_assert(offsetof(siginfo_t, si_lower) == 0x20);
+static_assert(offsetof(siginfo_t, si_upper) == 0x28);
+static_assert(offsetof(siginfo_t, si_pkey) == 0x20);
+static_assert(offsetof(siginfo_t, si_perf) == 0x18);
+static_assert(offsetof(siginfo_t, si_band) == 0x10);
+static_assert(offsetof(siginfo_t, si_fd) == 0x18);
+static_assert(offsetof(siginfo_t, si_call_addr) == 0x10);
+static_assert(offsetof(siginfo_t, si_syscall) == 0x18);
+static_assert(offsetof(siginfo_t, si_arch) == 0x1c);
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index 2f507f565c48..b6afb646515f 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -457,3 +457,39 @@ void compat_setup_restart_syscall(struct pt_regs *regs)
{
regs->regs[7] = __NR_compat_restart_syscall;
}
+
+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL == 11);
+static_assert(NSIGFPE == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS == 2);
+static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
+static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
+static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
+static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
+static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
+static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_lower) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_upper) == 0x18);
+static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x14);
+static_assert(offsetof(compat_siginfo_t, si_perf) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_call_addr) == 0x0c);
+static_assert(offsetof(compat_siginfo_t, si_syscall) == 0x10);
+static_assert(offsetof(compat_siginfo_t, si_arch) == 0x14);
--
2.31.1.527.g47e6f16901-goog

2021-04-29 19:26:02

by Marco Elver

[permalink] [raw]
Subject: [PATCH 2/3] arm: Add compile-time asserts for siginfo_t offsets

To help catch ABI breaks at compile-time, add compile-time assertions to
verify the siginfo_t layout.

This could have caught that we cannot portably add 64-bit integers to
siginfo_t on 32-bit architectures like Arm before reaching -next:
https://lkml.kernel.org/r/[email protected]

Signed-off-by: Marco Elver <[email protected]>
---
arch/arm/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)

diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index a3a38d0a4c85..2dac5d2c5cf6 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -725,3 +725,39 @@ asmlinkage void do_rseq_syscall(struct pt_regs *regs)
rseq_syscall(regs);
}
#endif
+
+/*
+ * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
+ * changes likely come with new fields that should be added below.
+ */
+static_assert(NSIGILL == 11);
+static_assert(NSIGFPE == 15);
+static_assert(NSIGSEGV == 9);
+static_assert(NSIGBUS == 5);
+static_assert(NSIGTRAP == 6);
+static_assert(NSIGCHLD == 6);
+static_assert(NSIGSYS == 2);
+static_assert(offsetof(siginfo_t, si_signo) == 0x00);
+static_assert(offsetof(siginfo_t, si_errno) == 0x04);
+static_assert(offsetof(siginfo_t, si_code) == 0x08);
+static_assert(offsetof(siginfo_t, si_pid) == 0x0c);
+static_assert(offsetof(siginfo_t, si_uid) == 0x10);
+static_assert(offsetof(siginfo_t, si_tid) == 0x0c);
+static_assert(offsetof(siginfo_t, si_overrun) == 0x10);
+static_assert(offsetof(siginfo_t, si_status) == 0x14);
+static_assert(offsetof(siginfo_t, si_utime) == 0x18);
+static_assert(offsetof(siginfo_t, si_stime) == 0x1c);
+static_assert(offsetof(siginfo_t, si_value) == 0x14);
+static_assert(offsetof(siginfo_t, si_int) == 0x14);
+static_assert(offsetof(siginfo_t, si_ptr) == 0x14);
+static_assert(offsetof(siginfo_t, si_addr) == 0x0c);
+static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x10);
+static_assert(offsetof(siginfo_t, si_lower) == 0x14);
+static_assert(offsetof(siginfo_t, si_upper) == 0x18);
+static_assert(offsetof(siginfo_t, si_pkey) == 0x14);
+static_assert(offsetof(siginfo_t, si_perf) == 0x10);
+static_assert(offsetof(siginfo_t, si_band) == 0x0c);
+static_assert(offsetof(siginfo_t, si_fd) == 0x10);
+static_assert(offsetof(siginfo_t, si_call_addr) == 0x0c);
+static_assert(offsetof(siginfo_t, si_syscall) == 0x10);
+static_assert(offsetof(siginfo_t, si_arch) == 0x14);
--
2.31.1.527.g47e6f16901-goog

2021-04-30 17:44:00

by Eric W. Biederman

[permalink] [raw]
Subject: Re: [PATCH 1/3] sparc64: Add compile-time asserts for siginfo_t offsets

Marco Elver <[email protected]> writes:

> To help catch ABI breaks at compile-time, add compile-time assertions to
> verify the siginfo_t layout. Unlike other architectures, sparc64 is
> special, because it is one of few architectures requiring si_trapno.
> ABI breaks around that field would only be caught here.

Arnd Bergman recently pointed out that we can move si_trapno into the
union and make it specific to a handful of signals. Like we do other
items in the union.

Given that the code of perf_sigtrap is pretty much broken if si_trapno
needs to be filled out. I think we should make that change before
we set this ABI in stone like this.

Otherwise this looks good.

Eric

> Link: https://lkml.kernel.org/r/[email protected]
> Suggested-by: Eric W. Biederman <[email protected]>
> Signed-off-by: Marco Elver <[email protected]>
> ---
> arch/sparc/kernel/signal32.c | 34 ++++++++++++++++++++++++++++++++++
> arch/sparc/kernel/signal_64.c | 33 +++++++++++++++++++++++++++++++++
> 2 files changed, 67 insertions(+)
>
> diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
> index e9695a06492f..778ed5c26d4a 100644
> --- a/arch/sparc/kernel/signal32.c
> +++ b/arch/sparc/kernel/signal32.c
> @@ -745,3 +745,37 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
> out:
> return ret;
> }
> +
> +/*
> + * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
> + * changes likely come with new fields that should be added below.
> + */
> +static_assert(NSIGILL == 11);
> +static_assert(NSIGFPE == 15);
> +static_assert(NSIGSEGV == 9);
> +static_assert(NSIGBUS == 5);
> +static_assert(NSIGTRAP == 6);
> +static_assert(NSIGCHLD == 6);
> +static_assert(NSIGSYS == 2);
> +static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
> +static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
> +static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
> +static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
> +static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
> +static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
> +static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
> +static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
> +static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
> +static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
> +static_assert(offsetof(compat_siginfo_t, si_trapno) == 0x10);
> +static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_lower) == 0x18);
> +static_assert(offsetof(compat_siginfo_t, si_upper) == 0x1c);
> +static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x18);
> +static_assert(offsetof(compat_siginfo_t, si_perf) == 0x14);
> +static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
> +static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);
> diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c
> index a0eec62c825d..c9bbf5f29078 100644
> --- a/arch/sparc/kernel/signal_64.c
> +++ b/arch/sparc/kernel/signal_64.c
> @@ -556,3 +556,36 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long
> user_enter();
> }
>
> +/*
> + * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
> + * changes likely come with new fields that should be added below.
> + */
> +static_assert(NSIGILL == 11);
> +static_assert(NSIGFPE == 15);
> +static_assert(NSIGSEGV == 9);
> +static_assert(NSIGBUS == 5);
> +static_assert(NSIGTRAP == 6);
> +static_assert(NSIGCHLD == 6);
> +static_assert(NSIGSYS == 2);
> +static_assert(offsetof(siginfo_t, si_signo) == 0x00);
> +static_assert(offsetof(siginfo_t, si_errno) == 0x04);
> +static_assert(offsetof(siginfo_t, si_code) == 0x08);
> +static_assert(offsetof(siginfo_t, si_pid) == 0x10);
> +static_assert(offsetof(siginfo_t, si_uid) == 0x14);
> +static_assert(offsetof(siginfo_t, si_tid) == 0x10);
> +static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
> +static_assert(offsetof(siginfo_t, si_status) == 0x18);
> +static_assert(offsetof(siginfo_t, si_utime) == 0x20);
> +static_assert(offsetof(siginfo_t, si_stime) == 0x28);
> +static_assert(offsetof(siginfo_t, si_value) == 0x18);
> +static_assert(offsetof(siginfo_t, si_int) == 0x18);
> +static_assert(offsetof(siginfo_t, si_ptr) == 0x18);
> +static_assert(offsetof(siginfo_t, si_addr) == 0x10);
> +static_assert(offsetof(siginfo_t, si_trapno) == 0x18);
> +static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x20);
> +static_assert(offsetof(siginfo_t, si_lower) == 0x28);
> +static_assert(offsetof(siginfo_t, si_upper) == 0x30);
> +static_assert(offsetof(siginfo_t, si_pkey) == 0x28);
> +static_assert(offsetof(siginfo_t, si_perf) == 0x20);
> +static_assert(offsetof(siginfo_t, si_band) == 0x10);
> +static_assert(offsetof(siginfo_t, si_fd) == 0x14);

2021-04-30 18:13:45

by Marco Elver

[permalink] [raw]
Subject: Re: [PATCH 1/3] sparc64: Add compile-time asserts for siginfo_t offsets

On Fri, 30 Apr 2021 at 19:42, Eric W. Biederman <[email protected]> wrote:
>
> Marco Elver <[email protected]> writes:
>
> > To help catch ABI breaks at compile-time, add compile-time assertions to
> > verify the siginfo_t layout. Unlike other architectures, sparc64 is
> > special, because it is one of few architectures requiring si_trapno.
> > ABI breaks around that field would only be caught here.
>
> Arnd Bergman recently pointed out that we can move si_trapno into the
> union and make it specific to a handful of signals. Like we do other
> items in the union.
>
> Given that the code of perf_sigtrap is pretty much broken if si_trapno
> needs to be filled out. I think we should make that change before
> we set this ABI in stone like this.
>
> Otherwise this looks good.

Thanks, that's reasonable -- I'll reply to the other thread in a few minutes.

-- Marco

> Eric
>
> > Link: https://lkml.kernel.org/r/[email protected]
> > Suggested-by: Eric W. Biederman <[email protected]>
> > Signed-off-by: Marco Elver <[email protected]>
> > ---
> > arch/sparc/kernel/signal32.c | 34 ++++++++++++++++++++++++++++++++++
> > arch/sparc/kernel/signal_64.c | 33 +++++++++++++++++++++++++++++++++
> > 2 files changed, 67 insertions(+)
> >
> > diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
> > index e9695a06492f..778ed5c26d4a 100644
> > --- a/arch/sparc/kernel/signal32.c
> > +++ b/arch/sparc/kernel/signal32.c
> > @@ -745,3 +745,37 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
> > out:
> > return ret;
> > }
> > +
> > +/*
> > + * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
> > + * changes likely come with new fields that should be added below.
> > + */
> > +static_assert(NSIGILL == 11);
> > +static_assert(NSIGFPE == 15);
> > +static_assert(NSIGSEGV == 9);
> > +static_assert(NSIGBUS == 5);
> > +static_assert(NSIGTRAP == 6);
> > +static_assert(NSIGCHLD == 6);
> > +static_assert(NSIGSYS == 2);
> > +static_assert(offsetof(compat_siginfo_t, si_signo) == 0x00);
> > +static_assert(offsetof(compat_siginfo_t, si_errno) == 0x04);
> > +static_assert(offsetof(compat_siginfo_t, si_code) == 0x08);
> > +static_assert(offsetof(compat_siginfo_t, si_pid) == 0x0c);
> > +static_assert(offsetof(compat_siginfo_t, si_uid) == 0x10);
> > +static_assert(offsetof(compat_siginfo_t, si_tid) == 0x0c);
> > +static_assert(offsetof(compat_siginfo_t, si_overrun) == 0x10);
> > +static_assert(offsetof(compat_siginfo_t, si_status) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_utime) == 0x18);
> > +static_assert(offsetof(compat_siginfo_t, si_stime) == 0x1c);
> > +static_assert(offsetof(compat_siginfo_t, si_value) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_int) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_ptr) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_addr) == 0x0c);
> > +static_assert(offsetof(compat_siginfo_t, si_trapno) == 0x10);
> > +static_assert(offsetof(compat_siginfo_t, si_addr_lsb) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_lower) == 0x18);
> > +static_assert(offsetof(compat_siginfo_t, si_upper) == 0x1c);
> > +static_assert(offsetof(compat_siginfo_t, si_pkey) == 0x18);
> > +static_assert(offsetof(compat_siginfo_t, si_perf) == 0x14);
> > +static_assert(offsetof(compat_siginfo_t, si_band) == 0x0c);
> > +static_assert(offsetof(compat_siginfo_t, si_fd) == 0x10);
> > diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c
> > index a0eec62c825d..c9bbf5f29078 100644
> > --- a/arch/sparc/kernel/signal_64.c
> > +++ b/arch/sparc/kernel/signal_64.c
> > @@ -556,3 +556,36 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long
> > user_enter();
> > }
> >
> > +/*
> > + * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
> > + * changes likely come with new fields that should be added below.
> > + */
> > +static_assert(NSIGILL == 11);
> > +static_assert(NSIGFPE == 15);
> > +static_assert(NSIGSEGV == 9);
> > +static_assert(NSIGBUS == 5);
> > +static_assert(NSIGTRAP == 6);
> > +static_assert(NSIGCHLD == 6);
> > +static_assert(NSIGSYS == 2);
> > +static_assert(offsetof(siginfo_t, si_signo) == 0x00);
> > +static_assert(offsetof(siginfo_t, si_errno) == 0x04);
> > +static_assert(offsetof(siginfo_t, si_code) == 0x08);
> > +static_assert(offsetof(siginfo_t, si_pid) == 0x10);
> > +static_assert(offsetof(siginfo_t, si_uid) == 0x14);
> > +static_assert(offsetof(siginfo_t, si_tid) == 0x10);
> > +static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
> > +static_assert(offsetof(siginfo_t, si_status) == 0x18);
> > +static_assert(offsetof(siginfo_t, si_utime) == 0x20);
> > +static_assert(offsetof(siginfo_t, si_stime) == 0x28);
> > +static_assert(offsetof(siginfo_t, si_value) == 0x18);
> > +static_assert(offsetof(siginfo_t, si_int) == 0x18);
> > +static_assert(offsetof(siginfo_t, si_ptr) == 0x18);
> > +static_assert(offsetof(siginfo_t, si_addr) == 0x10);
> > +static_assert(offsetof(siginfo_t, si_trapno) == 0x18);
> > +static_assert(offsetof(siginfo_t, si_addr_lsb) == 0x20);
> > +static_assert(offsetof(siginfo_t, si_lower) == 0x28);
> > +static_assert(offsetof(siginfo_t, si_upper) == 0x30);
> > +static_assert(offsetof(siginfo_t, si_pkey) == 0x28);
> > +static_assert(offsetof(siginfo_t, si_perf) == 0x20);
> > +static_assert(offsetof(siginfo_t, si_band) == 0x10);
> > +static_assert(offsetof(siginfo_t, si_fd) == 0x14);

2021-04-30 22:26:38

by David Miller

[permalink] [raw]
Subject: Re: [PATCH 1/3] sparc64: Add compile-time asserts for siginfo_t offsets

From: Marco Elver <[email protected]>
Date: Thu, 29 Apr 2021 21:07:32 +0200

> To help catch ABI breaks at compile-time, add compile-time assertions to
> verify the siginfo_t layout. Unlike other architectures, sparc64 is
> special, because it is one of few architectures requiring si_trapno.
> ABI breaks around that field would only be caught here.
>
> Link: https://lkml.kernel.org/r/[email protected]
> Suggested-by: Eric W. Biederman <[email protected]>
> Signed-off-by: Marco Elver <[email protected]>

Acked-by: David S. Miller <[email protected]>

2021-05-26 19:47:47

by Will Deacon

[permalink] [raw]
Subject: Re: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

On Wed, May 26, 2021 at 07:50:41PM +0200, Marco Elver wrote:
> On Wed, 26 May 2021 at 19:42, Will Deacon <[email protected]> wrote:
> > Hi Marco,
> >
> > On Thu, Apr 29, 2021 at 09:07:34PM +0200, Marco Elver wrote:
> > > To help catch ABI breaks at compile-time, add compile-time assertions to
> > > verify the siginfo_t layout.
> > >
> > > Signed-off-by: Marco Elver <[email protected]>
> > > ---
> > > arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
> > > arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
> > > 2 files changed, 72 insertions(+)
> >
> > Do you want me to queue this patch in the arm64 tree, or is the series all
> > going together via another route?
>
> I think Eric will queue them together with a bunch of other cleanups,
> because as-is these patches are out-of-date as of:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0e31f3a38e77612ed8967aaad28db6d3ee674b5

Ok, thanks. I will ignore this then :)

Will

2021-05-26 22:51:05

by Will Deacon

[permalink] [raw]
Subject: Re: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

Hi Marco,

On Thu, Apr 29, 2021 at 09:07:34PM +0200, Marco Elver wrote:
> To help catch ABI breaks at compile-time, add compile-time assertions to
> verify the siginfo_t layout.
>
> Signed-off-by: Marco Elver <[email protected]>
> ---
> arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
> arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 72 insertions(+)

Do you want me to queue this patch in the arm64 tree, or is the series all
going together via another route?

Thanks,

Will

2021-05-26 22:53:09

by Marco Elver

[permalink] [raw]
Subject: Re: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

On Wed, 26 May 2021 at 19:42, Will Deacon <[email protected]> wrote:
> Hi Marco,
>
> On Thu, Apr 29, 2021 at 09:07:34PM +0200, Marco Elver wrote:
> > To help catch ABI breaks at compile-time, add compile-time assertions to
> > verify the siginfo_t layout.
> >
> > Signed-off-by: Marco Elver <[email protected]>
> > ---
> > arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
> > arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
> > 2 files changed, 72 insertions(+)
>
> Do you want me to queue this patch in the arm64 tree, or is the series all
> going together via another route?

I think Eric will queue them together with a bunch of other cleanups,
because as-is these patches are out-of-date as of:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0e31f3a38e77612ed8967aaad28db6d3ee674b5

Thanks,
-- Marco

2021-07-02 08:52:25

by Marco Elver

[permalink] [raw]
Subject: Re: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

On Wed, 26 May 2021 at 20:29, Will Deacon <[email protected]> wrote:
> On Wed, May 26, 2021 at 07:50:41PM +0200, Marco Elver wrote:
> > On Wed, 26 May 2021 at 19:42, Will Deacon <[email protected]> wrote:
> > > Hi Marco,
> > >
> > > On Thu, Apr 29, 2021 at 09:07:34PM +0200, Marco Elver wrote:
> > > > To help catch ABI breaks at compile-time, add compile-time assertions to
> > > > verify the siginfo_t layout.
> > > >
> > > > Signed-off-by: Marco Elver <[email protected]>
> > > > ---
> > > > arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
> > > > arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
> > > > 2 files changed, 72 insertions(+)
> > >
> > > Do you want me to queue this patch in the arm64 tree, or is the series all
> > > going together via another route?
> >
> > I think Eric will queue them together with a bunch of other cleanups,
> > because as-is these patches are out-of-date as of:
> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0e31f3a38e77612ed8967aaad28db6d3ee674b5
>
> Ok, thanks. I will ignore this then :)

Eric, are these static_assert patches being sent this merge-window
along with the other cleanups?

Thanks,
-- Marco

2021-07-12 11:11:29

by Marco Elver

[permalink] [raw]
Subject: Re: [PATCH 3/3] arm64: Add compile-time asserts for siginfo_t offsets

On Fri, 2 Jul 2021 at 10:51, Marco Elver <[email protected]> wrote:
> On Wed, 26 May 2021 at 20:29, Will Deacon <[email protected]> wrote:
> > On Wed, May 26, 2021 at 07:50:41PM +0200, Marco Elver wrote:
> > > On Wed, 26 May 2021 at 19:42, Will Deacon <[email protected]> wrote:
> > > > Hi Marco,
> > > >
> > > > On Thu, Apr 29, 2021 at 09:07:34PM +0200, Marco Elver wrote:
> > > > > To help catch ABI breaks at compile-time, add compile-time assertions to
> > > > > verify the siginfo_t layout.
> > > > >
> > > > > Signed-off-by: Marco Elver <[email protected]>
> > > > > ---
> > > > > arch/arm64/kernel/signal.c | 36 ++++++++++++++++++++++++++++++++++++
> > > > > arch/arm64/kernel/signal32.c | 36 ++++++++++++++++++++++++++++++++++++
> > > > > 2 files changed, 72 insertions(+)
> > > >
> > > > Do you want me to queue this patch in the arm64 tree, or is the series all
> > > > going together via another route?
> > >
> > > I think Eric will queue them together with a bunch of other cleanups,
> > > because as-is these patches are out-of-date as of:
> > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a0e31f3a38e77612ed8967aaad28db6d3ee674b5
> >
> > Ok, thanks. I will ignore this then :)
>
> Eric, are these static_assert patches being sent this merge-window
> along with the other cleanups?

I'm happy to send out a rebased version of this series only. I'll go
ahead and do that later in the week if I don't hear objections.

Thanks,
-- Marco