public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: Carlos O'Donell <carlos@redhat.com>,
	libc-alpha@sourceware.org, jma14 <jma14@rice.edu>
Cc: John Mellor-Crummey <johnmc@rice.edu>,
	Ben Woodard <woodard@redhat.com>,
	Szabolcs Nagy <szabolcs.nagy@arm.com>
Subject: Re: [PATCH v12 4/4] elf: Fix runtime linker auditing on aarch64 (BZ #26643)
Date: Tue, 1 Feb 2022 11:11:29 -0300	[thread overview]
Message-ID: <d7b53272-dfe5-8ae6-6787-df3bf7cdface@linaro.org> (raw)
In-Reply-To: <21019bdc-8cd7-8824-3005-a9db902569f1@redhat.com>



On 01/02/2022 03:19, Carlos O'Donell wrote:
> On 1/25/22 13:37, Adhemerval Zanella wrote:
>> From: Ben Woodard <woodard@redhat.com>
>>
>> The rtld audit support show two problems on aarch64:
>>
>>   1. _dl_runtime_resolve does not preserve x8, the indirect result
>>       location register, which might generate wrong result calls
>>       depending of the function signature.
>>
>>   2. The NEON Q registers pushed onto the stack by _dl_runtime_resolve
>>      were twice the size of D registers extracted from the stack frame by
>>      _dl_runtime_profile.
>>
>> While 2. might result in wrong information passed on the PLT tracing,
>> 1. generates wrong runtime behaviour.
>>
>> The aarch64 rtld audit support is change to:
> 
> s/change/changed/g

Ack.

> 
>>
>>   * Both La_aarch64_regs and La_aarch64_retval are expanded to include
>>     both x8 and the full sized NEON V registers, as defined by the
>>     ABI.
>>
>>   * dl_runtime_profile needed to extract registers saved by
>>     _dl_runtime_resolve and put them into the new correctly sized
>>     La_aarch64_regs structure.
>>
>>   * The LAV_CURRENT check is change to only accept new audit modules
>>     to avoid the undefined behavior of not save/restore x8.
> 
> OK.
> 
>>
>>   * Different than other architectures, audit modules older than
>>     LAV_CURRENT are rejected (both La_aarch64_regs and La_aarch64_retval
>>     changed their layout and the it does worth the to support multiple
> 
> s/and the it does worth the/and there are no requirements/g

Ack.

> 
>>     audit interface with the inherent aarch64 issues).
>>
>>   * A new field is also reserved on both La_aarch64_regs and
>>     La_aarch64_retval to support variant pcs symbols.
>>
>> Similar to x86, a new La_aarch64_vector type to represent the NEON
>> register is added on the La_aarch64_regs (so each type can be accessed
>> directly).
>>
>> Since LAV_CURRENT was already bumped to support bind-now, there is
>> no need to increase it again.
> 
> OK.
> 
>>
>> Checked on aarch64-linux-gnu.
> 
> Please send v13 and I'll ACK that for glibc 2.35.

Ack.

> 
>>
>> Co-authored-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
>> Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
>> ---
>>  NEWS                             |   4 +
>>  elf/rtld.c                       |   3 +-
>>  sysdeps/aarch64/Makefile         |  20 ++++
>>  sysdeps/aarch64/bits/link.h      |  26 +++--
>>  sysdeps/aarch64/dl-audit-check.h |  28 +++++
>>  sysdeps/aarch64/dl-link.sym      |   6 +-
>>  sysdeps/aarch64/dl-trampoline.S  |  81 +++++++++-----
>>  sysdeps/aarch64/tst-audit26.c    |  37 +++++++
>>  sysdeps/aarch64/tst-audit26mod.c |  33 ++++++
>>  sysdeps/aarch64/tst-audit26mod.h |  50 +++++++++
>>  sysdeps/aarch64/tst-audit27.c    |  64 +++++++++++
>>  sysdeps/aarch64/tst-audit27mod.c |  95 ++++++++++++++++
>>  sysdeps/aarch64/tst-audit27mod.h |  67 ++++++++++++
>>  sysdeps/aarch64/tst-auditmod26.c | 103 ++++++++++++++++++
>>  sysdeps/aarch64/tst-auditmod27.c | 180 +++++++++++++++++++++++++++++++
>>  sysdeps/generic/dl-audit-check.h |  23 ++++
>>  16 files changed, 779 insertions(+), 41 deletions(-)
>>  create mode 100644 sysdeps/aarch64/dl-audit-check.h
>>  create mode 100644 sysdeps/aarch64/tst-audit26.c
>>  create mode 100644 sysdeps/aarch64/tst-audit26mod.c
>>  create mode 100644 sysdeps/aarch64/tst-audit26mod.h
>>  create mode 100644 sysdeps/aarch64/tst-audit27.c
>>  create mode 100644 sysdeps/aarch64/tst-audit27mod.c
>>  create mode 100644 sysdeps/aarch64/tst-audit27mod.h
>>  create mode 100644 sysdeps/aarch64/tst-auditmod26.c
>>  create mode 100644 sysdeps/aarch64/tst-auditmod27.c
>>  create mode 100644 sysdeps/generic/dl-audit-check.h
>>
>> diff --git a/NEWS b/NEWS
>> index c0f8932f84..40623d01c0 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -162,6 +162,10 @@ Deprecated and removed features, and other changes affecting compatibility:
>>    proper bind-now support.  The loader now advertises on the la_symbind
>>    flags that PLT trace is not possible.
>>  
>> +* The audit interface on aarch64 is extended to support both the indirect
>> +  result location register (x8) and NEON Q register.  Old audit modules are
>> +  rejected by the loader.
> 
> OK. Thanks for the NEWS update.
> 
>> +
>>  Changes to build and runtime requirements:
>>  
>>    [Add changes to build and runtime requirements here]
>> diff --git a/elf/rtld.c b/elf/rtld.c
>> index 10436f7034..8dafaf61f4 100644
>> --- a/elf/rtld.c
>> +++ b/elf/rtld.c
>> @@ -52,6 +52,7 @@
>>  #include <get-dynamic-info.h>
>>  #include <dl-execve.h>
>>  #include <dl-find_object.h>
>> +#include <dl-audit-check.h>
>>  
>>  #include <assert.h>
>>  
>> @@ -1000,7 +1001,7 @@ file=%s [%lu]; audit interface function la_version returned zero; ignored.\n",
>>        return;
>>      }
>>  
>> -  if (lav > LAV_CURRENT)
>> +  if (!_dl_audit_check_version (lav))
>>      {
>>        _dl_debug_printf ("\
>>  ERROR: audit interface '%s' requires version %d (maximum supported version %d); ignored.\n",
>> diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile
>> index 7c66fb97aa..7183895d04 100644
>> --- a/sysdeps/aarch64/Makefile
>> +++ b/sysdeps/aarch64/Makefile
>> @@ -10,6 +10,26 @@ endif
>>  
>>  ifeq ($(subdir),elf)
>>  sysdep-dl-routines += dl-bti
>> +
>> +tests += tst-audit26 \
>> +	 tst-audit27
> 
> OK.
> 
>> +
>> +modules-names += \
>> +    tst-audit26mod \
>> +    tst-auditmod26 \
>> +    tst-audit27mod \
>> +    tst-auditmod27
>> +
>> +$(objpfx)tst-audit26: $(objpfx)tst-audit26mod.so \
>> +		      $(objpfx)tst-auditmod26.so
>> +LDFLAGS-tst-audit26 += -Wl,-z,lazy
>> +tst-audit26-ENV = LD_AUDIT=$(objpfx)tst-auditmod26.so
>> +
>> +$(objpfx)tst-audit27: $(objpfx)tst-audit27mod.so \
>> +		      $(objpfx)tst-auditmod27.so
>> +$(objpfx)tst-audit27mod.so: $(libsupport)
>> +LDFLAGS-tst-audit27 += -Wl,-z,lazy
>> +tst-audit27-ENV = LD_AUDIT=$(objpfx)tst-auditmod27.so
>>  endif
> 
> OK.
> 
>>  
>>  ifeq ($(subdir),elf)
>> diff --git a/sysdeps/aarch64/bits/link.h b/sysdeps/aarch64/bits/link.h
>> index e64f36d3f3..2479abc4fb 100644
>> --- a/sysdeps/aarch64/bits/link.h
>> +++ b/sysdeps/aarch64/bits/link.h
>> @@ -20,23 +20,31 @@
>>  # error "Never include <bits/link.h> directly; use <link.h> instead."
>>  #endif
>>  
>> +typedef union
>> +{
>> +  float s;
>> +  double d;
>> +  long double q;
>> +} La_aarch64_vector;
> 
> OK.
> 
>> +
>>  /* Registers for entry into PLT on AArch64.  */
>>  typedef struct La_aarch64_regs
>>  {
>> -  uint64_t lr_xreg[8];
>> -  uint64_t lr_dreg[8];
>> -  uint64_t lr_sp;
>> -  uint64_t lr_lr;
>> +  uint64_t          lr_xreg[9];
> 
> OK, add new lr_xreg.
> 
>> +  La_aarch64_vector lr_vreg[8];
> 
> OK, add lr_vreg's.
> 
>> +  uint64_t          lr_sp;
>> +  uint64_t          lr_lr;
>> +  void              *lr_vpcs;
>>  } La_aarch64_regs;
>>  
>>  /* Return values for calls from PLT on AArch64.  */
>>  typedef struct La_aarch64_retval
>>  {
>> -  /* Up to two integer registers can be used for a return value.  */
>> -  uint64_t lrv_xreg[2];
>> -  /* Up to four D registers can be used for a return value.  */
>> -  uint64_t lrv_dreg[4];
>> -
>> +  /* Up to eight integer registers can be used for a return value.  */
>> +  uint64_t          lrv_xreg[8];
>> +  /* Up to eight V registers can be used for a return value.  */
>> +  La_aarch64_vector lrv_vreg[8];
>> +  void              *lrv_vpcs;
> 
> OK.
> 
>>  } La_aarch64_retval;
>>  __BEGIN_DECLS
>>  
>> diff --git a/sysdeps/aarch64/dl-audit-check.h b/sysdeps/aarch64/dl-audit-check.h
>> new file mode 100644
>> index 0000000000..181eba0e8e
>> --- /dev/null
>> +++ b/sysdeps/aarch64/dl-audit-check.h
>> @@ -0,0 +1,28 @@
>> +/* rtld-audit version check.  AArch64 version.
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +static inline bool
>> +_dl_audit_check_version (unsigned int lav)
>> +{
>> +  /* Audit version 1 do not save neither x8 nor NEON register, which required
> 
> s/neither x86 nor NEON register/x8 or NEON registers/g

Ack.

> 
>> +     change La_aarch64_regs and La_aarch64_retval layout (BZ#26643).  The
> 
> s/change/changing/g

Ack.

> 
>> +     missing indirect result save/restore makes _dl_runtime_profile
>> +     potentially trigger undefined behavior if function returns a large
> 
> s/if/if the/g

Ack.

> 
>> +     struct (even when PLT trace is not requested).  */
>> +  return lav == LAV_CURRENT;
>> +}
>> diff --git a/sysdeps/aarch64/dl-link.sym b/sysdeps/aarch64/dl-link.sym
>> index d67d28b40c..cb4dcdcbed 100644
>> --- a/sysdeps/aarch64/dl-link.sym
>> +++ b/sysdeps/aarch64/dl-link.sym
>> @@ -7,9 +7,11 @@ DL_SIZEOF_RG		sizeof(struct La_aarch64_regs)
>>  DL_SIZEOF_RV		sizeof(struct La_aarch64_retval)
>>  
>>  DL_OFFSET_RG_X0		offsetof(struct La_aarch64_regs, lr_xreg)
>> -DL_OFFSET_RG_D0		offsetof(struct La_aarch64_regs, lr_dreg)
>> +DL_OFFSET_RG_V0		offsetof(struct La_aarch64_regs, lr_vreg)
> 
> OK.
> 
>>  DL_OFFSET_RG_SP		offsetof(struct La_aarch64_regs, lr_sp)
>>  DL_OFFSET_RG_LR		offsetof(struct La_aarch64_regs, lr_lr)
>> +DL_OFFSET_RG_VPCS       offsetof(struct La_aarch64_regs, lr_vpcs)
> 
> OK.
> 
>>  
>>  DL_OFFSET_RV_X0		offsetof(struct La_aarch64_retval, lrv_xreg)
>> -DL_OFFSET_RV_D0		offsetof(struct La_aarch64_retval, lrv_dreg)
>> +DL_OFFSET_RV_V0		offsetof(struct La_aarch64_retval, lrv_vreg)
>> +DL_OFFSET_RV_VPCS       offsetof(struct La_aarch64_retval, lrv_vpcs)
> 
> OK.
> 
>> diff --git a/sysdeps/aarch64/dl-trampoline.S b/sysdeps/aarch64/dl-trampoline.S
>> index a403863ef9..a7fc34639b 100644
>> --- a/sysdeps/aarch64/dl-trampoline.S
>> +++ b/sysdeps/aarch64/dl-trampoline.S
>> @@ -45,7 +45,8 @@ _dl_runtime_resolve:
>>  
>>  	cfi_rel_offset (lr, 8)
>>  
>> -	/* Save arguments.  */
>> +	/* Note: Saving x9 is not required by the ABI but the assember requires
> 
> s/assember/assembler/g

Ack.

> 
>> +	   the immediate values of operand 3 to be a multiple of 16 */
>>  	stp	x8, x9, [sp, #-(80+8*16)]!
>>  	cfi_adjust_cfa_offset (80+8*16)
>>  	cfi_rel_offset (x8, 0)
>> @@ -142,7 +143,7 @@ _dl_runtime_profile:
>>  	   Stack frame layout:
>>  	   [sp,   #...] lr
>>  	   [sp,   #...] &PLTGOT[n]
>> -	   [sp,    #96] La_aarch64_regs
>> +	   [sp,   #256] La_aarch64_regs
> 
> OK.
> 
>>  	   [sp,    #48] La_aarch64_retval
>>  	   [sp,    #40] frame size return from pltenter
>>  	   [sp,    #32] dl_profile_call saved x1
>> @@ -183,19 +184,25 @@ _dl_runtime_profile:
>>  	stp	x6, x7, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*3]
>>  	cfi_rel_offset (x6, OFFSET_RG + DL_OFFSET_RG_X0 + 16*3 + 0)
>>  	cfi_rel_offset (x7, OFFSET_RG + DL_OFFSET_RG_X0 + 16*3 + 8)
>> -
>> -	stp	d0, d1, [X29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*0]
>> -	cfi_rel_offset (d0, OFFSET_RG + DL_OFFSET_RG_D0 + 16*0)
>> -	cfi_rel_offset (d1, OFFSET_RG + DL_OFFSET_RG_D0 + 16*0 + 8)
>> -	stp	d2, d3, [X29, #OFFSET_RG+ DL_OFFSET_RG_D0 + 16*1]
>> -	cfi_rel_offset (d2, OFFSET_RG + DL_OFFSET_RG_D0 + 16*1 + 0)
>> -	cfi_rel_offset (d3, OFFSET_RG + DL_OFFSET_RG_D0 + 16*1 + 8)
>> -	stp	d4, d5, [X29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*2]
>> -	cfi_rel_offset (d4, OFFSET_RG + DL_OFFSET_RG_D0 + 16*2 + 0)
>> -	cfi_rel_offset (d5, OFFSET_RG + DL_OFFSET_RG_D0 + 16*2 + 8)
>> -	stp	d6, d7, [X29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*3]
>> -	cfi_rel_offset (d6, OFFSET_RG + DL_OFFSET_RG_D0 + 16*3 + 0)
>> -	cfi_rel_offset (d7, OFFSET_RG + DL_OFFSET_RG_D0 + 16*3 + 8)
>> +	str	x8, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*4 + 0]
>> +	cfi_rel_offset (x8, OFFSET_RG + DL_OFFSET_RG_X0 + 16*4 + 0)
>> +	/* Note 8 bytes of padding is in the stack frame for alignment */
>> +
>> +	stp	q0, q1, [X29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*0]
>> +	cfi_rel_offset (q0, OFFSET_RG + DL_OFFSET_RG_V0 + 32*0)
>> +	cfi_rel_offset (q1, OFFSET_RG + DL_OFFSET_RG_V0 + 32*0 + 16)
>> +	stp	q2, q3, [X29, #OFFSET_RG+ DL_OFFSET_RG_V0 + 32*1]
>> +	cfi_rel_offset (q2, OFFSET_RG + DL_OFFSET_RG_V0 + 32*1 + 0)
>> +	cfi_rel_offset (q3, OFFSET_RG + DL_OFFSET_RG_V0 + 32*1 + 16)
>> +	stp	q4, q5, [X29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*2]
>> +	cfi_rel_offset (q4, OFFSET_RG + DL_OFFSET_RG_V0 + 32*2 + 0)
>> +	cfi_rel_offset (q5, OFFSET_RG + DL_OFFSET_RG_V0 + 32*2 + 16)
>> +	stp	q6, q7, [X29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*3]
>> +	cfi_rel_offset (q6, OFFSET_RG + DL_OFFSET_RG_V0 + 32*3 + 0)
>> +	cfi_rel_offset (q7, OFFSET_RG + DL_OFFSET_RG_V0 + 32*3 + 16)
> 
> OK.
> 
>> +
>> +	/* No APCS extension supported.  */
>> +	str	xzr,    [X29, #OFFSET_RG + DL_OFFSET_RG_VPCS]
> 
> OK.
> 
>>  
>>  	add     x0, x29, #SF_SIZE + 16
>>  	ldr	x1, [x29, #OFFSET_LR]
>> @@ -234,10 +241,11 @@ _dl_runtime_profile:
>>  	ldp	x2, x3, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*1]
>>  	ldp	x4, x5, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*2]
>>  	ldp	x6, x7, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*3]
>> -	ldp	d0, d1, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*0]
>> -	ldp	d2, d3, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*1]
>> -	ldp	d4, d5, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*2]
>> -	ldp	d6, d7, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*3]
>> +	ldr	x8,     [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*4]
>> +	ldp	q0, q1, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*0]
>> +	ldp	q2, q3, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*1]
>> +	ldp	q4, q5, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*2]
>> +	ldp	q6, q7, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*3]
> 
> OK.
> 
>>  
>>  	cfi_def_cfa_register (sp)
>>  	ldp	x29, x30, [x29, #0]
>> @@ -280,14 +288,22 @@ _dl_runtime_profile:
>>  	ldp	x2, x3, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*1]
>>  	ldp	x4, x5, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*2]
>>  	ldp	x6, x7, [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*3]
>> -	ldp	d0, d1, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*0]
>> -	ldp	d2, d3, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*1]
>> -	ldp	d4, d5, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*2]
>> -	ldp	d6, d7, [x29, #OFFSET_RG + DL_OFFSET_RG_D0 + 16*3]
>> +	ldr	x8,     [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*4]
>> +	ldp	q0, q1, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*0]
>> +	ldp	q2, q3, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*1]
>> +	ldp	q4, q5, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*2]
>> +	ldp	q6, q7, [x29, #OFFSET_RG + DL_OFFSET_RG_V0 + 32*3]
> 
> OK.
> 
>>  	blr	ip0
>> -	stp	x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0]
>> -	stp	d0, d1, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*0]
>> -	stp	d2, d3, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*1]
>> +	stp	x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*0]
>> +	stp	x2, x3, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*1]
>> +	stp	x4, x5, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*2]
>> +	stp	x6, x7, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*3]
>> +	str	x8,     [x29, #OFFSET_RG + DL_OFFSET_RG_X0 + 16*4]
>> +	stp	q0, q1, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*0]
>> +	stp	q2, q3, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*1]
>> +	stp	q4, q5, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*2]
>> +	stp	q6, q7, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*3]
>> +	str	xzr,    [X29, #OFFSET_RV + DL_OFFSET_RG_VPCS]
> 
> OK.
> 
>>  
>>  	/* Setup call to pltexit  */
>>  	ldp	x0, x1, [x29, #OFFSET_SAVED_CALL_X0]
>> @@ -295,9 +311,16 @@ _dl_runtime_profile:
>>  	add	x3, x29, #OFFSET_RV
>>  	bl	_dl_audit_pltexit
>>  
>> -	ldp	x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0]
>> -	ldp	d0, d1, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*0]
>> -	ldp	d2, d3, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*1]
>> +	ldp	x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*0]
>> +	ldp	x2, x3, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*1]
>> +	ldp	x4, x5, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*2]
>> +	ldp	x6, x7, [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*3]
>> +	ldr	x8,     [x29, #OFFSET_RV + DL_OFFSET_RV_X0 + 16*4]
>> +	ldp	q0, q1, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*0]
>> +	ldp	q2, q3, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*1]
>> +	ldp	q4, q5, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*2]
>> +	ldp	q6, q7, [x29, #OFFSET_RV + DL_OFFSET_RV_V0 + 32*3]
> 
> OK.
> 
>> +
>>  	/* LR from within La_aarch64_reg */
>>  	ldr	lr, [x29, #OFFSET_RG + DL_OFFSET_RG_LR]
>>  	cfi_restore(lr)
>> diff --git a/sysdeps/aarch64/tst-audit26.c b/sysdeps/aarch64/tst-audit26.c
>> new file mode 100644
>> index 0000000000..8772958541
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit26.c
>> @@ -0,0 +1,37 @@
>> +/* Check DT_AUDIT for aarch64 ABI specifics.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <array_length.h>
>> +#include <string.h>
>> +#include <support/check.h>
>> +#include "tst-audit26mod.h"
>> +
>> +int
>> +do_test (void)
>> +{
>> +  /* Returning a large struct uses 'x8' as indirect result location.  */
>> +  struct large_struct r = tst_audit26_func (ARG1, ARG2, ARG3);
>> +
>> +  struct large_struct e = set_large_struct (ARG1, ARG2, ARG3);
>> +
>> +  TEST_COMPARE_BLOB (r.a, sizeof (r.a), e.a, sizeof (e.a));
>> +
>> +  return 0;
>> +}
> 
> OK.
> 
>> +
>> +#include <support/test-driver.c>
>> diff --git a/sysdeps/aarch64/tst-audit26mod.c b/sysdeps/aarch64/tst-audit26mod.c
>> new file mode 100644
>> index 0000000000..8d309be575
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit26mod.c
>> @@ -0,0 +1,33 @@
>> +/* Check DT_AUDIT for aarch64 ABI specifics.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <stdlib.h>
>> +#include "tst-audit26mod.h"
>> +
>> +struct large_struct
>> +tst_audit26_func (char a, short b, long int c)
>> +{
>> +  if (a != ARG1)
>> +    abort ();
>> +  if (b != ARG2)
>> +    abort ();
>> +  if (c != ARG3)
>> +    abort ();
>> +
>> +  return set_large_struct (a, b, c);
>> +}
> 
> OK.
> 
>> diff --git a/sysdeps/aarch64/tst-audit26mod.h b/sysdeps/aarch64/tst-audit26mod.h
>> new file mode 100644
>> index 0000000000..4226fad8cd
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit26mod.h
>> @@ -0,0 +1,50 @@
>> +/* Check DT_AUDIT for aarch64 specific ABI.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#ifndef _TST_AUDIT27MOD_H
>> +#define _TST_AUDIT27MOD_H 1
>> +
>> +#include <array_length.h>
>> +
>> +struct large_struct
>> +{
>> +  char a[16];
>> +  short b[8];
>> +  long int c[4];
>> +};
> 
> 
> OK.
> 
>> +
>> +static inline struct large_struct
>> +set_large_struct (char a, short b, long int c)
>> +{
>> +  struct large_struct r;
>> +  for (int i = 0; i < array_length (r.a); i++)
>> +    r.a[i] = a;
>> +  for (int i = 0; i < array_length (r.b); i++)
>> +    r.b[i] = b;
>> +  for (int i = 0; i < array_length (r.c); i++)
>> +    r.c[i] = c;
>> +  return r;
> 
> OK.
> 
>> +}
>> +
>> +#define ARG1 0x12
>> +#define ARG2 0x1234
>> +#define ARG3 0x12345678
> 
> OK.
> 
>> +
>> +struct large_struct tst_audit26_func (char a, short b, long int c);
> 
> OK.
> 
>> +
>> +#endif
>> diff --git a/sysdeps/aarch64/tst-audit27.c b/sysdeps/aarch64/tst-audit27.c
>> new file mode 100644
>> index 0000000000..f5017ce0f1
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit27.c
>> @@ -0,0 +1,64 @@
>> +/* Check DT_AUDIT for aarch64 ABI specifics.
> 
> s/DT_AUDIT/LD_AUDIT/g

ACk.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <array_length.h>
>> +#include <string.h>
>> +#include <support/check.h>
>> +#include "tst-audit27mod.h"
>> +
>> +int
>> +do_test (void)
>> +{
>> +  {
>> +    float r = tst_audit27_func_float (FUNC_FLOAT_ARG0, FUNC_FLOAT_ARG1,
>> +				      FUNC_FLOAT_ARG2, FUNC_FLOAT_ARG3,
>> +				      FUNC_FLOAT_ARG4, FUNC_FLOAT_ARG5,
>> +				      FUNC_FLOAT_ARG6, FUNC_FLOAT_ARG7);
>> +    if (r != FUNC_FLOAT_RET)
>> +      FAIL_EXIT1 ("tst_audit27_func_float() returned %a, expected %a",
>> +		  r, FUNC_FLOAT_RET);
>> +  }
>> +
>> +  {
>> +    double r = tst_audit27_func_double (FUNC_DOUBLE_ARG0, FUNC_DOUBLE_ARG1,
>> +					FUNC_DOUBLE_ARG2, FUNC_DOUBLE_ARG3,
>> +					FUNC_DOUBLE_ARG4, FUNC_DOUBLE_ARG5,
>> +					FUNC_DOUBLE_ARG6, FUNC_DOUBLE_ARG7);
>> +    if (r != FUNC_DOUBLE_RET)
>> +      FAIL_EXIT1 ("tst_audit27_func_double() returned %la, expected %la",
>> +		  r, FUNC_DOUBLE_RET);
>> +  }
>> +
>> +  {
>> +    long double r = tst_audit27_func_ldouble (FUNC_LDOUBLE_ARG0,
>> +					      FUNC_LDOUBLE_ARG1,
>> +					      FUNC_LDOUBLE_ARG2,
>> +					      FUNC_LDOUBLE_ARG3,
>> +					      FUNC_LDOUBLE_ARG4,
>> +					      FUNC_LDOUBLE_ARG5,
>> +					      FUNC_LDOUBLE_ARG6,
>> +					      FUNC_LDOUBLE_ARG7);
>> +    if (r != FUNC_LDOUBLE_RET)
>> +      FAIL_EXIT1 ("tst_audit27_func_ldouble() returned %La, expected %La",
>> +		  r, FUNC_LDOUBLE_RET);
>> +  }
>> +
>> +  return 0;
> 
> OK. Test float, double, and long double.
> 
>> +}
>> +
>> +#include <support/test-driver.c>
>> diff --git a/sysdeps/aarch64/tst-audit27mod.c b/sysdeps/aarch64/tst-audit27mod.c
>> new file mode 100644
>> index 0000000000..69f1d672b3
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit27mod.c
>> @@ -0,0 +1,95 @@
>> +/* Check DT_AUDIT for aarch64 ABI specifics.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <array_length.h>
>> +#include <stdlib.h>
>> +#include <support/check.h>
>> +#include "tst-audit27mod.h"
>> +
>> +float
>> +tst_audit27_func_float (float a0, float a1, float a2, float a3, float a4,
>> +			float a5, float a6, float a7)
>> +{
>> +  if (a0 != FUNC_FLOAT_ARG0)
>> +    FAIL_EXIT1 ("a0: %a != %a", a0, FUNC_FLOAT_ARG0);
>> +  if (a1 != FUNC_FLOAT_ARG1)
>> +    FAIL_EXIT1 ("a1: %a != %a", a1, FUNC_FLOAT_ARG1);
>> +  if (a2 != FUNC_FLOAT_ARG2)
>> +    FAIL_EXIT1 ("a2: %a != %a", a2, FUNC_FLOAT_ARG2);
>> +  if (a3 != FUNC_FLOAT_ARG3)
>> +    FAIL_EXIT1 ("a3: %a != %a", a3, FUNC_FLOAT_ARG3);
>> +  if (a4 != FUNC_FLOAT_ARG4)
>> +    FAIL_EXIT1 ("a4: %a != %a", a4, FUNC_FLOAT_ARG4);
>> +  if (a5 != FUNC_FLOAT_ARG5)
>> +    FAIL_EXIT1 ("a5: %a != %a", a5, FUNC_FLOAT_ARG5);
>> +  if (a6 != FUNC_FLOAT_ARG6)
>> +    FAIL_EXIT1 ("a6: %a != %a", a6, FUNC_FLOAT_ARG6);
>> +  if (a7 != FUNC_FLOAT_ARG7)
>> +    FAIL_EXIT1 ("a7: %a != %a", a7, FUNC_FLOAT_ARG7);
>> +
>> +  return FUNC_FLOAT_RET;
>> +}
>> +
>> +double
>> +tst_audit27_func_double (double a0, double a1, double a2, double a3, double a4,
>> +			 double a5, double a6, double a7)
>> +{
>> +  if (a0 != FUNC_DOUBLE_ARG0)
>> +    FAIL_EXIT1 ("a0: %la != %la", a0, FUNC_DOUBLE_ARG0);
>> +  if (a1 != FUNC_DOUBLE_ARG1)
>> +    FAIL_EXIT1 ("a1: %la != %la", a1, FUNC_DOUBLE_ARG1);
>> +  if (a2 != FUNC_DOUBLE_ARG2)
>> +    FAIL_EXIT1 ("a2: %la != %la", a2, FUNC_DOUBLE_ARG2);
>> +  if (a3 != FUNC_DOUBLE_ARG3)
>> +    FAIL_EXIT1 ("a3: %la != %la", a3, FUNC_DOUBLE_ARG3);
>> +  if (a4 != FUNC_DOUBLE_ARG4)
>> +    FAIL_EXIT1 ("a4: %la != %la", a4, FUNC_DOUBLE_ARG4);
>> +  if (a5 != FUNC_DOUBLE_ARG5)
>> +    FAIL_EXIT1 ("a5: %la != %la", a5, FUNC_DOUBLE_ARG5);
>> +  if (a6 != FUNC_DOUBLE_ARG6)
>> +    FAIL_EXIT1 ("a6: %la != %la", a6, FUNC_DOUBLE_ARG6);
>> +  if (a7 != FUNC_DOUBLE_ARG7)
>> +    FAIL_EXIT1 ("a7: %la != %la", a7, FUNC_DOUBLE_ARG7);
>> +
>> +  return FUNC_DOUBLE_RET;
>> +}
>> +
>> +long double
>> +tst_audit27_func_ldouble (long double a0, long double a1, long double a2,
>> +			  long double a3, long double a4, long double a5,
>> +			  long double a6, long double a7)
>> +{
>> +  if (a0 != FUNC_LDOUBLE_ARG0)
>> +    FAIL_EXIT1 ("a0: %La != %La", a0, FUNC_LDOUBLE_ARG0);
>> +  if (a1 != FUNC_LDOUBLE_ARG1)
>> +    FAIL_EXIT1 ("a1: %La != %La", a1, FUNC_LDOUBLE_ARG1);
>> +  if (a2 != FUNC_LDOUBLE_ARG2)
>> +    FAIL_EXIT1 ("a2: %La != %La", a2, FUNC_LDOUBLE_ARG2);
>> +  if (a3 != FUNC_LDOUBLE_ARG3)
>> +    FAIL_EXIT1 ("a3: %La != %La", a3, FUNC_LDOUBLE_ARG3);
>> +  if (a4 != FUNC_LDOUBLE_ARG4)
>> +    FAIL_EXIT1 ("a4: %La != %La", a4, FUNC_LDOUBLE_ARG4);
>> +  if (a5 != FUNC_LDOUBLE_ARG5)
>> +    FAIL_EXIT1 ("a5: %La != %La", a5, FUNC_LDOUBLE_ARG5);
>> +  if (a6 != FUNC_LDOUBLE_ARG6)
>> +    FAIL_EXIT1 ("a6: %La != %La", a6, FUNC_LDOUBLE_ARG6);
>> +  if (a7 != FUNC_LDOUBLE_ARG7)
>> +    FAIL_EXIT1 ("a7: %La != %La", a7, FUNC_LDOUBLE_ARG7);
>> +
>> +  return FUNC_LDOUBLE_RET;
>> +}
> 
> OK.
> 
>> diff --git a/sysdeps/aarch64/tst-audit27mod.h b/sysdeps/aarch64/tst-audit27mod.h
>> new file mode 100644
>> index 0000000000..698df4d44f
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-audit27mod.h
>> @@ -0,0 +1,67 @@
>> +/* Check DT_AUDIT for aarch64 specific ABI.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#ifndef _TST_AUDIT27MOD_H
>> +#define _TST_AUDIT27MOD_H 1
>> +
>> +#include <float.h>
>> +
>> +#define FUNC_FLOAT_ARG0 FLT_MIN
>> +#define FUNC_FLOAT_ARG1 FLT_MAX
>> +#define FUNC_FLOAT_ARG2 FLT_EPSILON
>> +#define FUNC_FLOAT_ARG3 FLT_TRUE_MIN
>> +#define FUNC_FLOAT_ARG4 0.0f
>> +#define FUNC_FLOAT_ARG5 1.0f
>> +#define FUNC_FLOAT_ARG6 2.0f
>> +#define FUNC_FLOAT_ARG7 3.0f
>> +#define FUNC_FLOAT_RET  4.0f
>> +
>> +float
>> +tst_audit27_func_float (float a0, float a1, float a2, float a3, float a4,
>> +			float a5, float a6, float a7);
>> +
>> +#define FUNC_DOUBLE_ARG0 DBL_MIN
>> +#define FUNC_DOUBLE_ARG1 DBL_MAX
>> +#define FUNC_DOUBLE_ARG2 DBL_EPSILON
>> +#define FUNC_DOUBLE_ARG3 DBL_TRUE_MIN
>> +#define FUNC_DOUBLE_ARG4 0.0
>> +#define FUNC_DOUBLE_ARG5 1.0
>> +#define FUNC_DOUBLE_ARG6 2.0
>> +#define FUNC_DOUBLE_ARG7 3.0
>> +#define FUNC_DOUBLE_RET  0x1.fffffe0000001p+127
>> +
>> +double
>> +tst_audit27_func_double (double a0, double a1, double a2, double a3, double a4,
>> +			 double a5, double a6, double a7);
>> +
>> +#define FUNC_LDOUBLE_ARG0 DBL_MAX + 1.0L
>> +#define FUNC_LDOUBLE_ARG1 DBL_MAX + 2.0L
>> +#define FUNC_LDOUBLE_ARG2 DBL_MAX + 3.0L
>> +#define FUNC_LDOUBLE_ARG3 DBL_MAX + 4.0L
>> +#define FUNC_LDOUBLE_ARG4 DBL_MAX + 5.0L
>> +#define FUNC_LDOUBLE_ARG5 DBL_MAX + 6.0L
>> +#define FUNC_LDOUBLE_ARG6 DBL_MAX + 7.0L
>> +#define FUNC_LDOUBLE_ARG7 DBL_MAX + 8.0L
>> +#define FUNC_LDOUBLE_RET  0x1.fffffffffffff000000000000001p+1023L
>> +
>> +long double
>> +tst_audit27_func_ldouble (long double a0, long double a1, long double a2,
>> +			  long double a3, long double a4, long double a5,
>> +			  long double a6, long double a7);
>> +
>> +#endif
> 
> OK.
> 
>> diff --git a/sysdeps/aarch64/tst-auditmod26.c b/sysdeps/aarch64/tst-auditmod26.c
>> new file mode 100644
>> index 0000000000..91d224dfbe
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-auditmod26.c
>> @@ -0,0 +1,103 @@
>> +/* Check DT_AUDIT for aarch64 specific ABI.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ok.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <assert.h>
>> +#include <link.h>
>> +#include <string.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include "tst-audit26mod.h"
>> +
>> +#define TEST_NAME  "tst-audit26"
>> +
>> +#define AUDIT26_COOKIE 0
>> +
>> +unsigned int
>> +la_version (unsigned int v)
>> +{
>> +  return v;
> 
> OK. Always works :}
> 
>> +}
>> +
>> +unsigned int
>> +la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
>> +{
>> +  const char *p = strrchr (map->l_name, '/');
>> +  const char *l_name = p == NULL ? map->l_name : p + 1;
>> +  uintptr_t ck = -1;
>> +  if (strncmp (l_name, TEST_NAME, strlen (TEST_NAME)) == 0)
>> +    ck = AUDIT26_COOKIE;
>> +  *cookie = ck;
>> +  printf ("objopen: %ld, %s [cookie=%ld]\n", lmid, l_name, ck);
>> +  return ck == -1 ? 0 : LA_FLG_BINDFROM | LA_FLG_BINDTO;
>> +}
>> +
>> +ElfW(Addr)
>> +la_aarch64_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)),
>> +                         unsigned int ndx __attribute__ ((unused)),
>> +                         uintptr_t *refcook, uintptr_t *defcook,
>> +                         La_aarch64_regs *regs, unsigned int *flags,
>> +                         const char *symname, long int *framesizep)
>> +{
>> +  printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
>> +	  symname, (long int) sym->st_value, ndx, *flags);
>> +
>> +  if (strcmp (symname, "tst_audit26_func") == 0)
>> +    {
>> +      assert (regs->lr_xreg[0] == ARG1);
>> +      assert (regs->lr_xreg[1] == ARG2);
>> +      assert (regs->lr_xreg[2] == ARG3);
> 
> OK.
> 
>> +    }
>> +  else
>> +    abort ();
>> +
>> +  assert (regs->lr_vpcs == 0);
>> +
>> +  /* Clobber 'x8'.  */
>> +  asm volatile ("mov x8, -1" : : : "x8");
>> +
>> +  *framesizep = 1024;
>> +
>> +  return sym->st_value;
>> +}
>> +
>> +unsigned int
>> +la_aarch64_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
>> +                        uintptr_t *defcook,
>> +                        const struct La_aarch64_regs *inregs,
>> +                        struct La_aarch64_retval *outregs, const char *symname)
>> +{
>> +  printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u\n",
>> +	  symname, (long int) sym->st_value, ndx);
>> +
>> +  if (strcmp (symname, "tst_audit26_func") == 0)
>> +    {
>> +      assert (inregs->lr_xreg[0] == ARG1);
>> +      assert (inregs->lr_xreg[1] == ARG2);
>> +      assert (inregs->lr_xreg[2] == ARG3);
> 
> OK.
> 
>> +    }
>> +  else
>> +    abort ();
>> +
>> +  assert (inregs->lr_vpcs == 0);
>> +  assert (outregs->lrv_vpcs == 0);
>> +
>> +  /* Clobber 'x8'.  */
>> +  asm volatile ("mov x8, -1" : : : "x8");
> 
> OK.
> 
>> +
>> +  return 0;
>> +}
>> diff --git a/sysdeps/aarch64/tst-auditmod27.c b/sysdeps/aarch64/tst-auditmod27.c
>> new file mode 100644
>> index 0000000000..57936d7e70
>> --- /dev/null
>> +++ b/sysdeps/aarch64/tst-auditmod27.c
>> @@ -0,0 +1,180 @@
>> +/* Check DT_AUDIT for aarch64 specific ABI.
> 
> s/DT_AUDIT/LD_AUDIT/g

Ack.

> 
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <assert.h>
>> +#include <link.h>
>> +#include <string.h>
>> +#include <stddef.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include "tst-audit27mod.h"
>> +
>> +#define TEST_NAME  "tst-audit27"
>> +
>> +#define AUDIT27_COOKIE 0
>> +
>> +unsigned int
>> +la_version (unsigned int v)
>> +{
>> +  return v;
> 
> OK.
> 
>> +}
>> +
>> +unsigned int
>> +la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
>> +{
>> +  const char *p = strrchr (map->l_name, '/');
>> +  const char *l_name = p == NULL ? map->l_name : p + 1;
>> +  uintptr_t ck = -1;
>> +  if (strncmp (l_name, TEST_NAME, strlen (TEST_NAME)) == 0)
>> +    ck = AUDIT27_COOKIE;
>> +  *cookie = ck;
>> +  printf ("objopen: %ld, %s [%ld]\n", lmid, l_name, ck);
>> +  return ck == -1 ? 0 : LA_FLG_BINDFROM | LA_FLG_BINDTO;
>> +}
>> +
>> +ElfW(Addr)
>> +la_aarch64_gnu_pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
>> +			 uintptr_t *defcook, La_aarch64_regs *regs,
>> +			 unsigned int *flags, const char *symname,
>> +			 long int *framesizep)
>> +{
>> +  printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
>> +	  symname, (long int) sym->st_value, ndx, *flags);
>> +
>> +  if (strcmp (symname, "tst_audit27_func_float") == 0)
>> +    {
>> +      assert (regs->lr_vreg[0].s == FUNC_FLOAT_ARG0);
>> +      assert (regs->lr_vreg[1].s == FUNC_FLOAT_ARG1);
>> +      assert (regs->lr_vreg[2].s == FUNC_FLOAT_ARG2);
>> +      assert (regs->lr_vreg[3].s == FUNC_FLOAT_ARG3);
>> +      assert (regs->lr_vreg[4].s == FUNC_FLOAT_ARG4);
>> +      assert (regs->lr_vreg[5].s == FUNC_FLOAT_ARG5);
>> +      assert (regs->lr_vreg[6].s == FUNC_FLOAT_ARG6);
>> +      assert (regs->lr_vreg[7].s == FUNC_FLOAT_ARG7);
> 
> OK.
> 
>> +    }
>> +  else if (strcmp (symname, "tst_audit27_func_double") == 0)
>> +    {
>> +      assert (regs->lr_vreg[0].d == FUNC_DOUBLE_ARG0);
>> +      assert (regs->lr_vreg[1].d == FUNC_DOUBLE_ARG1);
>> +      assert (regs->lr_vreg[2].d == FUNC_DOUBLE_ARG2);
>> +      assert (regs->lr_vreg[3].d == FUNC_DOUBLE_ARG3);
>> +      assert (regs->lr_vreg[4].d == FUNC_DOUBLE_ARG4);
>> +      assert (regs->lr_vreg[5].d == FUNC_DOUBLE_ARG5);
>> +      assert (regs->lr_vreg[6].d == FUNC_DOUBLE_ARG6);
>> +      assert (regs->lr_vreg[7].d == FUNC_DOUBLE_ARG7);
> 
> OK.
> 
>> +    }
>> +  else if (strcmp (symname, "tst_audit27_func_ldouble") == 0)
>> +    {
>> +      assert (regs->lr_vreg[0].q == FUNC_LDOUBLE_ARG0);
>> +      assert (regs->lr_vreg[1].q == FUNC_LDOUBLE_ARG1);
>> +      assert (regs->lr_vreg[2].q == FUNC_LDOUBLE_ARG2);
>> +      assert (regs->lr_vreg[3].q == FUNC_LDOUBLE_ARG3);
>> +      assert (regs->lr_vreg[4].q == FUNC_LDOUBLE_ARG4);
>> +      assert (regs->lr_vreg[5].q == FUNC_LDOUBLE_ARG5);
>> +      assert (regs->lr_vreg[6].q == FUNC_LDOUBLE_ARG6);
>> +      assert (regs->lr_vreg[7].q == FUNC_LDOUBLE_ARG7);
> 
> OK.
> 
>> +    }
>> +  else
>> +    abort ();
>> +
>> +  assert (regs->lr_vpcs == 0);
>> +
>> +  /* Clobber the q registers on exit.  */
>> +  uint8_t v = 0xff;
>> +  asm volatile ("dup v0.8b, %w0" : : "r" (v) : "v0");
>> +  asm volatile ("dup v1.8b, %w0" : : "r" (v) : "v1");
>> +  asm volatile ("dup v2.8b, %w0" : : "r" (v) : "v2");
>> +  asm volatile ("dup v3.8b, %w0" : : "r" (v) : "v3");
>> +  asm volatile ("dup v4.8b, %w0" : : "r" (v) : "v4");
>> +  asm volatile ("dup v5.8b, %w0" : : "r" (v) : "v5");
>> +  asm volatile ("dup v6.8b, %w0" : : "r" (v) : "v6");
>> +  asm volatile ("dup v7.8b, %w0" : : "r" (v) : "v7");
> 
> OK.
> 
>> +
>> +  *framesizep = 1024;
>> +
>> +  return sym->st_value;
>> +}
>> +
>> +unsigned int
>> +la_aarch64_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
>> +                        uintptr_t *defcook,
>> +			const struct La_aarch64_regs *inregs,
>> +                        struct La_aarch64_retval *outregs,
>> +			const char *symname)
>> +{
>> +  printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u\n",
>> +	  symname, (long int) sym->st_value, ndx);
>> +
>> +  if (strcmp (symname, "tst_audit27_func_float") == 0)
>> +    {
>> +      assert (inregs->lr_vreg[0].s == FUNC_FLOAT_ARG0);
>> +      assert (inregs->lr_vreg[1].s == FUNC_FLOAT_ARG1);
>> +      assert (inregs->lr_vreg[2].s == FUNC_FLOAT_ARG2);
>> +      assert (inregs->lr_vreg[3].s == FUNC_FLOAT_ARG3);
>> +      assert (inregs->lr_vreg[4].s == FUNC_FLOAT_ARG4);
>> +      assert (inregs->lr_vreg[5].s == FUNC_FLOAT_ARG5);
>> +      assert (inregs->lr_vreg[6].s == FUNC_FLOAT_ARG6);
>> +      assert (inregs->lr_vreg[7].s == FUNC_FLOAT_ARG7);
>> +
>> +      assert (outregs->lrv_vreg[0].s == FUNC_FLOAT_RET);
>> +    }
>> +  else if (strcmp (symname, "tst_audit27_func_double") == 0)
>> +    {
>> +      assert (inregs->lr_vreg[0].d == FUNC_DOUBLE_ARG0);
>> +      assert (inregs->lr_vreg[1].d == FUNC_DOUBLE_ARG1);
>> +      assert (inregs->lr_vreg[2].d == FUNC_DOUBLE_ARG2);
>> +      assert (inregs->lr_vreg[3].d == FUNC_DOUBLE_ARG3);
>> +      assert (inregs->lr_vreg[4].d == FUNC_DOUBLE_ARG4);
>> +      assert (inregs->lr_vreg[5].d == FUNC_DOUBLE_ARG5);
>> +      assert (inregs->lr_vreg[6].d == FUNC_DOUBLE_ARG6);
>> +      assert (inregs->lr_vreg[7].d == FUNC_DOUBLE_ARG7);
>> +
>> +      assert (outregs->lrv_vreg[0].d == FUNC_DOUBLE_RET);
>> +    }
>> +  else if (strcmp (symname, "tst_audit27_func_ldouble") == 0)
>> +    {
>> +      assert (inregs->lr_vreg[0].q == FUNC_LDOUBLE_ARG0);
>> +      assert (inregs->lr_vreg[1].q == FUNC_LDOUBLE_ARG1);
>> +      assert (inregs->lr_vreg[2].q == FUNC_LDOUBLE_ARG2);
>> +      assert (inregs->lr_vreg[3].q == FUNC_LDOUBLE_ARG3);
>> +      assert (inregs->lr_vreg[4].q == FUNC_LDOUBLE_ARG4);
>> +      assert (inregs->lr_vreg[5].q == FUNC_LDOUBLE_ARG5);
>> +      assert (inregs->lr_vreg[6].q == FUNC_LDOUBLE_ARG6);
>> +      assert (inregs->lr_vreg[7].q == FUNC_LDOUBLE_ARG7);
>> +
>> +      assert (outregs->lrv_vreg[0].q == FUNC_LDOUBLE_RET);
>> +    }
>> +  else
>> +    abort ();
>> +
>> +  assert (inregs->lr_vpcs == 0);
>> +  assert (outregs->lrv_vpcs == 0);
>> +
>> +  /* Clobber the q registers on exit.  */
>> +  uint8_t v = 0xff;
>> +  asm volatile ("dup v0.8b, %w0" : : "r" (v) : "v0");
>> +  asm volatile ("dup v1.8b, %w0" : : "r" (v) : "v1");
>> +  asm volatile ("dup v2.8b, %w0" : : "r" (v) : "v2");
>> +  asm volatile ("dup v3.8b, %w0" : : "r" (v) : "v3");
>> +  asm volatile ("dup v4.8b, %w0" : : "r" (v) : "v4");
>> +  asm volatile ("dup v5.8b, %w0" : : "r" (v) : "v5");
>> +  asm volatile ("dup v6.8b, %w0" : : "r" (v) : "v6");
>> +  asm volatile ("dup v7.8b, %w0" : : "r" (v) : "v7");
> 
> OK.
> 
>> +
>> +  return 0;
>> +}
>> diff --git a/sysdeps/generic/dl-audit-check.h b/sysdeps/generic/dl-audit-check.h
>> new file mode 100644
>> index 0000000000..3ab7653286
>> --- /dev/null
>> +++ b/sysdeps/generic/dl-audit-check.h
>> @@ -0,0 +1,23 @@
>> +/* rtld-audit version check.  Generic version.
>> +   Copyright (C) 2022 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +static inline bool
>> +_dl_audit_check_version (unsigned int lav)
>> +{
>> +  return lav <= LAV_CURRENT;
>> +}
> 
> OK. For non-aarch64 the older versions are compatible.
> 

  reply	other threads:[~2022-02-01 14:11 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-25 18:36 [PATCH v12 0/4] Multiple rtld-audit fixes Adhemerval Zanella
2022-01-25 18:36 ` [PATCH v12 1/4] elf: Add la_activity during application exit Adhemerval Zanella
2022-01-26 11:42   ` Florian Weimer
2022-01-26 12:18     ` Adhemerval Zanella
2022-01-26 12:25       ` Florian Weimer
2022-02-01  4:21   ` Carlos O'Donell
2022-02-01 13:30     ` Adhemerval Zanella
2022-01-25 18:36 ` [PATCH v12 2/4] elf: Fix initial-exec TLS access on audit modules (BZ #28096) Adhemerval Zanella
2022-02-01  5:29   ` Carlos O'Donell
2022-02-01 13:35     ` Adhemerval Zanella
2022-01-25 18:36 ` [PATCH v12 3/4] elf: Issue la_symbind for bind-now (BZ #23734) Adhemerval Zanella
2022-02-01  6:06   ` Carlos O'Donell
2022-02-01 13:47     ` Adhemerval Zanella
2022-01-25 18:37 ` [PATCH v12 4/4] elf: Fix runtime linker auditing on aarch64 (BZ #26643) Adhemerval Zanella
2022-02-01  6:19   ` Carlos O'Donell
2022-02-01 14:11     ` Adhemerval Zanella [this message]
2022-02-01  6:45 ` [PATCH v12 0/4] Multiple rtld-audit fixes Carlos O'Donell
2022-02-01  7:53   ` John Mellor-Crummey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d7b53272-dfe5-8ae6-6787-df3bf7cdface@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=carlos@redhat.com \
    --cc=jma14@rice.edu \
    --cc=johnmc@rice.edu \
    --cc=libc-alpha@sourceware.org \
    --cc=szabolcs.nagy@arm.com \
    --cc=woodard@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).