[v2,3/8] ARM: start_thread(): don't always clear all regs

Vincent ABRIOU vincent.abriou at st.com
Mon Aug 28 07:07:09 PDT 2017


Hi Nicolas,

On 08/17/2017 09:23 AM, Nicolas Pitre wrote:
> The elf_fdpic binary format driver has to initialize extra registers
> beside the stack and program counter as required by the corresponding
> ABI. So reinstate them after the regs structure has been cleared.
> 
> While at it let's get rid of start_thread_nommu().
> 
> Signed-off-by: Nicolas Pitre <nico at linaro.org>
Tested-by: Vincent Abriou <vincent.abriou at st.com>

BR
Vincent

> ---
>   arch/arm/include/asm/processor.h | 22 +++++++++++++++-------
>   1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h
> index c3d5fc124a..338cbe0a18 100644
> --- a/arch/arm/include/asm/processor.h
> +++ b/arch/arm/include/asm/processor.h
> @@ -47,15 +47,24 @@ struct thread_struct {
>   
>   #define INIT_THREAD  {	}
>   
> -#ifdef CONFIG_MMU
> -#define nommu_start_thread(regs) do { } while (0)
> -#else
> -#define nommu_start_thread(regs) regs->ARM_r10 = current->mm->start_data
> -#endif
> -
>   #define start_thread(regs,pc,sp)					\
>   ({									\
> +	unsigned long r7, r8, r9;					\
> +									\
> +	if (IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC)) {			\
> +		r7 = regs->ARM_r7;					\
> +		r8 = regs->ARM_r8;					\
> +		r9 = regs->ARM_r9;					\
> +	}								\
>   	memset(regs->uregs, 0, sizeof(regs->uregs));			\
> +	if (IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC) &&			\
> +	    current->personality & FDPIC_FUNCPTRS) {			\
> +		regs->ARM_r7 = r7;					\
> +		regs->ARM_r8 = r8;					\
> +		regs->ARM_r9 = r9;					\
> +		regs->ARM_r10 = current->mm->start_data;		\
> +	} else if (!IS_ENABLED(CONFIG_MMU))				\
> +		regs->ARM_r10 = current->mm->start_data;		\
>   	if (current->personality & ADDR_LIMIT_32BIT)			\
>   		regs->ARM_cpsr = USR_MODE;				\
>   	else								\
> @@ -65,7 +74,6 @@ struct thread_struct {
>   	regs->ARM_cpsr |= PSR_ENDSTATE;					\
>   	regs->ARM_pc = pc & ~1;		/* pc */			\
>   	regs->ARM_sp = sp;		/* sp */			\
> -	nommu_start_thread(regs);					\
>   })
>   
>   /* Forward declaration, a strange C thing */
> 


More information about the linux-arm-kernel mailing list