Merge tag 'locks-v4.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton...
[sfrench/cifs-2.6.git] / arch / arm / include / asm / processor.h
index c3d5fc124a054c6309ffacdb2845ff22fd5bfa56..338cbe0a18efe742bfc9ab9c9210036636a2d53b 100644 (file)
@@ -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 */