Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b48bbb82 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

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: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent a9af97aa
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -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