microblaze: switch to generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 10 Oct 2012 15:52:44 +0000 (11:52 -0400)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 16 Nov 2012 07:45:47 +0000 (08:45 +0100)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/microblaze/Kconfig
arch/microblaze/kernel/entry-nommu.S
arch/microblaze/kernel/entry.S
arch/microblaze/kernel/process.c
arch/microblaze/kernel/sys_microblaze.c

index 3b8df669eecd3c4826387554498e33b126216855..198abf6d41c479ab119f02ad855a68a27bdbf2ce 100644 (file)
@@ -27,6 +27,7 @@ config MICROBLAZE
        select GENERIC_CLOCKEVENTS
        select MODULES_USE_ELF_RELA
        select GENERIC_KERNEL_THREAD
+       select GENERIC_KERNEL_EXECVE
 
 config SWAP
        def_bool n
index c47e92cd7e78b27049f4ef09e80d9e1815b65542..8957c7760c478799c86da9a51d4758401ad2df6a 100644 (file)
@@ -479,8 +479,8 @@ ENTRY(ret_from_kernel_thread)
        addk    r5, r0, r3
        brald   r15, r20
        addk    r5, r0, r19
-       brid    sys_exit        /* won't be returning... */
-       addk    r5, r0, r0
+       brid    ret_to_user
+       addk    r3, r0, r0
 
 work_pending:
        enable_irq
index be76d1338be06b1b0d64df72d003f6cef1c2908a..9aa54def998516695827258958be988427337337 100644 (file)
@@ -293,24 +293,6 @@ C_ENTRY(_user_exception):
        swi     r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
        addi    r14, r14, 4     /* return address is 4 byte after call */
 
-       mfs     r1, rmsr
-       nop
-       andi    r1, r1, MSR_UMS
-       bnei    r1, 1f
-
-/* Kernel-mode state save - kernel execve */
-       lwi     r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/
-       tophys(r1,r1);
-
-       addik   r1, r1, -PT_SIZE; /* Make room on the stack. */
-       SAVE_REGS
-
-       swi     r1, r1, PT_MODE; /* pt_regs -> kernel mode */
-       brid    2f;
-       nop;                            /* Fill delay slot */
-
-/* User-mode state save.  */
-1:
        lwi     r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */
        tophys(r1,r1);
        lwi     r1, r1, TS_THREAD_INFO; /* get stack from task_struct */
@@ -490,8 +472,8 @@ C_ENTRY(ret_from_kernel_thread):
                                /* ( in the delay slot ) */
        brald   r15, r20        /* fn was left in r20 */
        addk    r5, r0, r19     /* ... and argument - in r19 */
-       brid    sys_exit        /* won't be returning... */
-       addk    r5, r0, r0
+       brid    ret_from_trap
+       add     r3, r0, r0
 
 C_ENTRY(sys_vfork):
        brid    microblaze_vfork        /* Do real work (tail-call) */
index cbf8bb92f15960ceba01830a4c3a8401bfb58ee8..29768c3dc358a1c6719c1e90e26b9c08a2db4eed 100644 (file)
@@ -215,6 +215,7 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp)
        regs->pt_mode = 0;
 #ifdef CONFIG_MMU
        regs->msr |= MSR_UMS;
+       regs->msr &= ~MSR_VM;
 #endif
 }
 
index 404c0f24bd41a7acaf5496e86120b15f9e715cd8..b200ee7d1da95fcb532feddd9e1943e83fccddfa 100644 (file)
@@ -75,24 +75,3 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
 
        return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);
 }
-
-/*
- * 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,
-                 const char *const argv[],
-                 const char *const envp[])
-{
-       register const char *__a __asm__("r5") = filename;
-       register const void *__b __asm__("r6") = argv;
-       register const void *__c __asm__("r7") = envp;
-       register unsigned long __syscall __asm__("r12") = __NR_execve;
-       register unsigned long __ret __asm__("r3");
-       __asm__ __volatile__ ("brki r14, 0x8"
-                       : "=r" (__ret), "=r" (__syscall)
-                       : "1" (__syscall), "r" (__a), "r" (__b), "r" (__c)
-                       : "r4", "r8", "r9",
-                       "r10", "r11", "r14", "cc", "memory");
-       return __ret;
-}