Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fff2fa0 authored by Al Viro's avatar Al Viro
Browse files

arm: switch to saner kernel_execve() semantics



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 22e2430d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ config ARM
	select GENERIC_STRNLEN_USER
	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
	select GENERIC_KERNEL_THREAD
	select GENERIC_KERNEL_EXECVE
	help
	  The ARM series is a line of low-power-consumption RISC chip designs
	  licensed by ARM Ltd and targeted at embedded applications and
+0 −1
Original line number Diff line number Diff line
@@ -470,7 +470,6 @@
#define __ARCH_WANT_SYS_SOCKETCALL
#endif
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_KERNEL_EXECVE

/*
 * "Conditional" syscalls
+4 −25
Original line number Diff line number Diff line
@@ -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"
+2 −3
Original line number Diff line number Diff line
@@ -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);