arm: switch to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -86,35 +86,14 @@ ENDPROC(ret_to_user)
|
||||
*/
|
||||
ENTRY(ret_from_fork)
|
||||
bl schedule_tail
|
||||
cmp r5, #0
|
||||
movne r0, r4
|
||||
movne lr, pc
|
||||
movne pc, r5
|
||||
get_thread_info tsk
|
||||
mov why, #1
|
||||
b ret_slow_syscall
|
||||
ENDPROC(ret_from_fork)
|
||||
|
||||
ENTRY(ret_from_kernel_thread)
|
||||
UNWIND(.fnstart)
|
||||
UNWIND(.cantunwind)
|
||||
bl schedule_tail
|
||||
mov r0, r4
|
||||
adr lr, BSYM(1f) @ kernel threads should not exit
|
||||
mov pc, r5
|
||||
1: bl do_exit
|
||||
nop
|
||||
UNWIND(.fnend)
|
||||
ENDPROC(ret_from_kernel_thread)
|
||||
|
||||
/*
|
||||
* turn a kernel thread into userland process
|
||||
* use: ret_from_kernel_execve(struct pt_regs *normal)
|
||||
*/
|
||||
ENTRY(ret_from_kernel_execve)
|
||||
mov why, #0 @ not a syscall
|
||||
str why, [r0, #S_R0] @ ... and we want 0 in ->ARM_r0 as well
|
||||
get_thread_info tsk @ thread structure
|
||||
mov sp, r0 @ stack pointer just under pt_regs
|
||||
b ret_slow_syscall
|
||||
ENDPROC(ret_from_kernel_execve)
|
||||
|
||||
.equ NR_syscalls,0
|
||||
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
|
||||
#include "calls.S"
|
||||
|
||||
@@ -373,7 +373,6 @@ void release_thread(struct task_struct *dead_task)
|
||||
}
|
||||
|
||||
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
|
||||
asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");
|
||||
|
||||
int
|
||||
copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
||||
@@ -388,13 +387,13 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
||||
*childregs = *regs;
|
||||
childregs->ARM_r0 = 0;
|
||||
childregs->ARM_sp = stack_start;
|
||||
thread->cpu_context.pc = (unsigned long)ret_from_fork;
|
||||
} else {
|
||||
memset(childregs, 0, sizeof(struct pt_regs));
|
||||
thread->cpu_context.r4 = stk_sz;
|
||||
thread->cpu_context.r5 = stack_start;
|
||||
thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread;
|
||||
childregs->ARM_cpsr = SVC_MODE;
|
||||
}
|
||||
thread->cpu_context.pc = (unsigned long)ret_from_fork;
|
||||
thread->cpu_context.sp = (unsigned long)childregs;
|
||||
|
||||
clear_ptrace_hw_breakpoint(p);
|
||||
|
||||
Reference in New Issue
Block a user