Hi all,

On Sat, Oct 10, 2026 at 3:42 PM Magnus Lindholm <[email protected]> wrote:
>
> Enable the seccomp BPF selftests on Alpha with a fallback seccomp syscall
> number and architecture-specific syscall register accessors.
>
> Use the NT_PRSTATUS register layout rather than struct pt_regs. The
> register set contains r0-r30 followed by pc and unique. Read and update
> the syscall number in r1, and set both r0 and the r19/a3 error flag when
> synthesizing syscall results.
>
> At syscall entry, r19 still contains the fourth syscall argument, so
> callers setting a synthetic return value must also set the syscall
> number to -1 to skip execution.
>
> Signed-off-by: Magnus Lindholm <[email protected]>
> Reviewed-by: Matt Turner <[email protected]>
> ---
> Changes in v3:
> - Drop the /proc/self/syscall availability check and its commit-message
>   paragraph. Alpha selects HAVE_ARCH_TRACEHOOK.
> - Document that setting r19/a3 at syscall entry requires callers to also
>   set the syscall number to -1.
> - Add Matt Turner's Reviewed-by after addressing his review comments.
>
> Changes in v2:
> - Use the NT_PRSTATUS layout for PTRACE_GETREGSET/PTRACE_SETREGSET.
> - Set the Alpha return value and error flag together.
> - Check for /proc/self/syscall at runtime (removed in v3).
>
> Validation on AlphaServer ES40, GCC 15.2.1, running
> 7.3.0-rc1-es40-tsunami-v5a+:
> - Standard v3 and the original baseline binary both report 98 pass,
>   1 fail, 12 skip. The common failure is the 30-second timeout in
>   user_notification_wait_killable_after_reply.
> - A separate diagnostic build extending only that test's timeout to
>   180 seconds completes it in 34.938 seconds. The full diagnostic run
>   reports 99 pass, 0 fail, 12 skip. No timeout change is in this patch.
>
>  tools/testing/selftests/seccomp/seccomp_bpf.c | 26 +++++++++++++++++++
>  1 file changed, 26 insertions(+)
>
> diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c 
> b/tools/testing/selftests/seccomp/seccomp_bpf.c
> index 0622bc2..79e8eb3 100644
> --- a/tools/testing/selftests/seccomp/seccomp_bpf.c
> +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
> @@ -136,6 +136,8 @@ struct seccomp_data {
>  #  define __NR_seccomp 354
>  # elif defined(__x86_64__)
>  #  define __NR_seccomp 317
> +# elif defined(__alpha__)
> +#  define __NR_seccomp 514
>  # elif defined(__arm__)
>  #  define __NR_seccomp 383
>  # elif defined(__aarch64__)
> @@ -1754,6 +1756,30 @@ TEST_F(TRACE_poke, getpid_runs_normally)
>  # define ARCH_REGS             struct user_regs_struct
>  # define SYSCALL_NUM(_regs)    (_regs).orig_eax
>  # define SYSCALL_RET(_regs)    (_regs).eax
> +#elif defined(__alpha__)
> +/* NT_PRSTATUS contains r0-r30, pc and unique, not struct pt_regs. */
> +struct alpha_regs {
> +       unsigned long regs[33];
> +};
> +
> +# define ARCH_REGS             struct alpha_regs
> +/* The kernel keeps the mutable syscall number in r1. */
> +# define SYSCALL_NUM(_regs)    ((_regs).regs[1])
> +# define SYSCALL_RET(_regs)    ((_regs).regs[0])
> +/*
> + * Alpha returns positive errno in r0 with the r19/a3 error flag set.
> + * At a syscall-entry stop, r19 is still the fourth syscall argument.
> + * Callers must also set the syscall number to -1 to skip the syscall
> + * before replacing r19 with the error flag.
> + */
> +# define SYSCALL_RET_SET(_regs, _val)                          \
> +       do {                                                    \
> +               struct alpha_regs *__regs = &(_regs);           \
> +               long __ret = (_val);                            \
> +                                                               \
> +               __regs->regs[0] = __ret < 0 ? -__ret : __ret;   \
> +               __regs->regs[19] = __ret < 0;                   \
> +       } while (0)
>  #elif defined(__arm__)
>  # define ARCH_REGS             struct pt_regs
>  # define SYSCALL_NUM(_regs)    (_regs).ARM_r7
> --
> 2.43.0
>

Kees,
Would you be OK with me taking this patch through my Alpha tree?
The Alpha kernel support is already upstream.

v3 carries Matt's Reviewed-by. On my ES40, it matches the baseline:
98 passes, 12 skips and one timeout. Extending that timeout gives
99 passes and 12 skips; that adjustment is not part of the patch.

Link:
https://lore.kernel.org/linux-alpha/[email protected]/

Thanks,
Magnus

Reply via email to