[PATCH v2 2/2] ARM: Thumb2: use "bx reg" not "mov pc, reg" for all registers

Dave P Martin Dave.Martin at arm.com
Tue Apr 21 04:15:44 PDT 2015


On Tue, Apr 21, 2015 at 11:59:43AM +0100, Ard Biesheuvel wrote:
> Commit 6ebbf2ce437b (ARM: convert all "mov.* pc, reg" to "bx reg"
> for ARMv6+) replaced all occurrences of 'mov pc, <reg>' with the
> 'ret' macro. However, this macro only emits the 'bx' instruction
> when used with the 'lr' register, but still uses 'mov pc, <reg>'
> for everything else.
> 
> Since ARM/Thumb2 interworking is allowed in the static kernel
> (i.e., inside vmlinux), this is potentially unsafe, since the
> Thumb mov instruction T1 variant that allows PC as the target will
> not switch modes based on the Thumb bit
> 
> So when building a Thumb2 kernel, emit the 'bx' instruction for
> all registers, not just the 'lr' register.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
> ---
>  arch/arm/include/asm/assembler.h | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 186270b3e194..1c057f923258 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -434,6 +434,8 @@ THUMB(	orr	\reg , \reg , #PSR_T_BIT	)
>  	.macro	ret\c, reg
>  #if __LINUX_ARM_ARCH__ < 6
>  	mov\c	pc, \reg
> +#elif defined(CONFIG_THUMB2_KERNEL)
> +	bx\c	\reg
>  #else

In v7, !THUMB_KERNEL builds, we now do this:

>  	.ifeqs	"\reg", "lr"
>  	bx\c	\reg

Why?  A !THUMB2 kernel should not contain any Thumb code in general.

Cheers
---Dave




More information about the linux-arm-kernel mailing list