@@ -1646,7 +1646,7 @@ _GLOBAL(__replay_interrupt)
* we don't give a damn about, so we don't bother storing them.
*/
mfmsr r12
- mflr r11
+ LOAD_REG_ADDR(r11, __replay_interrupt_return)
mfcr r9
ori r12,r12,MSR_EE
cmpwi r3,0x900
@@ -1664,6 +1664,7 @@ FTR_SECTION_ELSE
cmpwi r3,0xa00
beq doorbell_super_common_msgclr
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
+__replay_interrupt_return:
blr
/*
@@ -1673,7 +1674,7 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
_GLOBAL(__replay_wakeup_interrupt)
extrdi r3,r3,42,4 /* Get SRR1 wake reason in low bits */
mfmsr r12
- mflr r11
+ LOAD_REG_ADDR(r11, __replay_wakeup_interrupt_return)
mfcr r9
ori r12,r12,MSR_EE
cmpwi r3,0x6
@@ -1692,4 +1693,5 @@ FTR_SECTION_ELSE
beq doorbell_super_common_msgclr
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
mtmsrd r12,1
+__replay_wakeup_interrupt_return:
blr
The __replay_interrupt code is branched to with bl, but the caller is returned to directly with rfid from the interrupt. Instead return to a return stub that returns to the caller with blr, which should do better with the return predictor. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- arch/powerpc/kernel/exceptions-64s.S | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)