mirror of git://sourceware.org/git/glibc.git
aarch64: Add pac-ret support to assembly files
Use return address signing in assembly files for functions that save LR when pac-ret is enabled in the compiler. The GNU property note for PAC-RET is not meaningful to the dynamic linker so it is not strictly required, but it may be used to track the security property of binaries. (The PAC-RET property is only set if BTI is set too because BTI implies working GNU property support.) Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
9e1751e6d6
commit
1be3d6eb82
|
@ -75,7 +75,11 @@ call_weak_fn:
|
||||||
.hidden _init
|
.hidden _init
|
||||||
.type _init, %function
|
.type _init, %function
|
||||||
_init:
|
_init:
|
||||||
|
#if HAVE_AARCH64_PAC_RET
|
||||||
|
PACIASP
|
||||||
|
#else
|
||||||
BTI_C
|
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
|
||||||
|
@ -90,6 +94,10 @@ _init:
|
||||||
.hidden _fini
|
.hidden _fini
|
||||||
.type _fini, %function
|
.type _fini, %function
|
||||||
_fini:
|
_fini:
|
||||||
|
#if HAVE_AARCH64_PAC_RET
|
||||||
|
PACIASP
|
||||||
|
#else
|
||||||
BTI_C
|
BTI_C
|
||||||
|
#endif
|
||||||
stp x29, x30, [sp, -16]!
|
stp x29, x30, [sp, -16]!
|
||||||
mov x29, sp
|
mov x29, sp
|
||||||
|
|
|
@ -41,8 +41,14 @@
|
||||||
|
|
||||||
.section .init,"ax",%progbits
|
.section .init,"ax",%progbits
|
||||||
ldp x29, x30, [sp], 16
|
ldp x29, x30, [sp], 16
|
||||||
|
#if HAVE_AARCH64_PAC_RET
|
||||||
|
AUTIASP
|
||||||
|
#endif
|
||||||
RET
|
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
|
||||||
|
#endif
|
||||||
RET
|
RET
|
||||||
|
|
|
@ -183,6 +183,10 @@ _dl_tlsdesc_dynamic:
|
||||||
callee will trash. */
|
callee will trash. */
|
||||||
|
|
||||||
/* Save the remaining registers that we must treat as caller save. */
|
/* Save the remaining registers that we must treat as caller save. */
|
||||||
|
# if HAVE_AARCH64_PAC_RET
|
||||||
|
PACIASP
|
||||||
|
cfi_window_save
|
||||||
|
# endif
|
||||||
# define NSAVEXREGPAIRS 8
|
# define NSAVEXREGPAIRS 8
|
||||||
stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]!
|
stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]!
|
||||||
cfi_adjust_cfa_offset (16*NSAVEXREGPAIRS)
|
cfi_adjust_cfa_offset (16*NSAVEXREGPAIRS)
|
||||||
|
@ -233,6 +237,10 @@ _dl_tlsdesc_dynamic:
|
||||||
cfi_adjust_cfa_offset (-16*NSAVEXREGPAIRS)
|
cfi_adjust_cfa_offset (-16*NSAVEXREGPAIRS)
|
||||||
cfi_restore (x29)
|
cfi_restore (x29)
|
||||||
cfi_restore (x30)
|
cfi_restore (x30)
|
||||||
|
# if HAVE_AARCH64_PAC_RET
|
||||||
|
AUTIASP
|
||||||
|
cfi_window_save
|
||||||
|
# endif
|
||||||
b 1b
|
b 1b
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
|
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
|
||||||
|
|
|
@ -127,7 +127,12 @@ _dl_runtime_resolve:
|
||||||
cfi_startproc
|
cfi_startproc
|
||||||
.align 2
|
.align 2
|
||||||
_dl_runtime_profile:
|
_dl_runtime_profile:
|
||||||
|
# if HAVE_AARCH64_PAC_RET
|
||||||
|
PACIASP
|
||||||
|
cfi_window_save
|
||||||
|
# else
|
||||||
BTI_C
|
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)
|
||||||
|
@ -239,8 +244,17 @@ _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
|
||||||
|
cfi_adjust_cfa_offset (-SF_SIZE)
|
||||||
|
AUTIASP
|
||||||
|
cfi_window_save
|
||||||
|
add sp, sp, 16
|
||||||
|
cfi_adjust_cfa_offset (-16)
|
||||||
|
# else
|
||||||
add sp, sp, SF_SIZE + 16
|
add sp, sp, SF_SIZE + 16
|
||||||
cfi_adjust_cfa_offset (- 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
|
||||||
|
@ -287,6 +301,10 @@ _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. */
|
||||||
|
cfi_window_save
|
||||||
|
# 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]
|
||||||
|
|
|
@ -45,6 +45,10 @@
|
||||||
#define BTI_C hint 34
|
#define BTI_C hint 34
|
||||||
#define BTI_J hint 36
|
#define BTI_J hint 36
|
||||||
|
|
||||||
|
/* Return address signing support (pac-ret). */
|
||||||
|
#define PACIASP hint 25
|
||||||
|
#define AUTIASP hint 29
|
||||||
|
|
||||||
/* 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
|
||||||
|
@ -66,7 +70,9 @@
|
||||||
|
|
||||||
/* 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
|
#if HAVE_AARCH64_BTI && HAVE_AARCH64_PAC_RET
|
||||||
|
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI|FEATURE_1_PAC)
|
||||||
|
#elif HAVE_AARCH64_BTI
|
||||||
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI)
|
GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue