From 32a23ae6b0d3549bec7338e439e504db263dc390 Mon Sep 17 00:00:00 2001 From: Nicholas Piggin Date: Sun, 14 Apr 2019 15:18:37 +1000 Subject: asm/head: balance branches to avoid link stack predictor mispredicts The Linux wrapper for OPAL call and return is arranged like this: __opal_call: mflr r0 std r0,PPC_STK_LROFF(r1) LOAD_REG_ADDR(r11, opal_return) mtlr r11 hrfid -> OPAL opal_return: ld r0,PPC_STK_LROFF(r1) mtlr r0 blr When skiboot returns to Linux, it branches to LR (i.e., opal_return) with a blr. This unbalances the link stack predictor and will cause mispredicts back up the return stack. Signed-off-by: Nicholas Piggin Signed-off-by: Stewart Smith --- asm/head.S | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/asm/head.S b/asm/head.S index 916b22c5..bd061498 100644 --- a/asm/head.S +++ b/asm/head.S @@ -1090,7 +1090,12 @@ opal_entry: lwz %r11,CPUTHREAD_IN_OPAL_CALL(%r12) subi %r11,%r11,1 stw %r11,CPUTHREAD_IN_OPAL_CALL(%r12) - blr + /* + * blr with BH=01b means it's not a function return, OPAL was entered + * via (h)rfid not bl, so we don't have a corresponding link stack + * prediction to return to here. + */ + bclr 20,0,1 .global start_kernel start_kernel: -- cgit v1.2.1