]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc/32: Perform normal function call in exception entry
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Fri, 12 Mar 2021 12:50:32 +0000 (12:50 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Mar 2021 02:22:07 +0000 (13:22 +1100)
Now that the MMU is re-enabled before calling the transfer function,
we don't need anymore that hack with the address of the handler and
the return function sitting just after the 'bl' to the transfer
fonction, that function is retrieving via a read relative to 'lr'.

Do a regular call to the transfer function, then to the handler,
then branch to the return function.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/73c00f3361ca280ef8fd7814c291bd1f5b6e2081.1615552867.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/head_32.h
arch/powerpc/kernel/head_booke.h

index ad1fd33e1126b1f32f0d4ac77c715a458fd48c33..fb849ef922fb39f3b276a48a2a4c59cfd3cbfc45 100644 (file)
@@ -104,7 +104,7 @@ transfer_to_handler:
 #ifdef CONFIG_PPC_BOOK3S_32
        kuep_lock r11, r12
 #endif
-       b       3f
+       blr
 
        /* if from kernel, check interrupted DOZE/NAP mode */
 2:
@@ -118,13 +118,7 @@ transfer_to_handler:
 #endif /* CONFIG_PPC_BOOK3S_32 || CONFIG_E500 */
        .globl transfer_to_handler_cont
 transfer_to_handler_cont:
-3:
-       mflr    r9
-       lwz     r11,0(r9)               /* virtual address of handler */
-       lwz     r9,4(r9)                /* where to go when done */
-       mtctr   r11
-       mtlr    r9
-       bctr                            /* jump to handler */
+       blr
 
 #if defined (CONFIG_PPC_BOOK3S_32) || defined(CONFIG_E500)
 4:     rlwinm  r12,r12,0,~_TLF_NAPPING
@@ -404,8 +398,8 @@ fee_restarts:
        stw     r10,_TRAP(r11)
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      transfer_to_handler_full
-       .long   unrecoverable_exception
-       .long   ret_from_except
+       bl      unrecoverable_exception
+       b       ret_from_except
 #endif
 
        .globl  ret_from_except_full
index 160ebd573c37944c7b02d2d6897bcbb0b849cdcb..e09585b88ba7b9a19334b70687e78758682ec666 100644 (file)
@@ -190,8 +190,8 @@ label:
        li      r10,trap;                                       \
        stw     r10,_TRAP(r11);                                 \
        bl      tfer;                                           \
-       .long   hdlr;                                           \
-       .long   ret
+       bl      hdlr;                                           \
+       b       ret
 
 #define EXC_XFER_STD(n, hdlr)          \
        EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler_full,        \
index a127d5e7efb4de6c48716b9caac2c9178650ff56..3707f49f0b78cff8e2a45e69752f263231100bd9 100644 (file)
@@ -322,9 +322,9 @@ label:
 #define EXC_XFER_TEMPLATE(hdlr, trap, msr, tfer, ret)  \
        li      r10,trap;                                       \
        stw     r10,_TRAP(r11);                                 \
-       bl      tfer;                                           \
-       .long   hdlr;                                           \
-       .long   ret
+       bl      tfer;                                           \
+       bl      hdlr;                                           \
+       b       ret;                                            \
 
 #define EXC_XFER_STD(n, hdlr)          \
        EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, transfer_to_handler_full, \