mn10300: switch to generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 19 Sep 2012 17:18:20 +0000 (13:18 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 04:53:59 +0000 (00:53 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/mn10300/include/asm/frame.inc
arch/mn10300/include/asm/processor.h
arch/mn10300/include/asm/unistd.h
arch/mn10300/kernel/Makefile
arch/mn10300/kernel/entry.S
arch/mn10300/kernel/kernel_execve.S [deleted file]

index 2ee58e3..1c3eb4f 100644 (file)
@@ -61,7 +61,7 @@
 ###############################################################################
 .macro RESTORE_ALL
        # peel back the stack to the calling frame
-       # - this permits execve() to discard extra frames due to kernel syscalls
+       # - we need that when returning from interrupts to kernel mode
        GET_THREAD_INFO a0
        mov     (TI_frame,a0),fp
        mov     fp,sp
index 247928c..0b844a2 100644 (file)
@@ -119,20 +119,13 @@ struct thread_struct {
 
 /*
  * do necessary setup to start up a newly executed thread
- * - need to discard the frame stacked by the kernel thread invoking the execve
- *   syscall (see RESTORE_ALL macro)
  */
 static inline void start_thread(struct pt_regs *regs,
                                unsigned long new_pc, unsigned long new_sp)
 {
-       struct thread_info *ti = current_thread_info();
-       struct pt_regs *frame0;
-
-       frame0 = thread_info_to_uregs(ti);
-       frame0->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
-       frame0->pc = new_pc;
-       frame0->sp = new_sp;
-       ti->frame = frame0;
+       regs->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
+       regs->pc = new_pc;
+       regs->sp = new_sp;
 }
 
 
index a965de4..044c770 100644 (file)
 #define __ARCH_WANT_SYS_RT_SIGACTION
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_EXECVE
+#define __ARCH_WANT_KERNEL_EXECVE
 
 /*
  * "Conditional" syscalls
index 142c129..561029f 100644 (file)
@@ -8,7 +8,7 @@ fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o
 
 obj-y   := process.o signal.o entry.o traps.o irq.o \
           ptrace.o setup.o time.o sys_mn10300.o io.o \
-          switch_to.o mn10300_ksyms.o kernel_execve.o $(fpu-obj-y) \
+          switch_to.o mn10300_ksyms.o $(fpu-obj-y) \
           csrc-mn10300.o cevt-mn10300.o
 
 obj-$(CONFIG_SMP) += smp.o smp-low.o
index 000f144..7dee5f6 100644 (file)
@@ -62,6 +62,13 @@ ENTRY(ret_from_kernel_thread)
        calls   (a0)
        jmp     sys_exit
 
+ENTRY(ret_from_kernel_execve)
+       add     -12,d0  /* pt_regs -> frame */
+       mov     d0,sp
+       GET_THREAD_INFO a2
+       clr     d0
+       jmp     syscall_exit
+
 ###############################################################################
 #
 # system call handler
diff --git a/arch/mn10300/kernel/kernel_execve.S b/arch/mn10300/kernel/kernel_execve.S
deleted file mode 100644 (file)
index 86039f1..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* MN10300 In-kernel program execution
- *
- * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licence
- * as published by the Free Software Foundation; either version
- * 2 of the Licence, or (at your option) any later version.
- */
-#include <linux/linkage.h>
-#include <asm/unistd.h>
-
-###############################################################################
-#
-# Do a system call from kernel instead of calling sys_execve so we end up with
-# proper pt_regs.
-#
-# int kernel_execve(const char *filename, char *const argv[],
-#                  char *const envp[])
-#
-# On entry: D0/D1/8(SP): arguments to function
-# On return: D0: syscall return.
-#
-###############################################################################
-       .globl          kernel_execve
-       .type           kernel_execve,@function
-kernel_execve:
-       mov             a3,a1
-       mov             d0,a0
-       mov             (12,sp),a3
-       mov             +__NR_execve,d0
-       syscall         0
-       mov             a1,a3
-       rets
-
-       .size           kernel_execve,.-kernel_execve