]> git.karo-electronics.de Git - linux-beck.git/commitdiff
microblaze: Use delay slot in syscall macros
authorMichal Simek <monstr@monstr.eu>
Tue, 22 Jun 2010 16:09:29 +0000 (18:09 +0200)
committerMichal Simek <monstr@monstr.eu>
Wed, 4 Aug 2010 08:32:22 +0000 (10:32 +0200)
Saving instruction with delay slot usage.

Signed-off-by: Michal Simek <monstr@monstr.eu>
arch/microblaze/kernel/entry.S

index 0747e1d61d553d4064e59f7e9701feed211b64d2..34100a52619473847f50021853daf940976cf14c 100644 (file)
@@ -411,10 +411,8 @@ C_ENTRY(_user_exception):
 
        /* The syscall number is invalid, return an error.  */
 5:
+       rtsd    r15, 8;         /* looks like a normal subroutine return */
        addi    r3, r0, -ENOSYS;
-       rtsd    r15,8;          /* looks like a normal subroutine return */
-       or      r0, r0, r0
-
 
 /* Entry point used to return from a syscall/trap */
 /* We re-enable BIP bit before state restore */
@@ -491,9 +489,8 @@ C_ENTRY(sys_fork_wrapper):
        addik   r7, r1, PTO                     /* Arg 2: parent context */
        add     r8. r0, r0                      /* Arg 3: (unused) */
        add     r9, r0, r0;                     /* Arg 4: (unused) */
-       add     r10, r0, r0;                    /* Arg 5: (unused) */
        brid    do_fork         /* Do real work (tail-call) */
-       nop;
+       add     r10, r0, r0;                    /* Arg 5: (unused) */
 
 /* This the initial entry point for a new child thread, with an appropriate
    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):
        bralid  r15, schedule_tail; /* ...which is schedule_tail's arg */
        add     r3, r5, r0;     /* switch_thread returns the prev task */
                                /* ( in the delay slot ) */
-       add     r3, r0, r0;     /* Child's fork call should return 0. */
        brid    ret_from_trap;  /* Do normal trap return */
-       nop;
+       add     r3, r0, r0;     /* Child's fork call should return 0. */
 
 C_ENTRY(sys_vfork):
        brid    microblaze_vfork        /* Do real work (tail-call) */
@@ -518,21 +514,18 @@ C_ENTRY(sys_clone):
 1:     addik   r7, r1, PTO;                    /* Arg 2: parent context */
        add     r8, r0, r0;                     /* Arg 3: (unused) */
        add     r9, r0, r0;                     /* Arg 4: (unused) */
-       add     r10, r0, r0;                    /* Arg 5: (unused) */
        brid    do_fork         /* Do real work (tail-call) */
-       nop;
+       add     r10, r0, r0;                    /* Arg 5: (unused) */
 
 C_ENTRY(sys_execve):
-       addik   r8, r1, PTO;            /* add user context as 4th arg */
        brid    microblaze_execve;      /* Do real work (tail-call).*/
-       nop;
+       addik   r8, r1, PTO;            /* add user context as 4th arg */
 
 C_ENTRY(sys_rt_sigreturn_wrapper):
        swi     r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
        swi     r4, r1, PTO+PT_R4;
-       addik   r5, r1, PTO;            /* add user context as 1st arg */
        brlid   r15, sys_rt_sigreturn   /* Do real work */
-       nop;
+       addik   r5, r1, PTO;            /* add user context as 1st arg */
        lwi     r3, r1, PTO+PT_R3; /* restore saved r3, r4 registers */
        lwi     r4, r1, PTO+PT_R4;
        bri ret_from_trap /* fall through will not work here due to align */
@@ -553,7 +546,6 @@ C_ENTRY(full_exception_trap):
         * I tested it but there is a fault */
        /* where the trap should return need -8 to adjust for rtsd r15, 8 */
        addik   r15, r0, ret_from_exc - 8
-       addik   r5, r1, PTO              /* parameter struct pt_regs * regs */
        mfs     r6, resr
        nop
        mfs     r7, rfsr;               /* save FSR */
@@ -561,7 +553,7 @@ C_ENTRY(full_exception_trap):
        mts     rfsr, r0;       /* Clear sticky fsr */
        nop
        rted    r0, full_exception
-       nop
+       addik   r5, r1, PTO              /* parameter struct pt_regs * regs */
 
 /*
  * Unaligned data trap.
@@ -623,13 +615,12 @@ C_ENTRY(page_fault_data_trap):
        tovirt(r1,r1)
        /* where the trap should return need -8 to adjust for rtsd r15, 8 */
        addik   r15, r0, ret_from_exc-8
-       addik   r5, r1, PTO             /* parameter struct pt_regs * regs */
        mfs     r6, rear                /* parameter unsigned long address */
        nop
        mfs     r7, resr                /* parameter unsigned long error_code */
        nop
        rted    r0, do_page_fault
-       nop
+       addik   r5, r1, PTO             /* parameter struct pt_regs * regs */
 
 C_ENTRY(page_fault_instr_trap):
        SAVE_STATE              /* Save registers.*/
@@ -638,11 +629,11 @@ C_ENTRY(page_fault_instr_trap):
        tovirt(r1,r1)
        /* where the trap should return need -8 to adjust for rtsd r15, 8 */
        addik   r15, r0, ret_from_exc-8
-       addik   r5, r1, PTO             /* parameter struct pt_regs * regs */
        mfs     r6, rear                /* parameter unsigned long address */
        nop
-       rted    r0, do_page_fault
        ori     r7, r0, 0               /* parameter unsigned long error_code */
+       rted    r0, do_page_fault
+       addik   r5, r1, PTO             /* parameter struct pt_regs * regs */
 
 /* Entry point used to return from an exception.  */
 C_ENTRY(ret_from_exc):