On Fri, Aug 21, 2026 at 3:46 PM Nick Desaulniers
<[email protected]> wrote:
>
> The register offset macros in <asm/ptrace-abi.h> are guarded by
> `defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS)` for 64-bit, but
> were left unguarded for 32-bit. This causes havoc for userspace that
> happens to use identifiers colliding with these short macro names
> (e.g., EBX, ECX, EAX, DS, ES, FS, GS, CS, SS). Without this guard,
> userspace is forced to be super extra careful with include ordering to
> minimize the chance of collision.
>
> Wrap both the 32-bit and 64-bit register definitions under
> `#if defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS)`, and ensure
> User-Mode Linux (UML) defines `__FRAME_OFFSETS` for 32-bit as well.
>
> Assisted-by: Gemini
> Link: https://github.com/llvm/llvm-project/issues/217413
> Signed-off-by: Nick Desaulniers <[email protected]>

+ enh (who pulled this into android for testing)

Oleg, can I get an ack/nack here? Or someone who knows better the
history of UAPI headers?

(I think the Assisted-by tags need `LLM` now IIUC? Assisted-by: LLM Gemini)

We've worked around this now in lldb-server, but figured it might be
nice to clean this up for the rest of userspace, too.

> ---
>  arch/x86/include/uapi/asm/ptrace-abi.h | 4 ++--
>  arch/x86/um/asm/ptrace.h               | 4 +---
>  arch/x86/um/ptrace_32.c                | 1 +
>  3 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/include/uapi/asm/ptrace-abi.h 
> b/arch/x86/include/uapi/asm/ptrace-abi.h
> index 5823584dea13..3656955c6faa 100644
> --- a/arch/x86/include/uapi/asm/ptrace-abi.h
> +++ b/arch/x86/include/uapi/asm/ptrace-abi.h
> @@ -2,6 +2,7 @@
>  #ifndef _ASM_X86_PTRACE_ABI_H
>  #define _ASM_X86_PTRACE_ABI_H
>
> +#if defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS)
>  #ifdef __i386__
>
>  #define EBX 0
> @@ -25,7 +26,6 @@
>
>  #else /* __i386__ */
>
> -#if defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS)
>  /*
>   * C ABI says these regs are callee-preserved. They aren't saved on kernel 
> entry
>   * unless syscall needs a complete, fully filled "struct pt_regs".
> @@ -57,12 +57,12 @@
>  #define EFLAGS 144
>  #define RSP 152
>  #define SS 160
> -#endif /* __ASSEMBLER__ */
>
>  /* top of stack page */
>  #define FRAME_SIZE 168
>
>  #endif /* !__i386__ */
> +#endif /* defined(__ASSEMBLER__) || defined(__FRAME_OFFSETS) */
>
>  /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
>  #define PTRACE_GETREGS            12
> diff --git a/arch/x86/um/asm/ptrace.h b/arch/x86/um/asm/ptrace.h
> index 2641d28d115c..439c4151f6b7 100644
> --- a/arch/x86/um/asm/ptrace.h
> +++ b/arch/x86/um/asm/ptrace.h
> @@ -13,9 +13,7 @@ enum {
>  };
>
>  #include <linux/compiler.h>
> -#ifndef CONFIG_X86_32
> -#define __FRAME_OFFSETS /* Needed to get the R* macros */
> -#endif
> +#define __FRAME_OFFSETS /* Needed to get the register macros */
>  #include <asm/ptrace-generic.h>
>
>  #define user_mode(r) UPT_IS_USER(&(r)->regs)
> diff --git a/arch/x86/um/ptrace_32.c b/arch/x86/um/ptrace_32.c
> index 3af3cb821524..9e9155b0e918 100644
> --- a/arch/x86/um/ptrace_32.c
> +++ b/arch/x86/um/ptrace_32.c
> @@ -7,6 +7,7 @@
>  #include <linux/sched.h>
>  #include <linux/uaccess.h>
>  #include <linux/regset.h>
> +#define __FRAME_OFFSETS
>  #include <asm/ptrace-abi.h>
>  #include <registers.h>
>  #include <skas.h>
>
> ---
> base-commit: 26260251022fbc2f248a3d747a9b2b961b18d2d8
> change-id: 20260821-ptrace_uapi-462350036cbd
>
> Best regards,
> --
> Nick Desaulniers <[email protected]>
>


-- 
Thanks,
~Nick Desaulniers

Reply via email to