Commit 7339fb11 authored by Linus Walleij's avatar Linus Walleij Committed by Russell King (Oracle)
Browse files

ARM: 9390/2: lib: Annotate loop delay instructions for CFI



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: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent 393999fa
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -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>

@@ -24,21 +25,26 @@
 * 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)