aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze/kernel
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2010-06-22 12:09:29 -0400
committerMichal Simek <monstr@monstr.eu>2010-08-04 04:32:22 -0400
commit9814cc11e559d982874f6ebac2bc795e33cb0244 (patch)
tree61c7226b24bedef5e9c517bd46b7b79fa373fa5c /arch/microblaze/kernel
parentda23355280d106b1160a0a07028838097b639f0b (diff)
microblaze: Use delay slot in syscall macros
Saving instruction with delay slot usage. Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/kernel')
-rw-r--r--arch/microblaze/kernel/entry.S29
1 files changed, 10 insertions, 19 deletions
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index 0747e1d61d55..34100a526194 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -411,10 +411,8 @@ C_ENTRY(_user_exception):
411 411
412 /* The syscall number is invalid, return an error. */ 412 /* The syscall number is invalid, return an error. */
4135: 4135:
414 rtsd r15, 8; /* looks like a normal subroutine return */
414 addi r3, r0, -ENOSYS; 415 addi r3, r0, -ENOSYS;
415 rtsd r15,8; /* looks like a normal subroutine return */
416 or r0, r0, r0
417
418 416
419/* Entry point used to return from a syscall/trap */ 417/* Entry point used to return from a syscall/trap */
420/* We re-enable BIP bit before state restore */ 418/* We re-enable BIP bit before state restore */
@@ -491,9 +489,8 @@ C_ENTRY(sys_fork_wrapper):
491 addik r7, r1, PTO /* Arg 2: parent context */ 489 addik r7, r1, PTO /* Arg 2: parent context */
492 add r8. r0, r0 /* Arg 3: (unused) */ 490 add r8. r0, r0 /* Arg 3: (unused) */
493 add r9, r0, r0; /* Arg 4: (unused) */ 491 add r9, r0, r0; /* Arg 4: (unused) */
494 add r10, r0, r0; /* Arg 5: (unused) */
495 brid do_fork /* Do real work (tail-call) */ 492 brid do_fork /* Do real work (tail-call) */
496 nop; 493 add r10, r0, r0; /* Arg 5: (unused) */
497 494
498/* This the initial entry point for a new child thread, with an appropriate 495/* This the initial entry point for a new child thread, with an appropriate
499 stack in place that makes it look the the child is in the middle of an 496 stack in place that makes it look the the child is in the middle of an
@@ -504,9 +501,8 @@ C_ENTRY(ret_from_fork):
504 bralid r15, schedule_tail; /* ...which is schedule_tail's arg */ 501 bralid r15, schedule_tail; /* ...which is schedule_tail's arg */
505 add r3, r5, r0; /* switch_thread returns the prev task */ 502 add r3, r5, r0; /* switch_thread returns the prev task */
506 /* ( in the delay slot ) */ 503 /* ( in the delay slot ) */
507 add r3, r0, r0; /* Child's fork call should return 0. */
508 brid ret_from_trap; /* Do normal trap return */ 504 brid ret_from_trap; /* Do normal trap return */
509 nop; 505 add r3, r0, r0; /* Child's fork call should return 0. */
510 506
511C_ENTRY(sys_vfork): 507C_ENTRY(sys_vfork):
512 brid microblaze_vfork /* Do real work (tail-call) */ 508 brid microblaze_vfork /* Do real work (tail-call) */
@@ -518,21 +514,18 @@ C_ENTRY(sys_clone):
5181: addik r7, r1, PTO; /* Arg 2: parent context */ 5141: addik r7, r1, PTO; /* Arg 2: parent context */
519 add r8, r0, r0; /* Arg 3: (unused) */ 515 add r8, r0, r0; /* Arg 3: (unused) */
520 add r9, r0, r0; /* Arg 4: (unused) */ 516 add r9, r0, r0; /* Arg 4: (unused) */
521 add r10, r0, r0; /* Arg 5: (unused) */
522 brid do_fork /* Do real work (tail-call) */ 517 brid do_fork /* Do real work (tail-call) */
523 nop; 518 add r10, r0, r0; /* Arg 5: (unused) */
524 519
525C_ENTRY(sys_execve): 520C_ENTRY(sys_execve):
526 addik r8, r1, PTO; /* add user context as 4th arg */
527 brid microblaze_execve; /* Do real work (tail-call).*/ 521 brid microblaze_execve; /* Do real work (tail-call).*/
528 nop; 522 addik r8, r1, PTO; /* add user context as 4th arg */
529 523
530C_ENTRY(sys_rt_sigreturn_wrapper): 524C_ENTRY(sys_rt_sigreturn_wrapper):
531 swi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */ 525 swi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
532 swi r4, r1, PTO+PT_R4; 526 swi r4, r1, PTO+PT_R4;
533 addik r5, r1, PTO; /* add user context as 1st arg */
534 brlid r15, sys_rt_sigreturn /* Do real work */ 527 brlid r15, sys_rt_sigreturn /* Do real work */
535 nop; 528 addik r5, r1, PTO; /* add user context as 1st arg */
536 lwi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */ 529 lwi r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
537 lwi r4, r1, PTO+PT_R4; 530 lwi r4, r1, PTO+PT_R4;
538 bri ret_from_trap /* fall through will not work here due to align */ 531 bri ret_from_trap /* fall through will not work here due to align */
@@ -553,7 +546,6 @@ C_ENTRY(full_exception_trap):
553 * I tested it but there is a fault */ 546 * I tested it but there is a fault */
554 /* where the trap should return need -8 to adjust for rtsd r15, 8 */ 547 /* where the trap should return need -8 to adjust for rtsd r15, 8 */
555 addik r15, r0, ret_from_exc - 8 548 addik r15, r0, ret_from_exc - 8
556 addik r5, r1, PTO /* parameter struct pt_regs * regs */
557 mfs r6, resr 549 mfs r6, resr
558 nop 550 nop
559 mfs r7, rfsr; /* save FSR */ 551 mfs r7, rfsr; /* save FSR */
@@ -561,7 +553,7 @@ C_ENTRY(full_exception_trap):
561 mts rfsr, r0; /* Clear sticky fsr */ 553 mts rfsr, r0; /* Clear sticky fsr */
562 nop 554 nop
563 rted r0, full_exception 555 rted r0, full_exception
564 nop 556 addik r5, r1, PTO /* parameter struct pt_regs * regs */
565 557
566/* 558/*
567 * Unaligned data trap. 559 * Unaligned data trap.
@@ -623,13 +615,12 @@ C_ENTRY(page_fault_data_trap):
623 tovirt(r1,r1) 615 tovirt(r1,r1)
624 /* where the trap should return need -8 to adjust for rtsd r15, 8 */ 616 /* where the trap should return need -8 to adjust for rtsd r15, 8 */
625 addik r15, r0, ret_from_exc-8 617 addik r15, r0, ret_from_exc-8
626 addik r5, r1, PTO /* parameter struct pt_regs * regs */
627 mfs r6, rear /* parameter unsigned long address */ 618 mfs r6, rear /* parameter unsigned long address */
628 nop 619 nop
629 mfs r7, resr /* parameter unsigned long error_code */ 620 mfs r7, resr /* parameter unsigned long error_code */
630 nop 621 nop
631 rted r0, do_page_fault 622 rted r0, do_page_fault
632 nop 623 addik r5, r1, PTO /* parameter struct pt_regs * regs */
633 624
634C_ENTRY(page_fault_instr_trap): 625C_ENTRY(page_fault_instr_trap):
635 SAVE_STATE /* Save registers.*/ 626 SAVE_STATE /* Save registers.*/
@@ -638,11 +629,11 @@ C_ENTRY(page_fault_instr_trap):
638 tovirt(r1,r1) 629 tovirt(r1,r1)
639 /* where the trap should return need -8 to adjust for rtsd r15, 8 */ 630 /* where the trap should return need -8 to adjust for rtsd r15, 8 */
640 addik r15, r0, ret_from_exc-8 631 addik r15, r0, ret_from_exc-8
641 addik r5, r1, PTO /* parameter struct pt_regs * regs */
642 mfs r6, rear /* parameter unsigned long address */ 632 mfs r6, rear /* parameter unsigned long address */
643 nop 633 nop
644 rted r0, do_page_fault
645 ori r7, r0, 0 /* parameter unsigned long error_code */ 634 ori r7, r0, 0 /* parameter unsigned long error_code */
635 rted r0, do_page_fault
636 addik r5, r1, PTO /* parameter struct pt_regs * regs */
646 637
647/* Entry point used to return from an exception. */ 638/* Entry point used to return from an exception. */
648C_ENTRY(ret_from_exc): 639C_ENTRY(ret_from_exc):