diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/include/asm/current.h | 13 | ||||
-rw-r--r-- | arch/arm/include/asm/insn.h | 7 | ||||
-rw-r--r-- | arch/arm/include/asm/percpu.h | 8 |
3 files changed, 19 insertions, 9 deletions
diff --git a/arch/arm/include/asm/current.h b/arch/arm/include/asm/current.h index 69ecf4c6c725..2f9d79214b25 100644 --- a/arch/arm/include/asm/current.h +++ b/arch/arm/include/asm/current.h @@ -37,8 +37,16 @@ static inline __attribute_const__ struct task_struct *get_current(void) #ifdef CONFIG_CPU_V6 "1: \n\t" " .subsection 1 \n\t" +#if !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) && \ + !(defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000) "2: " LOAD_SYM_ARMV6(%0, __current) " \n\t" " b 1b \n\t" +#else + "2: ldr %0, 3f \n\t" + " ldr %0, [%0] \n\t" + " b 1b \n\t" + "3: .long __current \n\t" +#endif " .previous \n\t" " .pushsection \".alt.smp.init\", \"a\" \n\t" " .long 0b - . \n\t" @@ -46,8 +54,9 @@ static inline __attribute_const__ struct task_struct *get_current(void) " .popsection \n\t" #endif : "=r"(cur)); -#elif __LINUX_ARM_ARCH__>=7 || \ - (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) +#elif __LINUX_ARM_ARCH__>= 7 || \ + (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) || \ + (defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000) cur = __current; #else asm(LOAD_SYM_ARMV6(%0, __current) : "=r"(cur)); diff --git a/arch/arm/include/asm/insn.h b/arch/arm/include/asm/insn.h index a160ed3ea427..faf3d1c28368 100644 --- a/arch/arm/include/asm/insn.h +++ b/arch/arm/include/asm/insn.h @@ -10,8 +10,6 @@ * which should be sufficient for the core kernel as well as modules loaded * into the module region. (Not supported by LLD before release 14) */ -#if !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) && \ - !(defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000) #define LOAD_SYM_ARMV6(reg, sym) \ " .globl " #sym " \n\t" \ " .reloc 10f, R_ARM_ALU_PC_G0_NC, " #sym " \n\t" \ @@ -20,11 +18,6 @@ "10: sub " #reg ", pc, #8 \n\t" \ "11: sub " #reg ", " #reg ", #4 \n\t" \ "12: ldr " #reg ", [" #reg ", #0] \n\t" -#else -#define LOAD_SYM_ARMV6(reg, sym) \ - " ldr " #reg ", =" #sym " \n\t" \ - " ldr " #reg ", [" #reg "] \n\t" -#endif static inline unsigned long arm_gen_nop(void) diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h index a4a0d38d016a..28961d60877d 100644 --- a/arch/arm/include/asm/percpu.h +++ b/arch/arm/include/asm/percpu.h @@ -38,8 +38,16 @@ static inline unsigned long __my_cpu_offset(void) #ifdef CONFIG_CPU_V6 "1: \n\t" " .subsection 1 \n\t" +#if !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS)) && \ + !(defined(CONFIG_LD_IS_LLD) && CONFIG_LLD_VERSION < 140000) "2: " LOAD_SYM_ARMV6(%0, __per_cpu_offset) " \n\t" " b 1b \n\t" +#else + "2: ldr %0, 3f \n\t" + " ldr %0, [%0] \n\t" + " b 1b \n\t" + "3: .long __per_cpu_offset \n\t" +#endif " .previous \n\t" " .pushsection \".alt.smp.init\", \"a\" \n\t" " .long 0b - . \n\t" |