Re: [PATCH v4 3/8] newlib: libc: strlen M-profile PACBTI-enablement
Richard Earnshaw <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On 26/10/2022 12:47, Victor L. Do Nascimento wrote: > Add function prologue/epilogue to conditionally add BTI landing pads > and/or PAC code generation & authentication instructions depending on > compilation flags. > > This patch enables PACBTI for all relevant variants of strlen: > * Newlib for armv8.1-m.main+pacbti > * Newlib for armv8.1-m.main+pacbti+mve > * Newlib-nano This is OK. It's slightly unfortunate that we can nolonger have the PLD instruction before the prologue, but it is what it is. R. > --- > newlib/libc/machine/arm/strlen-armv7.S | 17 ++++++++++++++--- > newlib/libc/machine/arm/strlen-thumb2-Os.S | 14 +++++++++++--- > 2 files changed, 25 insertions(+), 6 deletions(-) > > diff --git a/newlib/libc/machine/arm/strlen-armv7.S b/newlib/libc/machine/arm/strlen-armv7.S > index f3dda0d60..27094040c 100644 > --- a/newlib/libc/machine/arm/strlen-armv7.S > +++ b/newlib/libc/machine/arm/strlen-armv7.S > @@ -59,6 +59,7 @@ > OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ > > #include "acle-compat.h" > +#include "arm_asm.h" > > .macro def_fn f p2align=0 > .text > @@ -78,7 +79,11 @@ > > /* This code requires Thumb. */ > #if __ARM_ARCH_PROFILE == 'M' > +#if __ARM_ARCH >= 8 > + /* keep config inherited from -march=. */ > +#else > .arch armv7e-m > +#endif /* if __ARM_ARCH >= 8 */ > #else > .arch armv6t2 > #endif > @@ -100,8 +105,10 @@ > #define tmp2 r5 > > def_fn strlen p2align=6 > + .fnstart > + .cfi_startproc > + prologue 4 5 push_ip=HAVE_PAC_LEAF > pld [srcin, #0] > - strd r4, r5, [sp, #-8]! > bic src, srcin, #7 > mvn const_m1, #0 > ands tmp1, srcin, #7 /* (8 - bytes) to alignment. */ > @@ -151,6 +158,7 @@ def_fn strlen p2align=6 > beq .Lloop_aligned > > .Lnull_found: > + .cfi_remember_state > cmp data1a, #0 > itt eq > addeq result, result, #4 > @@ -159,11 +167,11 @@ def_fn strlen p2align=6 > rev data1a, data1a > #endif > clz data1a, data1a > - ldrd r4, r5, [sp], #8 > add result, result, data1a, lsr #3 /* Bits -> Bytes. */ > - bx lr > + epilogue 4 5 push_ip=HAVE_PAC_LEAF > > .Lmisaligned8: > + .cfi_restore_state > ldrd data1a, data1b, [src] > and tmp2, tmp1, #3 > rsb result, tmp1, #0 > @@ -177,4 +185,7 @@ def_fn strlen p2align=6 > movne data1a, const_m1 > mov const_0, #0 > b .Lstart_realigned > + .cfi_endproc > + .cantunwind > + .fnend > .size strlen, . - strlen > diff --git a/newlib/libc/machine/arm/strlen-thumb2-Os.S b/newlib/libc/machine/arm/strlen-thumb2-Os.S > index 961f41a0a..a46db573c 100644 > --- a/newlib/libc/machine/arm/strlen-thumb2-Os.S > +++ b/newlib/libc/machine/arm/strlen-thumb2-Os.S > @@ -25,6 +25,7 @@ > OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ > > #include "acle-compat.h" > +#include "arm_asm.h" > > .macro def_fn f p2align=0 > .text > @@ -33,8 +34,9 @@ > .type \f, %function > \f: > .endm > - > -#if __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7 > +#if __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH >= 8 > + /* keep config inherited from -march=. */ > +#elif __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7 > .arch armv7 > #else > .arch armv6t2 > @@ -44,11 +46,17 @@ > .syntax unified > > def_fn strlen p2align=1 > + .fnstart > + .cfi_startproc > + prologue > mov r3, r0 > 1: ldrb.w r2, [r3], #1 > cmp r2, #0 > bne 1b > subs r0, r3, r0 > subs r0, #1 > - bx lr > + epilogue > + .cfi_endproc > + .cantunwind > + .fnend > .size strlen, . - strlen