|
@@ -50,21 +50,13 @@ END_FTR_SECTION(0, 1); \
|
|
|
#define OPAL_BRANCH(LABEL)
|
|
|
#endif
|
|
|
|
|
|
-/* TODO:
|
|
|
- *
|
|
|
- * - Trace irqs in/off (needs saving/restoring all args, argh...)
|
|
|
- * - Get r11 feed up by Dave so I can have better register usage
|
|
|
+/*
|
|
|
+ * DO_OPAL_CALL assumes:
|
|
|
+ * r0 = opal call token
|
|
|
+ * r12 = msr
|
|
|
+ * LR has been saved
|
|
|
*/
|
|
|
-
|
|
|
-#define OPAL_CALL(name, token) \
|
|
|
- _GLOBAL_TOC(name); \
|
|
|
- mfmsr r12; \
|
|
|
- mflr r0; \
|
|
|
- andi. r11,r12,MSR_IR|MSR_DR; \
|
|
|
- std r0,PPC_LR_STKOFF(r1); \
|
|
|
- li r0,token; \
|
|
|
- beq opal_real_call; \
|
|
|
- OPAL_BRANCH(opal_tracepoint_entry) \
|
|
|
+#define DO_OPAL_CALL() \
|
|
|
mfcr r11; \
|
|
|
stw r11,8(r1); \
|
|
|
li r11,0; \
|
|
@@ -83,6 +75,18 @@ END_FTR_SECTION(0, 1); \
|
|
|
mtspr SPRN_HSRR0,r12; \
|
|
|
hrfid
|
|
|
|
|
|
+#define OPAL_CALL(name, token) \
|
|
|
+ _GLOBAL_TOC(name); \
|
|
|
+ mfmsr r12; \
|
|
|
+ mflr r0; \
|
|
|
+ andi. r11,r12,MSR_IR|MSR_DR; \
|
|
|
+ std r0,PPC_LR_STKOFF(r1); \
|
|
|
+ li r0,token; \
|
|
|
+ beq opal_real_call; \
|
|
|
+ OPAL_BRANCH(opal_tracepoint_entry) \
|
|
|
+ DO_OPAL_CALL()
|
|
|
+
|
|
|
+
|
|
|
opal_return:
|
|
|
/*
|
|
|
* Fixup endian on OPAL return... we should be able to simplify
|
|
@@ -148,26 +152,13 @@ opal_tracepoint_entry:
|
|
|
ld r8,STK_REG(R29)(r1)
|
|
|
ld r9,STK_REG(R30)(r1)
|
|
|
ld r10,STK_REG(R31)(r1)
|
|
|
+
|
|
|
+ /* setup LR so we return via tracepoint_return */
|
|
|
LOAD_REG_ADDR(r11,opal_tracepoint_return)
|
|
|
- mfcr r12
|
|
|
std r11,16(r1)
|
|
|
- stw r12,8(r1)
|
|
|
- li r11,0
|
|
|
+
|
|
|
mfmsr r12
|
|
|
- ori r11,r11,MSR_EE
|
|
|
- std r12,PACASAVEDMSR(r13)
|
|
|
- andc r12,r12,r11
|
|
|
- mtmsrd r12,1
|
|
|
- LOAD_REG_ADDR(r11,opal_return)
|
|
|
- mtlr r11
|
|
|
- li r11,MSR_DR|MSR_IR|MSR_LE
|
|
|
- andc r12,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)
|