mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
powerpc: switch to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
ddffeb8c4d
commit
138d1ce80e
5 changed files with 4 additions and 22 deletions
|
@ -144,6 +144,7 @@ config PPC
|
||||||
select GENERIC_KERNEL_THREAD
|
select GENERIC_KERNEL_THREAD
|
||||||
select HAVE_MOD_ARCH_SPECIFIC
|
select HAVE_MOD_ARCH_SPECIFIC
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
|
select GENERIC_KERNEL_EXECVE
|
||||||
|
|
||||||
config EARLY_PRINTK
|
config EARLY_PRINTK
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -56,7 +56,6 @@
|
||||||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||||
#endif
|
#endif
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
#define __ARCH_WANT_KERNEL_EXECVE
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Conditional" syscalls
|
* "Conditional" syscalls
|
||||||
|
|
|
@ -444,11 +444,6 @@ ret_from_kernel_thread:
|
||||||
PPC440EP_ERR42
|
PPC440EP_ERR42
|
||||||
blrl
|
blrl
|
||||||
li r3,0
|
li r3,0
|
||||||
b do_exit # no return
|
|
||||||
|
|
||||||
.globl __ret_from_kernel_execve
|
|
||||||
__ret_from_kernel_execve:
|
|
||||||
addi r1,r3,-STACK_FRAME_OVERHEAD
|
|
||||||
b ret_from_syscall
|
b ret_from_syscall
|
||||||
|
|
||||||
/* Traced system call support */
|
/* Traced system call support */
|
||||||
|
|
|
@ -378,12 +378,6 @@ _GLOBAL(ret_from_kernel_thread)
|
||||||
mr r3,r15
|
mr r3,r15
|
||||||
blrl
|
blrl
|
||||||
li r3,0
|
li r3,0
|
||||||
b .do_exit # no return
|
|
||||||
|
|
||||||
_GLOBAL(__ret_from_kernel_execve)
|
|
||||||
addi r1,r3,-STACK_FRAME_OVERHEAD
|
|
||||||
li r10,1
|
|
||||||
std r10,SOFTE(r1)
|
|
||||||
b syscall_exit
|
b syscall_exit
|
||||||
|
|
||||||
.section ".toc","aw"
|
.section ".toc","aw"
|
||||||
|
|
|
@ -746,19 +746,21 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||||
sp -= sizeof(struct pt_regs);
|
sp -= sizeof(struct pt_regs);
|
||||||
childregs = (struct pt_regs *) sp;
|
childregs = (struct pt_regs *) sp;
|
||||||
if (!regs) {
|
if (!regs) {
|
||||||
/* for kernel thread, set `current' and stackptr in new task */
|
struct thread_info *ti = (void *)task_stack_page(p);
|
||||||
memset(childregs, 0, sizeof(struct pt_regs));
|
memset(childregs, 0, sizeof(struct pt_regs));
|
||||||
childregs->gpr[1] = sp + sizeof(struct pt_regs);
|
childregs->gpr[1] = sp + sizeof(struct pt_regs);
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
childregs->gpr[14] = *(unsigned long *)usp;
|
childregs->gpr[14] = *(unsigned long *)usp;
|
||||||
childregs->gpr[2] = ((unsigned long *)usp)[1],
|
childregs->gpr[2] = ((unsigned long *)usp)[1],
|
||||||
clear_tsk_thread_flag(p, TIF_32BIT);
|
clear_tsk_thread_flag(p, TIF_32BIT);
|
||||||
|
childregs->softe = 1;
|
||||||
#else
|
#else
|
||||||
childregs->gpr[14] = usp; /* function */
|
childregs->gpr[14] = usp; /* function */
|
||||||
childregs->gpr[2] = (unsigned long) p;
|
childregs->gpr[2] = (unsigned long) p;
|
||||||
#endif
|
#endif
|
||||||
childregs->gpr[15] = arg;
|
childregs->gpr[15] = arg;
|
||||||
p->thread.regs = NULL; /* no user register state */
|
p->thread.regs = NULL; /* no user register state */
|
||||||
|
ti->flags |= _TIF_RESTOREALL;
|
||||||
f = ret_from_kernel_thread;
|
f = ret_from_kernel_thread;
|
||||||
} else {
|
} else {
|
||||||
CHECK_FULL_REGS(regs);
|
CHECK_FULL_REGS(regs);
|
||||||
|
@ -1063,15 +1065,6 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
|
||||||
regs, 0, NULL, NULL);
|
regs, 0, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __ret_from_kernel_execve(struct pt_regs *normal)
|
|
||||||
__noreturn;
|
|
||||||
|
|
||||||
void ret_from_kernel_execve(struct pt_regs *normal)
|
|
||||||
{
|
|
||||||
set_thread_flag(TIF_RESTOREALL);
|
|
||||||
__ret_from_kernel_execve(normal);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
|
static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
|
||||||
unsigned long nbytes)
|
unsigned long nbytes)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue