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:
Victor L. Do Nascimento 2023-01-10 14:02:08 +00:00 committed by Richard Earnshaw
parent adc36ede11
commit 31e5ce10db
1 changed files with 43 additions and 0 deletions

View File

@ -22,6 +22,11 @@
#define SIZE(x)
#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:
The interworking scheme expects functions to use a BX instruction
@ -155,6 +160,8 @@ SYM (.arm_start_of.\name):
.align 2
MODE
.globl SYM (\name)
.fnstart
.cfi_startproc
TYPE (\name)
SYM (\name):
PROLOGUE \name
@ -162,6 +169,8 @@ SYM (\name):
.macro FUNC_END name
RET
.cfi_endproc
.fnend
SIZE (\name)
.endm
@ -171,6 +180,21 @@ SYM (\name):
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. */
#ifdef __thumb2__
mov ip, sp
@ -184,6 +208,10 @@ SYM (\name):
/* When setting up the jump buffer return 0. */
mov r0, #0
#if __ARM_FEATURE_PAC_DEFAULT
mov ip, r3
aut ip, lr, sp
#endif /* __ARM_FEATURE_PAC_DEFAULT */
FUNC_END setjmp
@ -193,6 +221,16 @@ SYM (\name):
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. */
/* Restore the registers, retrieving the state when setjmp() was called. */
@ -212,5 +250,10 @@ SYM (\name):
it eq
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
#endif