From 18b8cb5141bea2ecea8d1e1760e001aa51ff0b2e Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Mon, 10 Sep 2012 16:11:46 +0100 Subject: [PATCH] arm64: Use generic kernel_execve() implementation This patch converts the arm64 port to use the generic kernel_execve() implementation. It introduces the ret_from_kernel_execve() function for starting the new user context. Signed-off-by: Catalin Marinas --- arch/arm64/Kconfig | 1 + arch/arm64/kernel/entry.S | 12 ++++------- arch/arm64/kernel/process.c | 5 ++--- arch/arm64/kernel/sys.c | 43 ------------------------------------- 4 files changed, 7 insertions(+), 54 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 4077b71b1258..31e3b5eb4047 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -7,6 +7,7 @@ config ARM64 select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW select GENERIC_KERNEL_THREAD + select GENERIC_KERNEL_EXECVE select GENERIC_SMP_IDLE_THREAD select GENERIC_TIME_VSYSCALL select HARDIRQS_SW_RESEND diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 883043d3a1d0..9138db4eeb35 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -594,7 +594,7 @@ work_resched: /* * "slow" syscall return path. */ -ENTRY(ret_to_user) +ret_to_user: disable_irq // disable interrupts ldr x1, [tsk, #TI_FLAGS] and x2, x1, #_TIF_WORK_MASK @@ -611,17 +611,13 @@ ENDPROC(ret_to_user) */ ENTRY(ret_from_fork) bl schedule_tail + cmp x19, #0 + movne x0, x20 + blne x19 get_thread_info tsk b ret_to_user ENDPROC(ret_from_fork) -ENTRY(ret_from_kernel_thread) - bl schedule_tail - mov x0, x20 - adr lr, do_exit // kernel threads should not exit - br x19 -ENDPROC(ret_from_kernel_thread) - /* * SVC handler. */ diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 2d074ac6a00a..bf615e212c6c 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -232,7 +232,6 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) } 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, unsigned long stk_sz, struct task_struct *p, @@ -262,13 +261,13 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, */ if (clone_flags & CLONE_SETTLS) tls = regs->regs[3]; - p->thread.cpu_context.pc = (unsigned long)ret_from_fork; } else { + memset(childregs, 0, sizeof(struct pt_regs)); childregs->pstate = PSR_MODE_EL1h; p->thread.cpu_context.x19 = stack_start; p->thread.cpu_context.x20 = stk_sz; - p->thread.cpu_context.pc = (unsigned long)ret_from_kernel_thread; } + p->thread.cpu_context.pc = (unsigned long)ret_from_fork; p->thread.cpu_context.sp = (unsigned long)childregs; p->thread.tp_value = tls; diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index b120df37de35..4deb0d0093cd 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c @@ -62,49 +62,6 @@ out: return error; } -int kernel_execve(const char *filename, - const char *const argv[], - const char *const envp[]) -{ - struct pt_regs regs; - int ret; - - memset(®s, 0, sizeof(struct pt_regs)); - ret = do_execve(filename, - (const char __user *const __user *)argv, - (const char __user *const __user *)envp, ®s); - if (ret < 0) - goto out; - - /* - * Save argc to the register structure for userspace. - */ - regs.regs[0] = ret; - - /* - * We were successful. We won't be returning to our caller, but - * instead to user space by manipulating the kernel stack. - */ - asm( "add x0, %0, %1\n\t" - "mov x1, %2\n\t" - "mov x2, %3\n\t" - "bl memmove\n\t" /* copy regs to top of stack */ - "mov x27, #0\n\t" /* not a syscall */ - "mov x28, %0\n\t" /* thread structure */ - "mov sp, x0\n\t" /* reposition stack pointer */ - "b ret_to_user" - : - : "r" (current_thread_info()), - "Ir" (THREAD_START_SP - sizeof(regs)), - "r" (®s), - "Ir" (sizeof(regs)) - : "x0", "x1", "x2", "x27", "x28", "x30", "memory"); - - out: - return ret; -} -EXPORT_SYMBOL(kernel_execve); - asmlinkage long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, off_t off) -- 2.39.5