ARM: 9390/2: lib: Annotate loop delay instructions for CFI
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 23 Apr 2024 07:50:38 +0000 (08:50 +0100)
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Mon, 29 Apr 2024 13:14:21 +0000 (14:14 +0100)
When we annotate the loop delay code with SYM_TYPED_FUNC_START()
a function prototype signature will be emitted into the object
file above each site called from C, and the delay loop code is
using "fallthroughs" from the different assembly callbacks. This
will not work as the execution flow will run into the prototype
signatures.

Rewrite the code to use explicit branches to the other code
segments and annotate the code using SYM_TYPED_FUNC_START().

Tested on the ARM Versatile which uses the calibrated loop delay.

Tested-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
arch/arm/lib/delay-loop.S

index 3ac05177d09795d430b9010349b51b4b489d9597..33b08ca1c2422d40896ef5ee260dc11a2e272028 100644 (file)
@@ -5,6 +5,7 @@
  *  Copyright (C) 1995, 1996 Russell King
  */
 #include <linux/linkage.h>
+#include <linux/cfi_types.h>
 #include <asm/assembler.h>
 #include <asm/delay.h>
 
  * HZ  <= 1000
  */
 
-ENTRY(__loop_udelay)
+SYM_TYPED_FUNC_START(__loop_udelay)
                ldr     r2, .LC1
                mul     r0, r2, r0              @ r0 = delay_us * UDELAY_MULT
-ENTRY(__loop_const_udelay)                     @ 0 <= r0 <= 0xfffffaf0
+               b       __loop_const_udelay
+SYM_FUNC_END(__loop_udelay)
+
+SYM_TYPED_FUNC_START(__loop_const_udelay)      @ 0 <= r0 <= 0xfffffaf0
                ldr     r2, .LC0
                ldr     r2, [r2]
                umull   r1, r0, r2, r0          @ r0-r1 = r0 * loops_per_jiffy
                adds    r1, r1, #0xffffffff     @ rounding up ...
                adcs    r0, r0, r0              @ and right shift by 31
                reteq   lr
+               b       __loop_delay
+SYM_FUNC_END(__loop_const_udelay)
 
                .align 3
 
 @ Delay routine
-ENTRY(__loop_delay)
+SYM_TYPED_FUNC_START(__loop_delay)
                subs    r0, r0, #1
 #if 0
                retls   lr
@@ -58,6 +64,4 @@ ENTRY(__loop_delay)
 #endif
                bhi     __loop_delay
                ret     lr
-ENDPROC(__loop_udelay)
-ENDPROC(__loop_const_udelay)
-ENDPROC(__loop_delay)
+SYM_FUNC_END(__loop_delay)