]> sourceware.org Git - newlib-cygwin.git/commitdiff
newlib: libc: strcmp M-profile PACBTI-enablement
authorVictor L. Do Nascimento <victor.donascimento@arm.com>
Wed, 21 Dec 2022 11:21:22 +0000 (11:21 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Tue, 10 Jan 2023 14:16:05 +0000 (14:16 +0000)
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 strcmp:
     * Newlib for armv8.1-m.main+pacbti
     * Newlib for armv8.1-m.main+pacbti+mve
     * Newlib-nano

newlib/libc/machine/arm/strcmp-arm-tiny.S
newlib/libc/machine/arm/strcmp-armv7.S
newlib/libc/machine/arm/strcmp-armv7m.S

index 607a41daf092f4f0441d3e1c686c1291cb659670..0bd2a2e6e72bf152a4e52954bf13925b83f132d6 100644 (file)
 /* Tiny version of strcmp in ARM state.  Used only when optimizing
    for size.  Also supports Thumb-2.  */
 
+#include "arm_asm.h"
+
        .syntax unified
 def_fn strcmp
+       .fnstart
        .cfi_sections .debug_frame
        .cfi_startproc
+       prologue
 1:
        ldrb    r2, [r0], #1
        ldrb    r3, [r1], #1
@@ -42,6 +46,8 @@ def_fn strcmp
        beq     1b
 2:
        subs    r0, r2, r3
-       bx      lr
+       epilogue
        .cfi_endproc
+       .cantunwind
+       .fnend
        .size   strcmp, . - strcmp
index 2f93bfb73f78afbf6aa5e787c8247a429410c8df..7cafca151b162210c2af4a512a14255a2aecc4cd 100644 (file)
@@ -45,6 +45,8 @@
        .thumb
        .syntax unified
 
+#include "arm_asm.h"
+
 /* Parameters and result.  */
 #define src1           r0
 #define src2           r1
@@ -91,8 +93,9 @@
        ldrd    r4, r5, [sp], #16
        .cfi_restore 4
        .cfi_restore 5
+       .cfi_adjust_cfa_offset -16
        sub     result, result, r1, lsr #24
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
 #else
        /* To use the big-endian trick we'd have to reverse all three words.
           that's slower than this approach.  */
        ldrd    r4, r5, [sp], #16
        .cfi_restore 4
        .cfi_restore 5
+       .cfi_adjust_cfa_offset -16
        sub     result, result, r1
 
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
 #endif
        .endm
 
+
        .text
        .p2align        5
-.Lstrcmp_start_addr:
-#ifndef STRCMP_NO_PRECHECK
-.Lfastpath_exit:
-       sub     r0, r2, r3
-       bx      lr
-       nop
-#endif
 def_fn strcmp
+       .fnstart
+       .cfi_sections .debug_frame
+       .cfi_startproc
+       prologue push_ip=HAVE_PAC_LEAF
 #ifndef STRCMP_NO_PRECHECK
        ldrb    r2, [src1]
        ldrb    r3, [src2]
@@ -136,16 +138,14 @@ def_fn    strcmp
        cmpcs   r2, r3
        bne     .Lfastpath_exit
 #endif
-       .cfi_sections .debug_frame
-       .cfi_startproc
        strd    r4, r5, [sp, #-16]!
-       .cfi_def_cfa_offset 16
-       .cfi_offset 4, -16
-       .cfi_offset 5, -12
+       .cfi_adjust_cfa_offset 16
+       .cfi_rel_offset 4, 0
+       .cfi_rel_offset 5, 4
        orr     tmp1, src1, src2
        strd    r6, r7, [sp, #8]
-       .cfi_offset 6, -8
-       .cfi_offset 7, -4
+       .cfi_rel_offset 6, 8
+       .cfi_rel_offset 7, 12
        mvn     const_m1, #0
        lsl     r2, tmp1, #29
        cbz     r2, .Lloop_aligned8
@@ -270,7 +270,6 @@ def_fn      strcmp
        ldr     data1, [src1], #4
        beq     .Laligned_m2
        bcs     .Laligned_m1
-
 #ifdef STRCMP_NO_PRECHECK
        ldrb    data2, [src2, #1]
        uxtb    tmp1, data1, ror #BYTE1_OFFSET
@@ -314,10 +313,19 @@ def_fn    strcmp
        mov     result, tmp1
        ldr     r4, [sp], #16
        .cfi_restore 4
-       bx      lr
+       .cfi_adjust_cfa_offset -16
+       epilogue push_ip=HAVE_PAC_LEAF
 
 #ifndef STRCMP_NO_PRECHECK
+.Lfastpath_exit:
+       .cfi_restore_state
+       .cfi_remember_state
+       sub     r0, r2, r3
+       epilogue push_ip=HAVE_PAC_LEAF
+
 .Laligned_m1:
+       .cfi_restore_state
+       .cfi_remember_state
        add     src2, src2, #4
 #endif
 .Lsrc1_aligned:
@@ -364,8 +372,9 @@ def_fn      strcmp
        /* R6/7 Not used in this sequence.  */
        .cfi_restore 6
        .cfi_restore 7
+       .cfi_adjust_cfa_offset -16
        neg     result, result
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
 
 6:
        .cfi_restore_state
@@ -441,7 +450,8 @@ def_fn      strcmp
        /* R6/7 not used in this sequence.  */
        .cfi_restore 6
        .cfi_restore 7
-       bx      lr
+       .cfi_adjust_cfa_offset -16
+       epilogue push_ip=HAVE_PAC_LEAF
 
 .Lstrcmp_tail:
        .cfi_restore_state
@@ -463,7 +473,10 @@ def_fn     strcmp
        /* R6/7 not used in this sequence.  */
        .cfi_restore 6
        .cfi_restore 7
+       .cfi_adjust_cfa_offset -16
        sub     result, result, data2, lsr #24
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
        .cfi_endproc
-       .size strcmp, . - .Lstrcmp_start_addr
+       .cantunwind
+       .fnend
+       .size strcmp, . - strcmp
index cdb4912df7a1b262c22186b3a169c9defc93879f..825b6e77fd94216be142e91022a1b0d71166c6e9 100644 (file)
@@ -29,6 +29,8 @@
 /* Very similar to the generic code, but uses Thumb2 as implemented
    in ARMv7-M.  */
 
+#include "arm_asm.h"
+
 /* Parameters and result.  */
 #define src1           r0
 #define src2           r1
        .thumb
        .syntax unified
 def_fn strcmp
+       .fnstart
        .cfi_sections .debug_frame
        .cfi_startproc
+       prologue push_ip=HAVE_PAC_LEAF
        eor     tmp1, src1, src2
        tst     tmp1, #3
        /* Strings not at same byte offset from a word boundary.  */
@@ -82,6 +86,7 @@ def_fn strcmp
        ldreq   data2, [src2], #4
        beq     4b
 2:
+       .cfi_remember_state
        /* There's a zero or a different byte in the word */
        S2HI    result, data1, #24
        S2LO    data1, data1, #8
@@ -106,7 +111,7 @@ def_fn strcmp
        lsrs    result, result, #24
        subs    result, result, data2
 #endif
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
 
 
 #if 0
@@ -205,8 +210,10 @@ def_fn strcmp
 
        /* First of all, compare bytes until src1(sp1) is word-aligned. */
 .Lstrcmp_unaligned:
+       .cfi_restore_state
        tst     src1, #3
        beq     2f
+       .cfi_remember_state
        ldrb    data1, [src1], #1
        ldrb    data2, [src2], #1
        cmp     data1, #1
@@ -214,12 +221,13 @@ def_fn strcmp
        cmpcs   data1, data2
        beq     .Lstrcmp_unaligned
        sub     result, data1, data2
-       bx      lr
+       epilogue push_ip=HAVE_PAC_LEAF
 
 2:
+       .cfi_restore_state
        stmfd   sp!, {r5}
-       .cfi_def_cfa_offset 4
-       .cfi_offset 5, -4
+       .cfi_adjust_cfa_offset 4
+       .cfi_rel_offset 5, 0
 
        ldr     data1, [src1], #4
        and     tmp2, src2, #3
@@ -355,8 +363,8 @@ def_fn strcmp
        .cfi_remember_state
        ldmfd   sp!, {r5}
        .cfi_restore 5
-       .cfi_def_cfa_offset 0
-       bx      lr
+       .cfi_adjust_cfa_offset -4
+       epilogue push_ip=HAVE_PAC_LEAF
 
 .Lstrcmp_tail:
        .cfi_restore_state
@@ -372,7 +380,9 @@ def_fn strcmp
        sub     result, r2, result
        ldmfd   sp!, {r5}
        .cfi_restore 5
-       .cfi_def_cfa_offset 0
-       bx      lr
+       .cfi_adjust_cfa_offset -4
+       epilogue push_ip=HAVE_PAC_LEAF
        .cfi_endproc
+       .cantunwind
+       .fnend
        .size strcmp, . - strcmp
This page took 0.041825 seconds and 5 git commands to generate.