|
@@ -284,35 +284,39 @@ label##_hv: \
|
|
|
rlwimi r11,r12,0,MSR_EE; \
|
|
|
mtmsrd r11,1
|
|
|
|
|
|
-#define STD_EXCEPTION_COMMON(trap, label, hdlr) \
|
|
|
- .align 7; \
|
|
|
- .globl label##_common; \
|
|
|
-label##_common: \
|
|
|
- EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
|
|
- DISABLE_INTS; \
|
|
|
- bl .save_nvgprs; \
|
|
|
- addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
|
- bl hdlr; \
|
|
|
- b .ret_from_except
|
|
|
+#define ADD_NVGPRS \
|
|
|
+ bl .save_nvgprs
|
|
|
+
|
|
|
+#define RUNLATCH_ON \
|
|
|
+BEGIN_FTR_SECTION \
|
|
|
+ clrrdi r3,r1,THREAD_SHIFT; \
|
|
|
+ ld r4,TI_LOCAL_FLAGS(r3); \
|
|
|
+ andi. r0,r4,_TLF_RUNLATCH; \
|
|
|
+ beql ppc64_runlatch_on_trampoline; \
|
|
|
+END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
|
|
|
+
|
|
|
+#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \
|
|
|
+ .align 7; \
|
|
|
+ .globl label##_common; \
|
|
|
+label##_common: \
|
|
|
+ EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
|
|
+ additions; \
|
|
|
+ addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
|
+ bl hdlr; \
|
|
|
+ b ret
|
|
|
+
|
|
|
+#define STD_EXCEPTION_COMMON(trap, label, hdlr) \
|
|
|
+ EXCEPTION_COMMON(trap, label, hdlr, ret_from_except, \
|
|
|
+ ADD_NVGPRS;DISABLE_INTS)
|
|
|
|
|
|
/*
|
|
|
* Like STD_EXCEPTION_COMMON, but for exceptions that can occur
|
|
|
* in the idle task and therefore need the special idle handling
|
|
|
* (finish nap and runlatch)
|
|
|
*/
|
|
|
-#define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \
|
|
|
- .align 7; \
|
|
|
- .globl label##_common; \
|
|
|
-label##_common: \
|
|
|
- EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
|
|
- FINISH_NAP; \
|
|
|
- DISABLE_INTS; \
|
|
|
-BEGIN_FTR_SECTION \
|
|
|
- bl .ppc64_runlatch_on; \
|
|
|
-END_FTR_SECTION_IFSET(CPU_FTR_CTRL) \
|
|
|
- addi r3,r1,STACK_FRAME_OVERHEAD; \
|
|
|
- bl hdlr; \
|
|
|
- b .ret_from_except_lite
|
|
|
+#define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \
|
|
|
+ EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \
|
|
|
+ FINISH_NAP;RUNLATCH_ON;DISABLE_INTS)
|
|
|
|
|
|
/*
|
|
|
* When the idle code in power4_idle puts the CPU into NAP mode,
|