powerpc/exec: Set thread.regs early during exec
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Fri, 27 Nov 2020 04:44:11 +0000 (10:14 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 3 Dec 2020 14:01:25 +0000 (01:01 +1100)
In later patches during exec, we would like to access default regs.amr to
control access to the user mapping. Having thread.regs set early makes the
code changes simpler.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201127044424.40686-10-aneesh.kumar@linux.ibm.com
arch/powerpc/include/asm/thread_info.h
arch/powerpc/kernel/process.c

index 46a210b03d2b8029b5b297beeba50c41df563eec..de4c911d9ced3f5ac0cc39d4d28558705e138146 100644 (file)
@@ -77,10 +77,8 @@ struct thread_info {
 /* how to get the thread information struct from C */
 extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
 
-#ifdef CONFIG_PPC_BOOK3S_64
 void arch_setup_new_exec(void);
 #define arch_setup_new_exec arch_setup_new_exec
-#endif
 
 #endif /* __ASSEMBLY__ */
 
index 293d9b2ec0fa95486067d6497d3f3913d7afaf17..3f0b6adecf75a3cd761fbabdfd08df0e095f9a03 100644 (file)
@@ -1531,14 +1531,22 @@ void flush_thread(void)
 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
 }
 
-#ifdef CONFIG_PPC_BOOK3S_64
 void arch_setup_new_exec(void)
 {
-       if (radix_enabled())
-               return;
-       hash__setup_new_exec();
-}
+
+#ifdef CONFIG_PPC_BOOK3S_64
+       if (!radix_enabled())
+               hash__setup_new_exec();
 #endif
+       /*
+        * If we exec out of a kernel thread then thread.regs will not be
+        * set.  Do it now.
+        */
+       if (!current->thread.regs) {
+               struct pt_regs *regs = task_stack_page(current) + THREAD_SIZE;
+               current->thread.regs = regs - 1;
+       }
+}
 
 #ifdef CONFIG_PPC64
 /**
@@ -1771,15 +1779,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
                preload_new_slb_context(start, sp);
 #endif
 
-       /*
-        * If we exec out of a kernel thread then thread.regs will not be
-        * set.  Do it now.
-        */
-       if (!current->thread.regs) {
-               struct pt_regs *regs = task_stack_page(current) + THREAD_SIZE;
-               current->thread.regs = regs - 1;
-       }
-
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
        /*
         * Clear any transactional state, we're exec()ing. The cause is