mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-28 03:27:46 +08:00
newlib: libc: setjmp M-profile PACBTI-enablement
Add function prologue/epilogue to conditionally add BTI landing pads and/or PAC code generation & authentication instructions depending on compilation flags. Save the PAC value in the jump buffer so that longjmp can only return to the authenticated location.
This commit is contained in:
parent
adc36ede11
commit
31e5ce10db
@ -22,6 +22,11 @@
|
|||||||
#define SIZE(x)
|
#define SIZE(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Jump buffer allocation sizes. */
|
||||||
|
#define JUMPBUF_CORE_REGS_SIZE (10 * 4)
|
||||||
|
#define JUMPBUF_FP_REGS_SIZE (8 * 8)
|
||||||
|
#define JUMPBUF_PAC (JUMPBUF_CORE_REGS_SIZE + JUMPBUF_FP_REGS_SIZE + 0)
|
||||||
|
|
||||||
/* Arm/Thumb interworking support:
|
/* Arm/Thumb interworking support:
|
||||||
|
|
||||||
The interworking scheme expects functions to use a BX instruction
|
The interworking scheme expects functions to use a BX instruction
|
||||||
@ -155,6 +160,8 @@ SYM (.arm_start_of.\name):
|
|||||||
.align 2
|
.align 2
|
||||||
MODE
|
MODE
|
||||||
.globl SYM (\name)
|
.globl SYM (\name)
|
||||||
|
.fnstart
|
||||||
|
.cfi_startproc
|
||||||
TYPE (\name)
|
TYPE (\name)
|
||||||
SYM (\name):
|
SYM (\name):
|
||||||
PROLOGUE \name
|
PROLOGUE \name
|
||||||
@ -162,6 +169,8 @@ SYM (\name):
|
|||||||
|
|
||||||
.macro FUNC_END name
|
.macro FUNC_END name
|
||||||
RET
|
RET
|
||||||
|
.cfi_endproc
|
||||||
|
.fnend
|
||||||
SIZE (\name)
|
SIZE (\name)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@ -171,6 +180,21 @@ SYM (\name):
|
|||||||
|
|
||||||
FUNC_START setjmp
|
FUNC_START setjmp
|
||||||
|
|
||||||
|
#if __ARM_FEATURE_PAC_DEFAULT
|
||||||
|
# if __ARM_FEATURE_BTI_DEFAULT
|
||||||
|
pacbti ip, lr, sp
|
||||||
|
# else
|
||||||
|
pac ip, lr, sp
|
||||||
|
# endif /* __ARM_FEATURE_BTI_DEFAULT */
|
||||||
|
mov r3, ip
|
||||||
|
str r3, [r0, #JUMPBUF_PAC]
|
||||||
|
.cfi_register 143, 12
|
||||||
|
#else
|
||||||
|
# if __ARM_FEATURE_BTI_DEFAULT
|
||||||
|
bti
|
||||||
|
# endif /* __ARM_FEATURE_BTI_DEFAULT */
|
||||||
|
#endif /* __ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
|
||||||
/* Save all the callee-preserved registers into the jump buffer. */
|
/* Save all the callee-preserved registers into the jump buffer. */
|
||||||
#ifdef __thumb2__
|
#ifdef __thumb2__
|
||||||
mov ip, sp
|
mov ip, sp
|
||||||
@ -184,6 +208,10 @@ SYM (\name):
|
|||||||
|
|
||||||
/* When setting up the jump buffer return 0. */
|
/* When setting up the jump buffer return 0. */
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
|
#if __ARM_FEATURE_PAC_DEFAULT
|
||||||
|
mov ip, r3
|
||||||
|
aut ip, lr, sp
|
||||||
|
#endif /* __ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
|
||||||
FUNC_END setjmp
|
FUNC_END setjmp
|
||||||
|
|
||||||
@ -193,6 +221,16 @@ SYM (\name):
|
|||||||
|
|
||||||
FUNC_START longjmp
|
FUNC_START longjmp
|
||||||
|
|
||||||
|
#if __ARM_FEATURE_BTI_DEFAULT
|
||||||
|
bti
|
||||||
|
#endif /* __ARM_FEATURE_BTI_DEFAULT */
|
||||||
|
|
||||||
|
#if __ARM_FEATURE_PAC_DEFAULT
|
||||||
|
/* Keep original jmpbuf address for retrieving pac-code
|
||||||
|
for authentication. */
|
||||||
|
mov r2, r0
|
||||||
|
#endif /* __ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
|
||||||
/* If we have stack extension code it ought to be handled here. */
|
/* If we have stack extension code it ought to be handled here. */
|
||||||
|
|
||||||
/* Restore the registers, retrieving the state when setjmp() was called. */
|
/* Restore the registers, retrieving the state when setjmp() was called. */
|
||||||
@ -212,5 +250,10 @@ SYM (\name):
|
|||||||
it eq
|
it eq
|
||||||
moveq r0, #1
|
moveq r0, #1
|
||||||
|
|
||||||
|
#if __ARM_FEATURE_PAC_DEFAULT
|
||||||
|
ldr ip, [r2, #JUMPBUF_PAC]
|
||||||
|
aut ip, lr, sp
|
||||||
|
#endif /* __ARM_FEATURE_PAC_DEFAULT */
|
||||||
|
|
||||||
FUNC_END longjmp
|
FUNC_END longjmp
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user