openrisc: switch to use of generic fork and clone
[sfrench/cifs-2.6.git] / arch / openrisc / kernel / entry.S
index ddfcaa828b0e97daf804355ab4f9744e7e87dc93..5e5b30601bbf58e42cc54fbca7ffc285025db929 100644 (file)
@@ -894,6 +894,16 @@ ENTRY(ret_from_fork)
        l.jal   schedule_tail
         l.nop
 
+       /* Check if we are a kernel thread */
+       l.sfeqi r20,0
+       l.bf    1f
+        l.nop
+
+       /* ...we are a kernel thread so invoke the requested callback */
+       l.jalr  r20
+        l.or   r3,r22,r0
+
+1:
        /* _syscall_returns expect r11 to contain return value */
        l.lwz   r11,PT_GPR11(r1)
 
@@ -915,26 +925,6 @@ ENTRY(ret_from_fork)
        l.j     _syscall_return
         l.nop
 
-/* Since syscalls don't save call-clobbered registers, the args to
- * kernel_thread_helper will need to be passed through callee-saved
- * registers and copied to the parameter registers when the thread
- * begins running.
- *
- * See arch/openrisc/kernel/process.c:
- * The args are passed as follows:
- *   arg1 (r3) : passed in r20
- *   arg2 (r4) : passed in r22
- */
-
-ENTRY(_kernel_thread_helper)
-       l.or    r3,r20,r0
-       l.or    r4,r22,r0
-       l.movhi r31,hi(kernel_thread_helper)
-       l.ori   r31,r31,lo(kernel_thread_helper)
-       l.jr    r31
-        l.nop
-
-
 /* ========================================================[ switch ] === */
 
 /*
@@ -1044,8 +1034,13 @@ ENTRY(_switch)
        /* Unwind stack to pre-switch state */
        l.addi  r1,r1,(INT_FRAME_SIZE)
 
-       /* Return via the link-register back to where we 'came from', where that can be
-        * either schedule() or return_from_fork()... */
+       /* Return via the link-register back to where we 'came from', where
+        * that may be either schedule(), ret_from_fork(), or
+        * ret_from_kernel_thread().  If we are returning to a new thread,
+        * we are expected to have set up the arg to schedule_tail already,
+        * hence we do so here unconditionally:
+        */
+       l.lwz   r3,TI_STACK(r3)         /* Load 'prev' as schedule_tail arg */
        l.jr    r9
         l.nop
 
@@ -1076,22 +1071,18 @@ _fork_save_extra_regs_and_call:
        l.jr    r29
         l.sw    PT_GPR28(r1),r28
 
-ENTRY(sys_clone)
-       l.movhi r29,hi(_sys_clone)
-       l.ori   r29,r29,lo(_sys_clone)
+ENTRY(__sys_clone)
+       l.movhi r29,hi(sys_clone)
+       l.ori   r29,r29,lo(sys_clone)
        l.j     _fork_save_extra_regs_and_call
         l.addi r7,r1,0
 
-ENTRY(sys_fork)
-       l.movhi r29,hi(_sys_fork)
-       l.ori   r29,r29,lo(_sys_fork)
+ENTRY(__sys_fork)
+       l.movhi r29,hi(sys_fork)
+       l.ori   r29,r29,lo(sys_fork)
        l.j     _fork_save_extra_regs_and_call
         l.addi r3,r1,0
 
-ENTRY(sys_execve)
-       l.j     _sys_execve
-        l.addi r6,r1,0
-
 ENTRY(sys_sigaltstack)
        l.j     _sys_sigaltstack
         l.addi r5,r1,0