[PATCH v14 0/9] Add rseq extensible ABI support

Mathieu Desnoyers mathieu.desnoyers@efficios.com
Fri Dec 27 14:52:33 GMT 2024


On 2024-11-21 14:08, Michael Jeanson wrote:
> Introduced in Linux v6.3 the rseq extensible ABI [1] will allow adding
> rseq features past the initial 32 bytes of the original ABI.

Hi Florian,

I am currently implementing a new rseq feature which requires adding
an 8-byte field, which goes beyond the 32 initial bytes (it reaches 36
bytes).

I need to disable the glibc rseq integration with the tunable for
my development testing, but I am reaching a point where we will shortly
need the extensible rseq integration in glibc.

How is review progressing ? How can we help ?

Thanks,

Mathieu

> 
> While the rseq features in the latest kernel still fit within the
> original ABI size, there are currently only 4 bytes left. It would thus
> be a good time to add support for the extensible ABI so that when new
> features are added, they are immediately available to GNU libc users.
> 
> We use the ELF auxiliary vector to query the kernel for the size and
> alignment of the rseq area, if this fails we default to the original
> fixed size and alignment of '32' which the kernel will accept as a
> compatibility mode with the original ABI.
> 
> This makes the size of the rseq area variable and thus requires to
> relocate it out of 'struct pthread'. We chose to move it after (in block
> allocation order) the last TLS block inside the static TLS block
> allocation. It required a fairly small modification to the TLS block
> allocator and did not interfere with the main executable TLS block which
> must always be the first block relative to the thread pointer.
> 
> [1] https://lore.kernel.org/all/20221122203932.231377-4-mathieu.desnoyers@efficios.com/
> 
> Cc: Florian Weimer <fweimer@redhat.com>
> Cc: Carlos O'Donell <carlos@redhat.com>
> Cc: DJ Delorie <dj@redhat.com>
> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> ---
> Changes since v13:
> - Ensure that the VOLATILE variants of the RSEQ_ accessors static
>    asserts on 64bit types on 32bit architectures
> - Move rtld_hidden_proto rseq symbols to a separate patch
> Changes since v12:
> - Set _rseq_size to 0 on registration failure
> - Split RSEQ_SET/GETMEM from THREAD_SET/GETMEM
> - Rename rseq_get_area() to RSEQ_SELF()
> - Add rtld_hidden_proto to __rseq_size and __rseq_offset
> - Add comment and variable array member to 'struct rseq_area'
> - Style nits
> Changes since v11:
> - Removed _dl_rseq_feature_size, use __rseq_size instead
> - Replace GLRO(dl_rseq_align) with a hidden global variable _rseq_align
> - __rseq_size is now set directly in _dl_parse_auxv, set it to 0 when
>    the main thread registration fails or is disabled by tunable
> Changes since v10:
> - Split the patchset in smaller patches
> - Rebased on 'Make __rseq_size useful for feature detection'
> - Remove 'rseq' from the generic TLS code, add 'extra TLS'
> - Add thread_pointer.h for all Linux architectures
> - Fix build on the Hurd
> Changes since v8:
> - Fix copyright year in sysdeps/generic/dl-rseq.h
> - Clarify the the tcb math comments
> - Add a comment to clarify what enforces the aligment requirements of a
>    pointer calculated from the rseq_offset
> - Remove nonsensical test in tst-rseq-disable
> - Add comments to clarify why the rseq size is 0 when registration fails
>    or is disabled
> - Add comments to explain why whe allocate and rseq area block even when
>    the registration is disabled by tunable
> - Rename 'rseq_size' -> 'rseq_alloc_size' and 'dl_tls_rseq_size' ->
>    'dl_tls_rseq_alloc_size' to clarify the distinction between the
>    allocated rseq size and the size reported to application code in
>    '__rseq_size'
> Changes since v6:
> - Fix tst-rseq for feature size over 32 bytes
> - Rebased on 'nptl: fix potential merge of __rseq_* relro symbols'
> Changes since v5:
> - Fix TLS_DTV_AT_TP rseq offset with statically linked executables
> Changes since RFC v4:
> - Move dynamic linker defines to a header file
> - Fix alignment when tls block align is smaller than rseq align with
>    statically linked executables
> - Add statically linked rseq tests
> - Revert: Set __rseq_size even when the registration fails
> - Use minimum size when rseq is disabled by tunable
> Changes since RFC v3:
> - Fix RSEQ_SETMEM for rseq disabled
> - Replace sys/auxv.h usage with dl-parse_auxv.h
> - Fix offset for TLS_TCB_AT_TP with statically linked executables
> - Zero the rseq area before registration
> Changes since RFC v2:
> - Set __rseq_size even when the registration fails
> - Adjust rseq tests to the new ABI
> - Added support for statically linked executables
> Changes since RFC v1:
> - Insert the rseq area after the last TLS block
> - Add proper support for TLS_TCB_AT_TP variant
> 
> ---
> Michael Jeanson (9):
>    nptl: initialize cpu_id_start prior to rseq registration
>    nptl: Add rseq auxvals
>    Add generic 'extra TLS'
>    Add Linux 'extra TLS'
>    nptl: add rtld_hidden_proto to __rseq_size and __rseq_offset
>    nptl: Introduce <rseq-access.h> for RSEQ_* accessors
>    nptl: Move the rseq area to the 'extra TLS' block
>    nptl: Remove the rseq area from 'struct pthread'
>    Linux: Update internal copy of '<sys/rseq.h>'
> 
>   csu/libc-tls.c                                | 59 +++++++++--
>   elf/dl-tls.c                                  | 59 +++++++++++
>   nptl/descr.h                                  | 22 +----
>   nptl/pthread_create.c                         |  2 +-
>   sysdeps/generic/dl-extra_tls.h                | 45 +++++++++
>   sysdeps/i386/nptl/rseq-access.h               | 98 +++++++++++++++++++
>   sysdeps/nptl/dl-tls_init_tp.c                 | 23 ++---
>   sysdeps/nptl/rseq-access.h                    | 58 +++++++++++
>   sysdeps/unix/sysv/linux/Makefile              | 10 ++
>   sysdeps/unix/sysv/linux/dl-extra_tls.h        | 70 +++++++++++++
>   sysdeps/unix/sysv/linux/dl-parse_auxv.h       |  7 ++
>   sysdeps/unix/sysv/linux/dl-rseq-symbols.S     | 27 +++--
>   sysdeps/unix/sysv/linux/rseq-internal.h       | 94 ++++++++++++++----
>   sysdeps/unix/sysv/linux/sched_getcpu.c        |  3 +-
>   sysdeps/unix/sysv/linux/sys/rseq.h            | 11 +++
>   .../unix/sysv/linux/tst-rseq-disable-static.c |  1 +
>   sysdeps/unix/sysv/linux/tst-rseq-disable.c    | 64 ++++++++++--
>   .../unix/sysv/linux/tst-rseq-nptl-static.c    |  1 +
>   sysdeps/unix/sysv/linux/tst-rseq-static.c     |  1 +
>   sysdeps/unix/sysv/linux/tst-rseq.c            | 84 +++++++++++++---
>   sysdeps/unix/sysv/linux/tst-rseq.h            |  3 +-
>   sysdeps/x86_64/nptl/rseq-access.h             | 79 +++++++++++++++
>   22 files changed, 725 insertions(+), 96 deletions(-)
>   create mode 100644 sysdeps/generic/dl-extra_tls.h
>   create mode 100644 sysdeps/i386/nptl/rseq-access.h
>   create mode 100644 sysdeps/nptl/rseq-access.h
>   create mode 100644 sysdeps/unix/sysv/linux/dl-extra_tls.h
>   create mode 100644 sysdeps/unix/sysv/linux/tst-rseq-disable-static.c
>   create mode 100644 sysdeps/unix/sysv/linux/tst-rseq-nptl-static.c
>   create mode 100644 sysdeps/unix/sysv/linux/tst-rseq-static.c
>   create mode 100644 sysdeps/x86_64/nptl/rseq-access.h
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com



More information about the Libc-alpha mailing list