From: "Victor L. Do Nascimento" <victor.donascimento@arm.com>
To: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
Cc: <newlib@sourceware.org>
Subject: Re: [PATCH 3/8] newlib: libc: strlen M-profile PACBTI-enablement
Date: Tue, 5 Jul 2022 17:30:36 +0100 [thread overview]
Message-ID: <yw8j8rp7msib.fsf@arm.com> (raw)
In-Reply-To: <e4b7e8d5-9b29-ac0b-8888-b1014cc29ea6@foss.arm.com> (Richard Earnshaw's message of "Tue, 5 Jul 2022 16:39:41 +0100")
Richard Earnshaw <Richard.Earnshaw@foss.arm.com> writes:
> On 05/07/2022 14:58, Victor 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
>> ---
>> newlib/libc/machine/arm/strlen-armv7.S | 52 ++++++++++++++++++++--
>> newlib/libc/machine/arm/strlen-stub.c | 9 ++++
>> newlib/libc/machine/arm/strlen-thumb2-Os.S | 13 ++++--
>> 3 files changed, 67 insertions(+), 7 deletions(-)
>> diff --git a/newlib/libc/machine/arm/strlen-armv7.S
>> b/newlib/libc/machine/arm/strlen-armv7.S
>> index f3dda0d60..18c8226d0 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 "pacbti.h"
>> .macro def_fn f p2align=0
>> .text
>> @@ -77,7 +78,9 @@
>> #endif
>> /* This code requires Thumb. */
>> -#if __ARM_ARCH_PROFILE == 'M'
>> +#if __ARM_ARCH_8M_MAIN__
>
> These GCC architecture macros (those that end with '__') aren't portable and are
> essentially deprecated. What exactly are you trying to achieve here?
It was my attempt at circumventing the .arch directives below.
As these older architecture lack the support for PACBTI instructions, if
we don't prevent the selection of the wrong target architecture, when
said instructions are encountered they cause Newlib compilation to fail.
In particular, I needed to distinguish between armv7e-m and
armv8.1-m.main and chose the __ARM_ARCH_8M_MAIN__ macro out of the
output from using the -dM GCC preprocessor flag.
Will fix.
>> + /* keep config inherited from -march= */
>> +#elif __ARM_ARCH_PROFILE == 'M'
>> .arch armv7e-m
>> #else
>> .arch armv6t2
>> @@ -100,8 +103,34 @@
>> #define tmp2 r5
>> def_fn strlen p2align=6
>> + .fnstart
>> + .cfi_startproc
>> + /* common pacbti_prologue macro from pacbti.h not used.
>> + handwritten prologue saves one push instruction. */
>> +#if __ARM_FEATURE_PAC_DEFAULT
>> +#if __ARM_FEATURE_BTI_DEFAULT
>> + pacbti ip, lr, sp
>> +#else
>> + pac ip, lr, sp
>> +#endif /* __ARM_FEATURE_BTI_DEFAULT */
>> + push {r4, r5, ip}
>> + .save {r4, r5, ra_auth_code}
>> + .cfi_def_cfa_offset 12
>> + .cfi_offset 143, -4
>> + .cfi_offset 5, -8
>> + .cfi_offset 4, -12
>> +
>> +#else
>> +#if __ARM_FEATURE_BTI_DEFAULT
>> + bti
>> +#endif /* __ARM_FEATURE_BTI_DEFAULT */
>> + push {r4, r5}
>> + .save {r4, r5}
>> + .cfi_def_cfa_offset 8
>> + .cfi_offset 5, -4
>> + .cfi_offset 4, -8
>> +#endif /* __ARM_FEATURE_PAC_DEFAULT */
>> pld [srcin, #0]
>> - strd r4, r5, [sp, #-8]!
>> bic src, srcin, #7
>> mvn const_m1, #0
>> ands tmp1, srcin, #7 /* (8 - bytes) to alignment. */
>> @@ -159,9 +188,22 @@ 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
>> +#if __ARM_FEATURE_PAC_DEFAULT
>> + pop {r4, r5, ip}
>> + .cfi_restore 4
>> + .cfi_restore 5
>> + .cfi_restore 143
>> + .cfi_def_cfa_offset 0
>> + aut ip, lr, sp
>> +#else
>> + ldrd r4, r5, [sp], #8
>> + .cfi_restore 4
>> + .cfi_restore 5
>> + .cfi_def_cfa_offset 0
>> +#endif /* __ARM_FEATURE_PAC_DEFAULT */
>> + bx lr
>> +
>> .Lmisaligned8:
>> ldrd data1a, data1b, [src]
>> @@ -177,4 +219,6 @@ def_fn strlen p2align=6
>> movne data1a, const_m1
>> mov const_0, #0
>> b .Lstart_realigned
>> + .cfi_endproc
>> + .fnend
>> .size strlen, . - strlen
>> diff --git a/newlib/libc/machine/arm/strlen-stub.c b/newlib/libc/machine/arm/strlen-stub.c
>> index fc2daf16f..4a0bb8cbb 100644
>> --- a/newlib/libc/machine/arm/strlen-stub.c
>> +++ b/newlib/libc/machine/arm/strlen-stub.c
>> @@ -58,6 +58,11 @@ strlen (const char* str)
>> "data .req r3\n\t"
>> "addr .req r1\n\t"
>> +#ifdef __ARM_FEATURE_PAC_DEFAULT
>> + "pac ip, lr, sp\n\t"
>> + "str ip, [sp, #-4]!\n\t"
>> +#endif
>> +
>> #ifdef _ISA_ARM_7
>> "pld [r0]\n\t"
>> #endif
>> @@ -167,6 +172,10 @@ strlen (const char* str)
>> "it ne\n\t"
>> "addne len, len, #1\n\t"
>> # endif
>> +#endif
>> +#ifdef __ARM_FEATURE_PAC_DEFAULT
>> + "ldr ip, [sp], #4\n\t"
>> + "aut ip, lr, sp\n\t"
>> #endif
>> "bx lr\n\t");
>> }
>> diff --git a/newlib/libc/machine/arm/strlen-thumb2-Os.S b/newlib/libc/machine/arm/strlen-thumb2-Os.S
>> index 961f41a0a..823b0310e 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 "pacbti.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_8M_MAIN__
>> + /* keep config inherited from -march= */
>> +#elif __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7
>> .arch armv7
>> #else
>> .arch armv6t2
>> @@ -44,11 +46,16 @@
>> .syntax unified
>> def_fn strlen p2align=1
>> + .fnstart
>> + .cfi_startproc
>> + pacbti_prologue
>> mov r3, r0
>> 1: ldrb.w r2, [r3], #1
>> cmp r2, #0
>> bne 1b
>> subs r0, r3, r0
>> subs r0, #1
>> - bx lr
>> + pacbti_epilogue
>> + .cfi_endproc
>> + .fnend
>> .size strlen, . - strlen
next prev parent reply other threads:[~2022-07-05 16:30 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-05 13:58 [PATCH 0/8] Implement assembly cortex-M PACBTI functionality Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 1/8] newlib: libc: define M-profile PACBTI-enablement macros Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 2/8] newlib: libc: strcmp M-profile PACBTI-enablement Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 3/8] newlib: libc: strlen " Victor Do Nascimento
2022-07-05 15:39 ` Richard Earnshaw
2022-07-05 16:30 ` Victor L. Do Nascimento [this message]
2022-07-06 9:07 ` Richard Earnshaw
2022-07-05 13:58 ` [PATCH 4/8] newlib: libc: memchr " Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 5/8] newlib: libc: memcpy " Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 6/8] newlib: libc: setjmp/longjmp " Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 7/8] newlib: libc: aeabi_memmove " Victor Do Nascimento
2022-07-05 13:58 ` [PATCH 8/8] newlib: libc: aeabi_memset " Victor Do Nascimento
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=yw8j8rp7msib.fsf@arm.com \
--to=victor.donascimento@arm.com \
--cc=Richard.Earnshaw@foss.arm.com \
--cc=newlib@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).