|
@@ -191,6 +191,37 @@ exception_marker:
|
|
|
ori reg,reg,(label)@l; /* virt addr of handler ... */
|
|
|
#endif
|
|
|
|
|
|
+/*
|
|
|
+ * Equal to EXCEPTION_PROLOG_PSERIES, except that it forces 64bit mode.
|
|
|
+ * The firmware calls the registered system_reset_fwnmi and
|
|
|
+ * machine_check_fwnmi handlers in 32bit mode if the cpu happens to run
|
|
|
+ * a 32bit application at the time of the event.
|
|
|
+ * This firmware bug is present on POWER4 and JS20.
|
|
|
+ */
|
|
|
+#define EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(area, label) \
|
|
|
+ mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
|
|
|
+ std r9,area+EX_R9(r13); /* save r9 - r12 */ \
|
|
|
+ std r10,area+EX_R10(r13); \
|
|
|
+ std r11,area+EX_R11(r13); \
|
|
|
+ std r12,area+EX_R12(r13); \
|
|
|
+ mfspr r9,SPRN_SPRG1; \
|
|
|
+ std r9,area+EX_R13(r13); \
|
|
|
+ mfcr r9; \
|
|
|
+ clrrdi r12,r13,32; /* get high part of &label */ \
|
|
|
+ mfmsr r10; \
|
|
|
+ /* force 64bit mode */ \
|
|
|
+ li r11,5; /* MSR_SF_LG|MSR_ISF_LG */ \
|
|
|
+ rldimi r10,r11,61,0; /* insert into top 3 bits */ \
|
|
|
+ /* done 64bit mode */ \
|
|
|
+ mfspr r11,SPRN_SRR0; /* save SRR0 */ \
|
|
|
+ LOAD_HANDLER(r12,label) \
|
|
|
+ ori r10,r10,MSR_IR|MSR_DR|MSR_RI; \
|
|
|
+ mtspr SPRN_SRR0,r12; \
|
|
|
+ mfspr r12,SPRN_SRR1; /* and SRR1 */ \
|
|
|
+ mtspr SPRN_SRR1,r10; \
|
|
|
+ rfid; \
|
|
|
+ b . /* prevent speculative execution */
|
|
|
+
|
|
|
#define EXCEPTION_PROLOG_PSERIES(area, label) \
|
|
|
mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \
|
|
|
std r9,area+EX_R9(r13); /* save r9 - r12 */ \
|
|
@@ -604,14 +635,14 @@ slb_miss_user_pseries:
|
|
|
system_reset_fwnmi:
|
|
|
HMT_MEDIUM
|
|
|
mtspr SPRN_SPRG1,r13 /* save r13 */
|
|
|
- EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)
|
|
|
+ EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXGEN, system_reset_common)
|
|
|
|
|
|
.globl machine_check_fwnmi
|
|
|
.align 7
|
|
|
machine_check_fwnmi:
|
|
|
HMT_MEDIUM
|
|
|
mtspr SPRN_SPRG1,r13 /* save r13 */
|
|
|
- EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
|
|
|
+ EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXMC, machine_check_common)
|
|
|
|
|
|
#ifdef CONFIG_PPC_ISERIES
|
|
|
/*** ISeries-LPAR interrupt handlers ***/
|