Commit d7df77e8 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/exec: Set thread.regs early during exec

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: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201127044424.40686-10-aneesh.kumar@linux.ibm.com
parent d94b827e
...@@ -77,10 +77,8 @@ struct thread_info { ...@@ -77,10 +77,8 @@ struct thread_info {
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); 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); void arch_setup_new_exec(void);
#define arch_setup_new_exec arch_setup_new_exec #define arch_setup_new_exec arch_setup_new_exec
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -1531,14 +1531,22 @@ void flush_thread(void) ...@@ -1531,14 +1531,22 @@ void flush_thread(void)
#endif /* CONFIG_HAVE_HW_BREAKPOINT */ #endif /* CONFIG_HAVE_HW_BREAKPOINT */
} }
#ifdef CONFIG_PPC_BOOK3S_64
void arch_setup_new_exec(void) void arch_setup_new_exec(void)
{ {
if (radix_enabled())
return; #ifdef CONFIG_PPC_BOOK3S_64
hash__setup_new_exec(); if (!radix_enabled())
} hash__setup_new_exec();
#endif #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 #ifdef CONFIG_PPC64
/** /**
...@@ -1771,15 +1779,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) ...@@ -1771,15 +1779,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
preload_new_slb_context(start, sp); preload_new_slb_context(start, sp);
#endif #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 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
/* /*
* Clear any transactional state, we're exec()ing. The cause is * Clear any transactional state, we're exec()ing. The cause is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment