This moves MSR save/restore and some real-mode juggling out of asm and
into C code, simplifying things.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/kernel/rtas.c       | 15 ++++++++++++---
 arch/powerpc/kernel/rtas_entry.S | 32 +++++---------------------------
 2 files changed, 17 insertions(+), 30 deletions(-)

diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 6b5892d6a56b..87ede1877816 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -47,13 +47,22 @@
 /* This is here deliberately so it's only used in this file */
 void enter_rtas(unsigned long);
 
-static inline void do_enter_rtas(unsigned long args)
+static noinline void do_enter_rtas(unsigned long args)
 {
        BUG_ON(!irqs_disabled());
 
-       hard_irq_disable(); /* Ensure MSR[EE] is disabled on PPC64 */
+       if (IS_ENABLED(CONFIG_PPC64)) {
+               unsigned long msr;
 
-       enter_rtas(args);
+               hard_irq_disable();
+
+               msr = mfmsr();
+               mtmsr(msr & ~(MSR_IR|MSR_DR));
+               enter_rtas(args);
+               mtmsr(msr);
+       } else {
+               enter_rtas(args);
+       }
 
        srr_regs_clobbered(); /* rtas uses SRRs, invalidate */
 }
diff --git a/arch/powerpc/kernel/rtas_entry.S b/arch/powerpc/kernel/rtas_entry.S
index 5f65ea4436c6..292551684bbd 100644
--- a/arch/powerpc/kernel/rtas_entry.S
+++ b/arch/powerpc/kernel/rtas_entry.S
@@ -84,14 +84,11 @@ _GLOBAL(enter_rtas)
        li      r0,0
        mtcr    r0
 
-       mfmsr   r6
-
-       /* Unfortunately, the stack pointer and the MSR are also clobbered,
-        * so they are saved in the PACA which allows us to restore
-        * our original state after RTAS returns.
+       /*
+        * The stack pointer is clobbered, so it is saved in the PACA which
+        * allows us to restore our original state after RTAS returns.
         */
        std     r1,PACAR1(r13)
-       std     r6,PACASAVEDMSR(r13)
 
        /* Setup our real return addr */
        LOAD_REG_ADDR(r4,rtas_return_loc)
@@ -100,7 +97,6 @@ _GLOBAL(enter_rtas)
 
        LOAD_REG_IMMEDIATE(r6, MSR_ME)
 
-__enter_rtas:
        LOAD_REG_ADDR(r4, rtas)
        ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
        ld      r4,RTASBASE(r4)         /* get the rtas->base value */
@@ -112,6 +108,7 @@ __enter_rtas:
        mtspr   SPRN_SRR1,r6
        RFI_TO_KERNEL
        b       .       /* prevent speculative execution */
+_ASM_NOKPROBE_SYMBOL(enter_rtas)
 
 rtas_return_loc:
        FIXUP_ENDIAN
@@ -127,29 +124,10 @@ rtas_return_loc:
        sync
        mtmsrd  r6
 
-       /* relocation is off at this point */
        GET_PACA(r13)
 
-       bcl     20,31,$+4
-0:     mflr    r3
-       ld      r3,(1f-0b)(r3)          /* get &rtas_restore_regs */
-
        ld      r1,PACAR1(r13)          /* Restore our SP */
-       ld      r4,PACASAVEDMSR(r13)    /* Restore our MSR */
 
-       mtspr   SPRN_SRR0,r3
-       mtspr   SPRN_SRR1,r4
-       RFI_TO_KERNEL
-       b       .       /* prevent speculative execution */
-_ASM_NOKPROBE_SYMBOL(enter_rtas)
-_ASM_NOKPROBE_SYMBOL(__enter_rtas)
-_ASM_NOKPROBE_SYMBOL(rtas_return_loc)
-
-       .align  3
-1:     .8byte  rtas_restore_regs
-
-rtas_restore_regs:
-       /* relocation is on at this point */
        REST_GPR(2, r1)                 /* Restore the TOC */
        REST_NVGPRS(r1)                 /* Restore the non-volatiles */
 
@@ -169,5 +147,5 @@ rtas_restore_regs:
 
        mtlr    r0
        blr                             /* return to caller */
-
+_ASM_NOKPROBE_SYMBOL(rtas_return_loc)
 #endif /* CONFIG_PPC32 */
-- 
2.23.0

Reply via email to