forked from Minki/linux
arm: switch to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
22e2430d60
commit
9fff2fa0db
@ -50,6 +50,7 @@ config ARM
|
|||||||
select GENERIC_STRNLEN_USER
|
select GENERIC_STRNLEN_USER
|
||||||
select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
|
select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
|
||||||
select GENERIC_KERNEL_THREAD
|
select GENERIC_KERNEL_THREAD
|
||||||
|
select GENERIC_KERNEL_EXECVE
|
||||||
help
|
help
|
||||||
The ARM series is a line of low-power-consumption RISC chip designs
|
The ARM series is a line of low-power-consumption RISC chip designs
|
||||||
licensed by ARM Ltd and targeted at embedded applications and
|
licensed by ARM Ltd and targeted at embedded applications and
|
||||||
|
@ -470,7 +470,6 @@
|
|||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#endif
|
#endif
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
#define __ARCH_WANT_KERNEL_EXECVE
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Conditional" syscalls
|
* "Conditional" syscalls
|
||||||
|
@ -86,35 +86,14 @@ ENDPROC(ret_to_user)
|
|||||||
*/
|
*/
|
||||||
ENTRY(ret_from_fork)
|
ENTRY(ret_from_fork)
|
||||||
bl schedule_tail
|
bl schedule_tail
|
||||||
|
cmp r5, #0
|
||||||
|
movne r0, r4
|
||||||
|
movne lr, pc
|
||||||
|
movne pc, r5
|
||||||
get_thread_info tsk
|
get_thread_info tsk
|
||||||
mov why, #1
|
|
||||||
b ret_slow_syscall
|
b ret_slow_syscall
|
||||||
ENDPROC(ret_from_fork)
|
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
|
.equ NR_syscalls,0
|
||||||
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
|
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
|
||||||
#include "calls.S"
|
#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_fork(void) __asm__("ret_from_fork");
|
||||||
asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");
|
|
||||||
|
|
||||||
int
|
int
|
||||||
copy_thread(unsigned long clone_flags, unsigned long stack_start,
|
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 = *regs;
|
||||||
childregs->ARM_r0 = 0;
|
childregs->ARM_r0 = 0;
|
||||||
childregs->ARM_sp = stack_start;
|
childregs->ARM_sp = stack_start;
|
||||||
thread->cpu_context.pc = (unsigned long)ret_from_fork;
|
|
||||||
} else {
|
} else {
|
||||||
|
memset(childregs, 0, sizeof(struct pt_regs));
|
||||||
thread->cpu_context.r4 = stk_sz;
|
thread->cpu_context.r4 = stk_sz;
|
||||||
thread->cpu_context.r5 = stack_start;
|
thread->cpu_context.r5 = stack_start;
|
||||||
thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread;
|
|
||||||
childregs->ARM_cpsr = SVC_MODE;
|
childregs->ARM_cpsr = SVC_MODE;
|
||||||
}
|
}
|
||||||
|
thread->cpu_context.pc = (unsigned long)ret_from_fork;
|
||||||
thread->cpu_context.sp = (unsigned long)childregs;
|
thread->cpu_context.sp = (unsigned long)childregs;
|
||||||
|
|
||||||
clear_ptrace_hw_breakpoint(p);
|
clear_ptrace_hw_breakpoint(p);
|
||||||
|
Loading…
Reference in New Issue
Block a user