diff options
Diffstat (limited to 'arch/microblaze/kernel/entry.S')
-rw-r--r-- | arch/microblaze/kernel/entry.S | 33 |
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. */ | ||
313 | 1: | ||
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). */ |
480 | C_ENTRY(ret_from_fork): | 462 | C_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 | ||
469 | C_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 | |||
487 | C_ENTRY(sys_vfork): | 478 | C_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 | ||
501 | C_ENTRY(sys_execve): | ||
502 | brid microblaze_execve; /* Do real work (tail-call).*/ | ||
503 | addik r8, r1, 0; /* add user context as 4th arg */ | ||
504 | |||
505 | C_ENTRY(sys_rt_sigreturn_wrapper): | 492 | C_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 */ |