Re: [PATCH] powerpc/powernv: de-deuplicate OPAL call wrappers

2017-03-15 Thread Michael Ellerman
Oliver O'Halloran  writes:

> Currently the code to perform an OPAL call is duplicated between the
> normal path and path taken when tracepoints are enabled. There's no
> real need for this and combining them makes opal_tracepoint_entry
> considerably easier to understand.

Sorry I missed this when you sent it.

I don't think it applies any more, but if you rebased it I'd merge it.

cheers


[PATCH] powerpc/powernv: de-deuplicate OPAL call wrappers

2016-10-30 Thread Oliver O'Halloran
Currently the code to perform an OPAL call is duplicated between the
normal path and path taken when tracepoints are enabled. There's no
real need for this and combining them makes opal_tracepoint_entry
considerably easier to understand.

Signed-off-by: Oliver O'Halloran 
---
 arch/powerpc/platforms/powernv/opal-wrappers.S | 44 ++
 1 file changed, 17 insertions(+), 27 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S 
b/arch/powerpc/platforms/powernv/opal-wrappers.S
index 44d2d842cee7..3ebe0db7ffeb 100644
--- a/arch/powerpc/platforms/powernv/opal-wrappers.S
+++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
@@ -50,18 +50,14 @@ END_FTR_SECTION(0, 1);  
\
 #define OPAL_BRANCH(LABEL)
 #endif
 
-/* TODO:
+/*
+ * DO_OPAL_CALL assumes:
  *
- * - Trace irqs in/off (needs saving/restoring all args, argh...)
- * - Get r11 feed up by Dave so I can have better register usage
+ * r0 = OPAL call token
+ * LR has been saved on the stack
  */
 
-#define OPAL_CALL(name, token) \
- _GLOBAL_TOC(name);\
-   mflrr0; \
-   std r0,PPC_LR_STKOFF(r1);   \
-   li  r0,token;   \
-   OPAL_BRANCH(opal_tracepoint_entry) \
+#define DO_OPAL_CALL() \
mfcrr12;\
stw r12,8(r1);  \
li  r11,0;  \
@@ -81,6 +77,14 @@ END_FTR_SECTION(0, 1);   
\
mtspr   SPRN_HSRR0,r12; \
hrfid
 
+#define OPAL_CALL(name, token) \
+ _GLOBAL_TOC(name);\
+   mflrr0; \
+   std r0,PPC_LR_STKOFF(r1);   \
+   li  r0,token;   \
+   OPAL_BRANCH(opal_tracepoint_entry) \
+   DO_OPAL_CALL()
+
 opal_return:
/*
 * Fixup endian on OPAL return... we should be able to simplify
@@ -122,26 +126,12 @@ opal_tracepoint_entry:
ld  r8,STK_REG(R29)(r1)
ld  r9,STK_REG(R30)(r1)
ld  r10,STK_REG(R31)(r1)
+
+   /* return from the opal call via tracepoint_return */
LOAD_REG_ADDR(r11,opal_tracepoint_return)
-   mfcrr12
std r11,16(r1)
-   stw r12,8(r1)
-   li  r11,0
-   mfmsr   r12
-   ori r11,r11,MSR_EE
-   std r12,PACASAVEDMSR(r13)
-   andcr12,r12,r11
-   mtmsrd  r12,1
-   LOAD_REG_ADDR(r11,opal_return)
-   mtlrr11
-   li  r11,MSR_DR|MSR_IR|MSR_LE
-   andcr12,r12,r11
-   mtspr   SPRN_HSRR1,r12
-   LOAD_REG_ADDR(r11,opal)
-   ld  r12,8(r11)
-   ld  r2,0(r11)
-   mtspr   SPRN_HSRR0,r12
-   hrfid
+
+   DO_OPAL_CALL()
 
 opal_tracepoint_return:
std r3,STK_REG(R31)(r1)
-- 
2.5.5