From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1035) id 2C52A385B526; Tue, 10 Jan 2023 16:49:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2C52A385B526 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1673369395; bh=0U977znKTOKvt93WVNrXb5UJmZkpw26e2oEJrHYGdxA=; h=From:To:Subject:Date:From; b=baMb/CP+p/iETnUFEDJfmq/bW5FL6enlG0wB213Xv8qXRzHGCzLgyrfvN/AV6paZd Pu+IFuVjipMnlfgMMtqkcSPhEohd6wzJGEhv2IenOLW51Etq5fpY8WQ1jh36JyIyDM K0+awJMw1OoR+c7g3uQsrI8JuDDBR4NvixFjSnKw= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Richard Earnshaw To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] newlib: libc: setjmp M-profile PACBTI-enablement X-Act-Checkin: newlib-cygwin X-Git-Author: Victor L. Do Nascimento X-Git-Refname: refs/heads/master X-Git-Oldrev: adc36ede1137a0c792e0281cef01e7750f866ac5 X-Git-Newrev: 31e5ce10db46bf8c15d78b2546553db45eb33141 Message-Id: <20230110164955.2C52A385B526@sourceware.org> Date: Tue, 10 Jan 2023 16:49:55 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D31e5ce10db4= 6bf8c15d78b2546553db45eb33141 commit 31e5ce10db46bf8c15d78b2546553db45eb33141 Author: Victor L. Do Nascimento Date: Tue Jan 10 14:02:08 2023 +0000 newlib: libc: setjmp M-profile PACBTI-enablement =20 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. Diff: --- newlib/libc/machine/arm/setjmp.S | 43 ++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 43 insertions(+) diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/set= jmp.S index d814afea8..5213c063b 100644 --- a/newlib/libc/machine/arm/setjmp.S +++ b/newlib/libc/machine/arm/setjmp.S @@ -22,6 +22,11 @@ #define SIZE(x) #endif =20 +/* 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: =20 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): =20 .macro FUNC_END name RET + .cfi_endproc + .fnend SIZE (\name) .endm =20 @@ -171,6 +180,21 @@ SYM (\name): =20 FUNC_START setjmp =20 +#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): =20 /* 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 */ =20 FUNC_END setjmp =20 @@ -193,6 +221,16 @@ SYM (\name): =20 FUNC_START longjmp =20 +#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. */ =20 /* Restore the registers, retrieving the state when setjmp() was called. = */ @@ -212,5 +250,10 @@ SYM (\name): it eq moveq r0, #1 =20 +#if __ARM_FEATURE_PAC_DEFAULT + ldr ip, [r2, #JUMPBUF_PAC] + aut ip, lr, sp +#endif /* __ARM_FEATURE_PAC_DEFAULT */ + FUNC_END longjmp #endif