mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-29 04:45:05 +00:00
powerpc/64s: Don't unbalance the return branch predictor in __replay_interrupt()
The __replay_interrupt() code is branched to with bl, but the caller is returned to directly with rfid from the interrupt. Instead, rfid to a stub that returns to the caller with blr, which should keep the return branch predictor balanced. Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
a9af97aa0a
commit
b48bbb82e2
@ -1639,6 +1639,10 @@ doorbell_super_common_msgclr:
|
|||||||
* Note: While MSR:EE is off, we need to make sure that _MSR
|
* Note: While MSR:EE is off, we need to make sure that _MSR
|
||||||
* in the generated frame has EE set to 1 or the exception
|
* in the generated frame has EE set to 1 or the exception
|
||||||
* handler will not properly re-enable them.
|
* handler will not properly re-enable them.
|
||||||
|
*
|
||||||
|
* Note that we don't specify LR as the NIP (return address) for
|
||||||
|
* the interrupt because that would unbalance the return branch
|
||||||
|
* predictor.
|
||||||
*/
|
*/
|
||||||
_GLOBAL(__replay_interrupt)
|
_GLOBAL(__replay_interrupt)
|
||||||
/* We are going to jump to the exception common code which
|
/* We are going to jump to the exception common code which
|
||||||
@ -1646,7 +1650,7 @@ _GLOBAL(__replay_interrupt)
|
|||||||
* we don't give a damn about, so we don't bother storing them.
|
* we don't give a damn about, so we don't bother storing them.
|
||||||
*/
|
*/
|
||||||
mfmsr r12
|
mfmsr r12
|
||||||
mflr r11
|
LOAD_REG_ADDR(r11, .L__replay_interrupt_return)
|
||||||
mfcr r9
|
mfcr r9
|
||||||
ori r12,r12,MSR_EE
|
ori r12,r12,MSR_EE
|
||||||
cmpwi r3,0x900
|
cmpwi r3,0x900
|
||||||
@ -1664,4 +1668,6 @@ FTR_SECTION_ELSE
|
|||||||
cmpwi r3,0xa00
|
cmpwi r3,0xa00
|
||||||
beq doorbell_super_common_msgclr
|
beq doorbell_super_common_msgclr
|
||||||
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
|
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
|
||||||
|
.L__replay_interrupt_return:
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user