[PATCH] ARM: signal: fix armv7-m build issue in sigreturn_codes.S

Dave Martin Dave.Martin at arm.com
Mon Nov 18 08:39:48 EST 2013


On Mon, Nov 11, 2013 at 12:10:27AM -0800, Victor Kamensky wrote:
> In case of armv7-m architecture arm instructions are not allowed.
> For this architecture CONFIG_CPU_THUMBONLY is set. Use this macro
> to emit conditionally arm instructions or nops in thumb mode.
> 
> Signed-off-by: Victor Kamensky <victor.kamensky at linaro.org>
> ---
>  arch/arm/kernel/sigreturn_codes.S | 25 ++++++++++++++++++-------
>  1 file changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm/kernel/sigreturn_codes.S b/arch/arm/kernel/sigreturn_codes.S
> index 3c5d0f2..899fb86 100644
> --- a/arch/arm/kernel/sigreturn_codes.S
> +++ b/arch/arm/kernel/sigreturn_codes.S
> @@ -41,17 +41,29 @@
>  	.arch armv4t
>  #endif
>  
> +/*
> + * In CPU_THUMBONLY kernel case arm opcodes are not allowed
> + */
> +#ifndef CONFIG_CPU_THUMBONLY
> +#define ARM_INSTR(code...) .arm ; \
> +			   code
> +#else
> +#define ARM_INSTR(code...) .thumb ; \
> +			   nop ;    \
> +			   nop ;
> +#endif
> +

Maybe use .org to force the layout, instead of nop-padding,
and don't emit the ARM instructions at all in the THUMBONLY
case.

So, this becomes something like:

sigreturn_codes:

#ifndef CONFIG_CPU_THUMBONLY
	.arm
	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
	swi	#(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)
#endif
	.org	sigreturn_codes + 8 + 12 * 0
	.thumb
        movs	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
        swi	#0

#ifndef CONFIG_CPU_THUMBONLY
	.arm
	mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
	swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)
#endif
	.org	sigreturn_codes + 8 + 12 * 1
	.thumb
	movs	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
	swi	#0

...etc.

This will just leave gaps in the right places without needing
to worry about what to fill them with (which shouldn't matter).

Ideally the ifdefs can be hidden with macros to make things
look a bit less ugly.  You could keep ARM_INSTR() unmodified,
and define separate macros that spit out the .org and related
stuff, like:

.macro arm_slot n
		.org	sigreturn_codes + 12 * (\n)
 ARM_INSTR(	.arm	)
.endm

.macro thumb_slot n
		.org	sigreturn_codes + 12 * (\n) + 8
		.thumb
.endm


Then you get

sigreturn_codes:

arm_slot 0
 ARM_INSTR(	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)	)
 ARM_INSTR(	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)	)
thumb_slot 0
	        movs	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
	        swi	#0

arm_slot 1
 ARM_INSTR(	mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)	)
 ARM_INSTR(	swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)	)
thumb_slot 1
		movs	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
		swi	#0

Still not ideal, but it might work.

Cheers
---Dave

>  	.section .rodata
>  	.global sigreturn_codes
>  	.type	sigreturn_codes, #object
>  
> -	.arm
> +	.align
>  
>  sigreturn_codes:
>  
>  	/* ARM sigreturn syscall code snippet */
> -	mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE)
> -	swi	#(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)
> +ARM_INSTR(mov	r7, #(__NR_sigreturn - __NR_SYSCALL_BASE))
> +ARM_INSTR(swi	#(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE))
>  
>  	/* Thumb sigreturn syscall code snippet */
>  	.thumb
> @@ -59,9 +71,8 @@ sigreturn_codes:
>  	swi	#0
>  
>  	/* ARM sigreturn_rt syscall code snippet */
> -	.arm
> -	mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE)
> -	swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)
> +ARM_INSTR(mov	r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE))
> +ARM_INSTR(swi	#(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE))
>  
>  	/* Thumb sigreturn_rt syscall code snippet */
>  	.thumb
> @@ -74,7 +85,7 @@ sigreturn_codes:
>  	 * it is thumb case or not, so we need additional
>  	 * word after real last entry.
>  	 */
> -	.arm
> +	.align
>  	.space	4
>  
>  	.size	sigreturn_codes, . - sigreturn_codes
> -- 
> 1.8.1.4
> 
> 
> _______________________________________________
> linaro-kernel mailing list
> linaro-kernel at lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/linaro-kernel




More information about the linux-arm-kernel mailing list