mirror of git://sourceware.org/git/glibc.git
AArch64: Cleanup PAC and BTI
Now we finally support modern GCC and binutils, it's time for a cleanup. Use PAC and BTI instructions unconditionally and use proper assembler syntax. Remove the PR target/94791 strip_pac workarounds for buggy GCCs. Remove the PAC/BTI configure checks - always emit GNU property notes on assembly files. Change cfi_window_save to the correct cfi_negate_ra_state unwind directive. Reviewed-by: Matthieu Longo <matthieu.longo@arm.com>
This commit is contained in:
parent
96abd59bf2
commit
2c421fc430
|
|
@ -113,12 +113,6 @@
|
||||||
/* AArch64 big endian ABI */
|
/* AArch64 big endian ABI */
|
||||||
#undef HAVE_AARCH64_BE
|
#undef HAVE_AARCH64_BE
|
||||||
|
|
||||||
/* AArch64 BTI support enabled. */
|
|
||||||
#define HAVE_AARCH64_BTI 0
|
|
||||||
|
|
||||||
/* AArch64 PAC-RET code generation is enabled. */
|
|
||||||
#define HAVE_AARCH64_PAC_RET 0
|
|
||||||
|
|
||||||
/* Assembler support ARMv8.2-A SVE.
|
/* Assembler support ARMv8.2-A SVE.
|
||||||
This macro becomes obsolete when glibc increased the minimum
|
This macro becomes obsolete when glibc increased the minimum
|
||||||
required version of GNU 'binutils' to 2.28 or later. */
|
required version of GNU 'binutils' to 2.28 or later. */
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#ifdef __aarch64__
|
||||||
/* GNU_PROPERTY_AARCH64_* macros from elf.h for use in asm code. */
|
/* GNU_PROPERTY_AARCH64_* macros from elf.h for use in asm code. */
|
||||||
#define FEATURE_1_AND 0xc0000000
|
#define FEATURE_1_AND 0xc0000000
|
||||||
#define FEATURE_1_BTI 1
|
#define FEATURE_1_BTI 1
|
||||||
|
|
@ -42,8 +43,5 @@
|
||||||
|
|
||||||
/* Add GNU property note with the supported features to all asm code
|
/* Add GNU property note with the supported features to all asm code
|
||||||
where sysdep.h is included. */
|
where sysdep.h is included. */
|
||||||
#if HAVE_AARCH64_BTI && HAVE_AARCH64_PAC_RET
|
|
||||||
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC|FEATURE_1_GCS)
|
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC|FEATURE_1_GCS)
|
||||||
#elif HAVE_AARCH64_BTI
|
|
||||||
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_GCS)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -88,10 +88,8 @@ L(save_loop):
|
||||||
L(end):
|
L(end):
|
||||||
ret
|
ret
|
||||||
L(fail):
|
L(fail):
|
||||||
#if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
#endif
|
|
||||||
stp x29, x30, [sp, -32]!
|
stp x29, x30, [sp, -32]!
|
||||||
cfi_adjust_cfa_offset (32)
|
cfi_adjust_cfa_offset (32)
|
||||||
cfi_rel_offset (x29, 0)
|
cfi_rel_offset (x29, 0)
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,8 @@ ENTRY (__longjmp)
|
||||||
|
|
||||||
#if IS_IN(libc)
|
#if IS_IN(libc)
|
||||||
/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */
|
/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */
|
||||||
# if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# endif
|
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
cfi_adjust_cfa_offset (16)
|
cfi_adjust_cfa_offset (16)
|
||||||
cfi_rel_offset (x29, 0)
|
cfi_rel_offset (x29, 0)
|
||||||
|
|
@ -41,10 +39,8 @@ ENTRY (__longjmp)
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
cfi_restore (x29)
|
cfi_restore (x29)
|
||||||
cfi_restore (x30)
|
cfi_restore (x30)
|
||||||
# if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cfi_def_cfa (x0, 0)
|
cfi_def_cfa (x0, 0)
|
||||||
|
|
|
||||||
|
|
@ -185,93 +185,6 @@ else
|
||||||
default-abi = lp64"
|
default-abi = lp64"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Only consider BTI supported if -mbranch-protection=bti is
|
|
||||||
# on by default in the compiler and the linker produces
|
|
||||||
# binaries with GNU property notes in PT_GNU_PROPERTY segment.
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BTI support" >&5
|
|
||||||
printf %s "checking for BTI support... " >&6; }
|
|
||||||
if test ${libc_cv_aarch64_bti+y}
|
|
||||||
then :
|
|
||||||
printf %s "(cached) " >&6
|
|
||||||
else case e in #(
|
|
||||||
e) cat > conftest.c <<EOF
|
|
||||||
void foo (void) { }
|
|
||||||
EOF
|
|
||||||
libc_cv_aarch64_bti=no
|
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c'
|
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
||||||
(eval $ac_try) 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; } \
|
|
||||||
&& { ac_try='$READELF -lW conftest.so | grep -q GNU_PROPERTY'
|
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
||||||
(eval $ac_try) 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; } \
|
|
||||||
&& { ac_try='$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"'
|
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
||||||
(eval $ac_try) 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; }
|
|
||||||
then
|
|
||||||
libc_cv_aarch64_bti=yes
|
|
||||||
fi
|
|
||||||
rm -rf conftest.* ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_bti" >&5
|
|
||||||
printf "%s\n" "$libc_cv_aarch64_bti" >&6; }
|
|
||||||
config_vars="$config_vars
|
|
||||||
aarch64-bti = $libc_cv_aarch64_bti"
|
|
||||||
if test $libc_cv_aarch64_bti = yes; then
|
|
||||||
printf "%s\n" "#define HAVE_AARCH64_BTI 1" >>confdefs.h
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if glibc is built with return address signing, i.e.
|
|
||||||
# if -mbranch-protection=pac-ret is on. We need this because
|
|
||||||
# pac-ret relies on unwinder support so it's not safe to use
|
|
||||||
# it in assembly code unconditionally, but there is no
|
|
||||||
# feature test macro for it in gcc.
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if pac-ret is enabled" >&5
|
|
||||||
printf %s "checking if pac-ret is enabled... " >&6; }
|
|
||||||
if test ${libc_cv_aarch64_pac_ret+y}
|
|
||||||
then :
|
|
||||||
printf %s "(cached) " >&6
|
|
||||||
else case e in #(
|
|
||||||
e) cat > conftest.c <<EOF
|
|
||||||
int bar (void);
|
|
||||||
int foo (void) { return bar () + 1; }
|
|
||||||
EOF
|
|
||||||
libc_cv_aarch64_pac_ret=no
|
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -S -o conftest.s conftest.c'
|
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
||||||
(eval $ac_try) 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; } \
|
|
||||||
&& { ac_try='grep -q -E '\''(hint( | )+25|paciasp)'\'' conftest.s'
|
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
||||||
(eval $ac_try) 2>&5
|
|
||||||
ac_status=$?
|
|
||||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
||||||
test $ac_status = 0; }; }
|
|
||||||
then
|
|
||||||
libc_cv_aarch64_pac_ret=yes
|
|
||||||
fi
|
|
||||||
rm -rf conftest.* ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_pac_ret" >&5
|
|
||||||
printf "%s\n" "$libc_cv_aarch64_pac_ret" >&6; }
|
|
||||||
if test $libc_cv_aarch64_pac_ret = yes; then
|
|
||||||
printf "%s\n" "#define HAVE_AARCH64_PAC_RET 1" >>confdefs.h
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if binutils supports variant PCS symbols.
|
# Check if binutils supports variant PCS symbols.
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for variant PCS support" >&5
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for variant PCS support" >&5
|
||||||
printf %s "checking for variant PCS support... " >&6; }
|
printf %s "checking for variant PCS support... " >&6; }
|
||||||
|
|
|
||||||
|
|
@ -24,47 +24,6 @@ else
|
||||||
LIBC_CONFIG_VAR([default-abi], [lp64])
|
LIBC_CONFIG_VAR([default-abi], [lp64])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Only consider BTI supported if -mbranch-protection=bti is
|
|
||||||
# on by default in the compiler and the linker produces
|
|
||||||
# binaries with GNU property notes in PT_GNU_PROPERTY segment.
|
|
||||||
AC_CACHE_CHECK([for BTI support], [libc_cv_aarch64_bti], [dnl
|
|
||||||
cat > conftest.c <<EOF
|
|
||||||
void foo (void) { }
|
|
||||||
EOF
|
|
||||||
libc_cv_aarch64_bti=no
|
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c]) \
|
|
||||||
&& AC_TRY_COMMAND([$READELF -lW conftest.so | grep -q GNU_PROPERTY]) \
|
|
||||||
&& AC_TRY_COMMAND([$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"])
|
|
||||||
then
|
|
||||||
libc_cv_aarch64_bti=yes
|
|
||||||
fi
|
|
||||||
rm -rf conftest.*])
|
|
||||||
LIBC_CONFIG_VAR([aarch64-bti], [$libc_cv_aarch64_bti])
|
|
||||||
if test $libc_cv_aarch64_bti = yes; then
|
|
||||||
AC_DEFINE(HAVE_AARCH64_BTI)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if glibc is built with return address signing, i.e.
|
|
||||||
# if -mbranch-protection=pac-ret is on. We need this because
|
|
||||||
# pac-ret relies on unwinder support so it's not safe to use
|
|
||||||
# it in assembly code unconditionally, but there is no
|
|
||||||
# feature test macro for it in gcc.
|
|
||||||
AC_CACHE_CHECK([if pac-ret is enabled], [libc_cv_aarch64_pac_ret], [dnl
|
|
||||||
cat > conftest.c <<EOF
|
|
||||||
int bar (void);
|
|
||||||
int foo (void) { return bar () + 1; }
|
|
||||||
EOF
|
|
||||||
libc_cv_aarch64_pac_ret=no
|
|
||||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -S -o conftest.s conftest.c]) \
|
|
||||||
&& AC_TRY_COMMAND([grep -q -E '\''(hint( | )+25|paciasp)'\'' conftest.s])
|
|
||||||
then
|
|
||||||
libc_cv_aarch64_pac_ret=yes
|
|
||||||
fi
|
|
||||||
rm -rf conftest.*])
|
|
||||||
if test $libc_cv_aarch64_pac_ret = yes; then
|
|
||||||
AC_DEFINE(HAVE_AARCH64_PAC_RET)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if binutils supports variant PCS symbols.
|
# Check if binutils supports variant PCS symbols.
|
||||||
AC_CACHE_CHECK([for variant PCS support], [libc_cv_aarch64_variant_pcs], [dnl
|
AC_CACHE_CHECK([for variant PCS support], [libc_cv_aarch64_variant_pcs], [dnl
|
||||||
cat > conftest.S <<EOF
|
cat > conftest.S <<EOF
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ call_weak_fn:
|
||||||
cbz x0, 1f
|
cbz x0, 1f
|
||||||
b PREINIT_FUNCTION
|
b PREINIT_FUNCTION
|
||||||
1:
|
1:
|
||||||
RET
|
ret
|
||||||
.size call_weak_fn, .-call_weak_fn
|
.size call_weak_fn, .-call_weak_fn
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -75,11 +75,7 @@ call_weak_fn:
|
||||||
.hidden _init
|
.hidden _init
|
||||||
.type _init, %function
|
.type _init, %function
|
||||||
_init:
|
_init:
|
||||||
#if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
|
||||||
#else
|
|
||||||
BTI_C
|
|
||||||
#endif
|
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
mov x29, sp
|
mov x29, sp
|
||||||
#if PREINIT_FUNCTION_WEAK
|
#if PREINIT_FUNCTION_WEAK
|
||||||
|
|
@ -94,10 +90,6 @@ _init:
|
||||||
.hidden _fini
|
.hidden _fini
|
||||||
.type _fini, %function
|
.type _fini, %function
|
||||||
_fini:
|
_fini:
|
||||||
#if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
|
||||||
#else
|
|
||||||
BTI_C
|
|
||||||
#endif
|
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
mov x29, sp
|
mov x29, sp
|
||||||
|
|
|
||||||
|
|
@ -41,14 +41,10 @@
|
||||||
|
|
||||||
.section .init,"ax",%progbits
|
.section .init,"ax",%progbits
|
||||||
ldp x29, x30, [sp], 16
|
ldp x29, x30, [sp], 16
|
||||||
#if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
ret
|
||||||
#endif
|
|
||||||
RET
|
|
||||||
|
|
||||||
.section .fini,"ax",%progbits
|
.section .fini,"ax",%progbits
|
||||||
ldp x29, x30, [sp], 16
|
ldp x29, x30, [sp], 16
|
||||||
#if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
ret
|
||||||
#endif
|
|
||||||
RET
|
|
||||||
|
|
|
||||||
|
|
@ -74,9 +74,9 @@
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_tlsdesc_return:
|
_dl_tlsdesc_return:
|
||||||
BTI_C
|
bti c
|
||||||
ldr x0, [x0, 8]
|
ldr x0, [x0, 8]
|
||||||
RET
|
ret
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size _dl_tlsdesc_return, .-_dl_tlsdesc_return
|
.size _dl_tlsdesc_return, .-_dl_tlsdesc_return
|
||||||
|
|
||||||
|
|
@ -95,7 +95,7 @@ _dl_tlsdesc_return:
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_tlsdesc_undefweak:
|
_dl_tlsdesc_undefweak:
|
||||||
BTI_C
|
bti c
|
||||||
str x1, [sp, #-16]!
|
str x1, [sp, #-16]!
|
||||||
cfi_adjust_cfa_offset (16)
|
cfi_adjust_cfa_offset (16)
|
||||||
ldr x0, [x0, 8]
|
ldr x0, [x0, 8]
|
||||||
|
|
@ -103,7 +103,7 @@ _dl_tlsdesc_undefweak:
|
||||||
sub x0, x0, x1
|
sub x0, x0, x1
|
||||||
ldr x1, [sp], #16
|
ldr x1, [sp], #16
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
RET
|
ret
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
|
.size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
|
||||||
|
|
||||||
|
|
@ -141,12 +141,8 @@ _dl_tlsdesc_undefweak:
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_tlsdesc_dynamic:
|
_dl_tlsdesc_dynamic:
|
||||||
# if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# else
|
|
||||||
BTI_C
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* Save just enough registers to support fast path, if we fall
|
/* Save just enough registers to support fast path, if we fall
|
||||||
into slow path we will save additional registers. */
|
into slow path we will save additional registers. */
|
||||||
|
|
@ -177,12 +173,10 @@ _dl_tlsdesc_dynamic:
|
||||||
1:
|
1:
|
||||||
ldp x3, x4, [sp, #16]
|
ldp x3, x4, [sp, #16]
|
||||||
ldp x1, x2, [sp], #32
|
ldp x1, x2, [sp], #32
|
||||||
# if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# endif
|
|
||||||
cfi_adjust_cfa_offset (-32)
|
cfi_adjust_cfa_offset (-32)
|
||||||
RET
|
ret
|
||||||
2:
|
2:
|
||||||
/* This is the slow path. We need to call __tls_get_addr() which
|
/* This is the slow path. We need to call __tls_get_addr() which
|
||||||
means we need to save and restore all the register that the
|
means we need to save and restore all the register that the
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_runtime_resolve:
|
_dl_runtime_resolve:
|
||||||
BTI_C
|
bti c
|
||||||
/* AArch64 we get called with:
|
/* AArch64 we get called with:
|
||||||
ip0 &PLTGOT[2]
|
ip0 &PLTGOT[2]
|
||||||
ip1 temp(dl resolver entry point)
|
ip1 temp(dl resolver entry point)
|
||||||
|
|
@ -127,12 +127,8 @@ _dl_runtime_resolve:
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_runtime_profile:
|
_dl_runtime_profile:
|
||||||
# if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# else
|
|
||||||
BTI_C
|
|
||||||
# endif
|
|
||||||
/* AArch64 we get called with:
|
/* AArch64 we get called with:
|
||||||
ip0 &PLTGOT[2]
|
ip0 &PLTGOT[2]
|
||||||
ip1 temp(dl resolver entry point)
|
ip1 temp(dl resolver entry point)
|
||||||
|
|
@ -251,17 +247,12 @@ _dl_runtime_profile:
|
||||||
cfi_restore(x29)
|
cfi_restore(x29)
|
||||||
cfi_restore(x30)
|
cfi_restore(x30)
|
||||||
|
|
||||||
# if HAVE_AARCH64_PAC_RET
|
|
||||||
add sp, sp, SF_SIZE
|
add sp, sp, SF_SIZE
|
||||||
cfi_adjust_cfa_offset (-SF_SIZE)
|
cfi_adjust_cfa_offset (-SF_SIZE)
|
||||||
AUTIASP
|
autiasp
|
||||||
cfi_window_save
|
cfi_negate_ra_state
|
||||||
add sp, sp, 16
|
add sp, sp, 16
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
# else
|
|
||||||
add sp, sp, SF_SIZE + 16
|
|
||||||
cfi_adjust_cfa_offset (- SF_SIZE - 16)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* Jump to the newly found address. */
|
/* Jump to the newly found address. */
|
||||||
br ip0
|
br ip0
|
||||||
|
|
@ -321,10 +312,8 @@ _dl_runtime_profile:
|
||||||
/* LR from within La_aarch64_reg */
|
/* LR from within La_aarch64_reg */
|
||||||
ldr lr, [x29, #OFFSET_RG + DL_OFFSET_RG_LR]
|
ldr lr, [x29, #OFFSET_RG + DL_OFFSET_RG_LR]
|
||||||
cfi_restore(lr)
|
cfi_restore(lr)
|
||||||
# if HAVE_AARCH64_PAC_RET
|
|
||||||
/* Note: LR restored from La_aarch64_reg has no PAC. */
|
/* Note: LR restored from La_aarch64_reg has no PAC. */
|
||||||
cfi_window_save
|
cfi_negate_ra_state
|
||||||
# endif
|
|
||||||
mov sp, x29
|
mov sp, x29
|
||||||
cfi_def_cfa_register (sp)
|
cfi_def_cfa_register (sp)
|
||||||
ldr x29, [x29, #0]
|
ldr x29, [x29, #0]
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,8 @@ static void mcount_internal (u_long frompc, u_long selfpc);
|
||||||
#define _MCOUNT_DECL(frompc, selfpc) \
|
#define _MCOUNT_DECL(frompc, selfpc) \
|
||||||
static inline void mcount_internal (u_long frompc, u_long selfpc)
|
static inline void mcount_internal (u_long frompc, u_long selfpc)
|
||||||
|
|
||||||
/* Note: strip_pac is needed for frompc because of gcc PR target/94791. */
|
|
||||||
#define MCOUNT \
|
#define MCOUNT \
|
||||||
void __mcount (void *frompc) \
|
void __mcount (void *frompc) \
|
||||||
{ \
|
{ \
|
||||||
mcount_internal ((u_long) strip_pac (frompc), (u_long) RETURN_ADDRESS (0)); \
|
mcount_internal ((u_long) frompc, (u_long) RETURN_ADDRESS (0)); \
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
|
||||||
IFUNC_IMPL (i, name, memcpy,
|
IFUNC_IMPL (i, name, memcpy,
|
||||||
IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_oryon1)
|
IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_oryon1)
|
||||||
#if HAVE_AARCH64_SVE_ASM
|
#if HAVE_AARCH64_SVE_ASM
|
||||||
IFUNC_IMPL_ADD (array, i, memcpy, sve && !bti, __memcpy_a64fx)
|
IFUNC_IMPL_ADD (array, i, memcpy, sve, __memcpy_a64fx)
|
||||||
IFUNC_IMPL_ADD (array, i, memcpy, sve, __memcpy_sve)
|
IFUNC_IMPL_ADD (array, i, memcpy, sve, __memcpy_sve)
|
||||||
#endif
|
#endif
|
||||||
IFUNC_IMPL_ADD (array, i, memcpy, mops, __memcpy_mops)
|
IFUNC_IMPL_ADD (array, i, memcpy, mops, __memcpy_mops)
|
||||||
|
|
@ -45,7 +45,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
|
||||||
IFUNC_IMPL (i, name, memmove,
|
IFUNC_IMPL (i, name, memmove,
|
||||||
IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_oryon1)
|
IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_oryon1)
|
||||||
#if HAVE_AARCH64_SVE_ASM
|
#if HAVE_AARCH64_SVE_ASM
|
||||||
IFUNC_IMPL_ADD (array, i, memmove, sve && !bti, __memmove_a64fx)
|
IFUNC_IMPL_ADD (array, i, memmove, sve, __memmove_a64fx)
|
||||||
IFUNC_IMPL_ADD (array, i, memmove, sve, __memmove_sve)
|
IFUNC_IMPL_ADD (array, i, memmove, sve, __memmove_sve)
|
||||||
#endif
|
#endif
|
||||||
IFUNC_IMPL_ADD (array, i, memmove, mops, __memmove_mops)
|
IFUNC_IMPL_ADD (array, i, memmove, mops, __memmove_mops)
|
||||||
|
|
@ -56,7 +56,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
|
||||||
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_emag)
|
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_emag)
|
||||||
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_kunpeng)
|
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_kunpeng)
|
||||||
#if HAVE_AARCH64_SVE_ASM
|
#if HAVE_AARCH64_SVE_ASM
|
||||||
IFUNC_IMPL_ADD (array, i, memset, sve && !bti && zva_size == 256, __memset_a64fx)
|
IFUNC_IMPL_ADD (array, i, memset, sve && zva_size == 256, __memset_a64fx)
|
||||||
IFUNC_IMPL_ADD (array, i, memset, sve && zva_size == 64, __memset_sve_zva64)
|
IFUNC_IMPL_ADD (array, i, memset, sve && zva_size == 64, __memset_sve_zva64)
|
||||||
#endif
|
#endif
|
||||||
IFUNC_IMPL_ADD (array, i, memset, mops, __memset_mops)
|
IFUNC_IMPL_ADD (array, i, memset, mops, __memset_mops)
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
unsigned __attribute__((unused)) zva_size = \
|
unsigned __attribute__((unused)) zva_size = \
|
||||||
GLRO(dl_aarch64_cpu_features).zva_size; \
|
GLRO(dl_aarch64_cpu_features).zva_size; \
|
||||||
bool __attribute__((unused)) bti = \
|
bool __attribute__((unused)) bti = \
|
||||||
HAVE_AARCH64_BTI && GLRO(dl_aarch64_cpu_features).bti; \
|
GLRO(dl_aarch64_cpu_features).bti; \
|
||||||
bool __attribute__((unused)) mte = \
|
bool __attribute__((unused)) mte = \
|
||||||
MTE_ENABLED (); \
|
MTE_ENABLED (); \
|
||||||
bool __attribute__((unused)) sve = \
|
bool __attribute__((unused)) sve = \
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,6 @@
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
#undef BTI_C
|
|
||||||
#define BTI_C
|
|
||||||
|
|
||||||
/* Assumptions:
|
/* Assumptions:
|
||||||
*
|
*
|
||||||
* ARMv8.2-a, AArch64, unaligned accesses, sve
|
* ARMv8.2-a, AArch64, unaligned accesses, sve
|
||||||
|
|
@ -91,9 +88,6 @@
|
||||||
st1b z7.b, p0, [dst, 7, mul vl]
|
st1b z7.b, p0, [dst, 7, mul vl]
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#undef BTI_C
|
|
||||||
#define BTI_C
|
|
||||||
|
|
||||||
ENTRY (__memcpy_a64fx)
|
ENTRY (__memcpy_a64fx)
|
||||||
|
|
||||||
cntb vlen
|
cntb vlen
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,6 @@
|
||||||
.endif
|
.endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
#undef BTI_C
|
|
||||||
#define BTI_C
|
|
||||||
|
|
||||||
ENTRY (__memset_a64fx)
|
ENTRY (__memset_a64fx)
|
||||||
|
|
||||||
cntb vector_length
|
cntb vector_length
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,8 @@ ENTRY_ALIGN (__sigsetjmp, 2)
|
||||||
|
|
||||||
#if IS_IN(libc)
|
#if IS_IN(libc)
|
||||||
/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */
|
/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so. */
|
||||||
# if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# endif
|
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
cfi_adjust_cfa_offset (16)
|
cfi_adjust_cfa_offset (16)
|
||||||
cfi_rel_offset (x29, 0)
|
cfi_rel_offset (x29, 0)
|
||||||
|
|
@ -52,10 +50,8 @@ ENTRY_ALIGN (__sigsetjmp, 2)
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
cfi_restore (x29)
|
cfi_restore (x29)
|
||||||
cfi_restore (x30)
|
cfi_restore (x30)
|
||||||
# if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stp x19, x20, [x0, #JB_X19<<3]
|
stp x19, x20, [x0, #JB_X19<<3]
|
||||||
|
|
@ -96,7 +92,7 @@ L(gcs_done):
|
||||||
#if IS_IN (rtld)
|
#if IS_IN (rtld)
|
||||||
/* In ld.so we never save the signal mask */
|
/* In ld.so we never save the signal mask */
|
||||||
mov w0, #0
|
mov w0, #0
|
||||||
RET
|
ret
|
||||||
#else
|
#else
|
||||||
b C_SYMBOL_NAME(__sigjmp_save)
|
b C_SYMBOL_NAME(__sigjmp_save)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ ENTRY(_start)
|
||||||
because crt1.o and rcrt1.o share code and the later must avoid the
|
because crt1.o and rcrt1.o share code and the later must avoid the
|
||||||
use of GOT relocations before __libc_start_main is called. */
|
use of GOT relocations before __libc_start_main is called. */
|
||||||
__wrap_main:
|
__wrap_main:
|
||||||
BTI_C
|
bti c
|
||||||
b main
|
b main
|
||||||
#endif
|
#endif
|
||||||
END(_start)
|
END(_start)
|
||||||
|
|
|
||||||
|
|
@ -21,43 +21,15 @@
|
||||||
|
|
||||||
#include <sysdeps/generic/sysdep.h>
|
#include <sysdeps/generic/sysdep.h>
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
|
||||||
/* Strip pointer authentication code from pointer p. */
|
|
||||||
static inline void *
|
|
||||||
strip_pac (void *p)
|
|
||||||
{
|
|
||||||
register void *ra asm ("x30") = (p);
|
|
||||||
asm ("hint 7 // xpaclri" : "+r"(ra));
|
|
||||||
return ra;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is needed when glibc is built with -mbranch-protection=pac-ret
|
|
||||||
with a gcc that is affected by PR target/94891. */
|
|
||||||
# if HAVE_AARCH64_PAC_RET
|
|
||||||
# undef RETURN_ADDRESS
|
|
||||||
# define RETURN_ADDRESS(n) strip_pac (__builtin_return_address (n))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __ASSEMBLER__
|
#ifdef __ASSEMBLER__
|
||||||
|
|
||||||
|
/* CFI directive for return address. */
|
||||||
|
#define cfi_negate_ra_state .cfi_negate_ra_state
|
||||||
|
|
||||||
/* Syntactic details of assembler. */
|
/* Syntactic details of assembler. */
|
||||||
|
|
||||||
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
|
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
|
||||||
|
|
||||||
/* Branch Target Identitication support. */
|
|
||||||
#if HAVE_AARCH64_BTI
|
|
||||||
# define BTI_C hint 34
|
|
||||||
# define BTI_J hint 36
|
|
||||||
#else
|
|
||||||
# define BTI_C nop
|
|
||||||
# define BTI_J nop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return address signing support (pac-ret). */
|
|
||||||
#define PACIASP hint 25
|
|
||||||
#define AUTIASP hint 29
|
|
||||||
|
|
||||||
/* Guarded Control Stack support. */
|
/* Guarded Control Stack support. */
|
||||||
#define CHKFEAT_X16 hint 40
|
#define CHKFEAT_X16 hint 40
|
||||||
#define MRS_GCSPR(x) mrs x, s3_3_c2_c5_1
|
#define MRS_GCSPR(x) mrs x, s3_3_c2_c5_1
|
||||||
|
|
@ -87,11 +59,7 @@ strip_pac (void *p)
|
||||||
|
|
||||||
/* Add GNU property note with the supported features to all asm code
|
/* Add GNU property note with the supported features to all asm code
|
||||||
where sysdep.h is included. */
|
where sysdep.h is included. */
|
||||||
#if HAVE_AARCH64_BTI && HAVE_AARCH64_PAC_RET
|
|
||||||
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC|FEATURE_1_GCS)
|
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC|FEATURE_1_GCS)
|
||||||
#elif HAVE_AARCH64_BTI
|
|
||||||
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_GCS)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define an entry point visible from C. */
|
/* Define an entry point visible from C. */
|
||||||
#define ENTRY(name) \
|
#define ENTRY(name) \
|
||||||
|
|
@ -100,7 +68,7 @@ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_GCS)
|
||||||
.p2align 6; \
|
.p2align 6; \
|
||||||
C_LABEL(name) \
|
C_LABEL(name) \
|
||||||
cfi_startproc; \
|
cfi_startproc; \
|
||||||
BTI_C; \
|
bti c; \
|
||||||
CALL_MCOUNT
|
CALL_MCOUNT
|
||||||
|
|
||||||
/* Define an entry point visible from C. */
|
/* Define an entry point visible from C. */
|
||||||
|
|
@ -110,7 +78,7 @@ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_GCS)
|
||||||
.p2align align; \
|
.p2align align; \
|
||||||
C_LABEL(name) \
|
C_LABEL(name) \
|
||||||
cfi_startproc; \
|
cfi_startproc; \
|
||||||
BTI_C; \
|
bti c; \
|
||||||
CALL_MCOUNT
|
CALL_MCOUNT
|
||||||
|
|
||||||
/* Define an entry point visible from C with a specified alignment and
|
/* Define an entry point visible from C with a specified alignment and
|
||||||
|
|
@ -127,7 +95,7 @@ GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_GCS)
|
||||||
.endr; \
|
.endr; \
|
||||||
C_LABEL(name) \
|
C_LABEL(name) \
|
||||||
cfi_startproc; \
|
cfi_startproc; \
|
||||||
BTI_C; \
|
bti c; \
|
||||||
CALL_MCOUNT
|
CALL_MCOUNT
|
||||||
|
|
||||||
#undef END
|
#undef END
|
||||||
|
|
|
||||||
|
|
@ -49,10 +49,8 @@ ENTRY (__setcontext)
|
||||||
b C_SYMBOL_NAME (__syscall_error)
|
b C_SYMBOL_NAME (__syscall_error)
|
||||||
1:
|
1:
|
||||||
/* Disable ZA of SME. */
|
/* Disable ZA of SME. */
|
||||||
#if HAVE_AARCH64_PAC_RET
|
paciasp
|
||||||
PACIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
#endif
|
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
cfi_adjust_cfa_offset (16)
|
cfi_adjust_cfa_offset (16)
|
||||||
cfi_rel_offset (x29, 0)
|
cfi_rel_offset (x29, 0)
|
||||||
|
|
@ -63,10 +61,8 @@ ENTRY (__setcontext)
|
||||||
cfi_adjust_cfa_offset (-16)
|
cfi_adjust_cfa_offset (-16)
|
||||||
cfi_restore (x29)
|
cfi_restore (x29)
|
||||||
cfi_restore (x30)
|
cfi_restore (x30)
|
||||||
#if HAVE_AARCH64_PAC_RET
|
autiasp
|
||||||
AUTIASP
|
cfi_negate_ra_state
|
||||||
cfi_window_save
|
|
||||||
#endif
|
|
||||||
/* Restore the general purpose registers. */
|
/* Restore the general purpose registers. */
|
||||||
mov x0, x9
|
mov x0, x9
|
||||||
cfi_def_cfa (x0, 0)
|
cfi_def_cfa (x0, 0)
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ L(gcs_done):
|
||||||
2:
|
2:
|
||||||
/* The oucp context is restored here via an indirect branch,
|
/* The oucp context is restored here via an indirect branch,
|
||||||
x1 must be restored too which has the real return address. */
|
x1 must be restored too which has the real return address. */
|
||||||
BTI_J
|
bti j
|
||||||
mov x30, x1
|
mov x30, x1
|
||||||
RET
|
RET
|
||||||
PSEUDO_END (__swapcontext)
|
PSEUDO_END (__swapcontext)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue