Re: [PATCH] x86: uapi: ptrace: guard register offset macros with __ASSEMBLER__ or __FRAME_OFFSETS

From: enh

Date: Wed Sep 02 2026 - 09:53:59 EST


On Tue, Sep 1, 2026 at 5:45 PM Nick Desaulniers <ndesaulniers@xxxxxxxxxx> wrote:
>
> On Fri, Aug 21, 2026 at 3:46 PM Nick Desaulniers
> <ndesaulniers@xxxxxxxxxx> 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 <ndesaulniers@xxxxxxxxxx>
>
> + enh (who pulled this into android for testing)

for those who don't know me, i've been Android's libc maintainer for a
while now [was https://blog.linuxplumbersconf.org/2014/ocw/proposals/2337
really that long ago?!]... i applied this patch to Android's libc's
copy of the uapi headers (because Android uses the uapi headers
directly, unlike glibc, and exposes this header transitively from
<sys/ptrace.h>, also unlike glibc), and everything still built without
problems.

this does solve a real problem for us: llvm's coding style means they
have a lot of "FS" and "SS" identifiers that conflict with these
macros, and we see a conflict every few years.

Tested-by: Elliott Hughes <enh@xxxxxxxxxx>

> 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 <ndesaulniers@xxxxxxxxxx>
> >
>
>
> --
> Thanks,
> ~Nick Desaulniers