aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze/kernel/entry.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/microblaze/kernel/entry.S')
-rw-r--r--arch/microblaze/kernel/entry.S33
1 files changed, 10 insertions, 23 deletions
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index 03f7b8ce6b6b..10f360ed82b4 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -293,24 +293,6 @@ C_ENTRY(_user_exception):
293 swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */ 293 swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
294 addi r14, r14, 4 /* return address is 4 byte after call */ 294 addi r14, r14, 4 /* return address is 4 byte after call */
295 295
296 mfs r1, rmsr
297 nop
298 andi r1, r1, MSR_UMS
299 bnei r1, 1f
300
301/* Kernel-mode state save - kernel execve */
302 lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/
303 tophys(r1,r1);
304
305 addik r1, r1, -PT_SIZE; /* Make room on the stack. */
306 SAVE_REGS
307
308 swi r1, r1, PT_MODE; /* pt_regs -> kernel mode */
309 brid 2f;
310 nop; /* Fill delay slot */
311
312/* User-mode state save. */
3131:
314 lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ 296 lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */
315 tophys(r1,r1); 297 tophys(r1,r1);
316 lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */ 298 lwi r1, r1, TS_THREAD_INFO; /* get stack from task_struct */
@@ -479,11 +461,20 @@ C_ENTRY(sys_fork_wrapper):
479 saved context). */ 461 saved context). */
480C_ENTRY(ret_from_fork): 462C_ENTRY(ret_from_fork):
481 bralid r15, schedule_tail; /* ...which is schedule_tail's arg */ 463 bralid r15, schedule_tail; /* ...which is schedule_tail's arg */
482 add r3, r5, r0; /* switch_thread returns the prev task */ 464 add r5, r3, r0; /* switch_thread returns the prev task */
483 /* ( in the delay slot ) */ 465 /* ( in the delay slot ) */
484 brid ret_from_trap; /* Do normal trap return */ 466 brid ret_from_trap; /* Do normal trap return */
485 add r3, r0, r0; /* Child's fork call should return 0. */ 467 add r3, r0, r0; /* Child's fork call should return 0. */
486 468
469C_ENTRY(ret_from_kernel_thread):
470 bralid r15, schedule_tail; /* ...which is schedule_tail's arg */
471 add r5, r3, r0; /* switch_thread returns the prev task */
472 /* ( in the delay slot ) */
473 brald r15, r20 /* fn was left in r20 */
474 addk r5, r0, r19 /* ... and argument - in r19 */
475 brid ret_from_trap
476 add r3, r0, r0
477
487C_ENTRY(sys_vfork): 478C_ENTRY(sys_vfork):
488 brid microblaze_vfork /* Do real work (tail-call) */ 479 brid microblaze_vfork /* Do real work (tail-call) */
489 addik r5, r1, 0 480 addik r5, r1, 0
@@ -498,10 +489,6 @@ C_ENTRY(sys_clone):
498 brid do_fork /* Do real work (tail-call) */ 489 brid do_fork /* Do real work (tail-call) */
499 add r8, r0, r0; /* Arg 3: (unused) */ 490 add r8, r0, r0; /* Arg 3: (unused) */
500 491
501C_ENTRY(sys_execve):
502 brid microblaze_execve; /* Do real work (tail-call).*/
503 addik r8, r1, 0; /* add user context as 4th arg */
504
505C_ENTRY(sys_rt_sigreturn_wrapper): 492C_ENTRY(sys_rt_sigreturn_wrapper):
506 brid sys_rt_sigreturn /* Do real work */ 493 brid sys_rt_sigreturn /* Do real work */
507 addik r5, r1, 0; /* add user context as 1st arg */ 494 addik r5, r1, 0; /* add user context as 1st arg */