Эх сурвалжийг харах

powerpc/book3s: Fix CFAR clobbering issue in machine check handler.

While checking powersaving mode in machine check handler at 0x200, we
clobber CFAR register. Fix it by saving and restoring it during beq/bgt.

Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Mahesh Salgaonkar 11 жил өмнө
parent
commit
d410ae2126

+ 8 - 0
arch/powerpc/include/asm/exception-64s.h

@@ -146,6 +146,14 @@ BEGIN_FTR_SECTION_NESTED(943)						\
 	mfspr	ra,spr;							\
 	mfspr	ra,spr;							\
 END_FTR_SECTION_NESTED(ftr,ftr,943)
 END_FTR_SECTION_NESTED(ftr,ftr,943)
 
 
+/*
+ * Set an SPR from a register if the CPU has the given feature
+ */
+#define OPT_SET_SPR(ra, spr, ftr)					\
+BEGIN_FTR_SECTION_NESTED(943)						\
+	mtspr	spr,ra;							\
+END_FTR_SECTION_NESTED(ftr,ftr,943)
+
 /*
 /*
  * Save a register to the PACA if the CPU has the given feature
  * Save a register to the PACA if the CPU has the given feature
  */
  */

+ 5 - 0
arch/powerpc/kernel/exceptions-64s.S

@@ -164,13 +164,18 @@ BEGIN_FTR_SECTION
 	 */
 	 */
 	mfspr	r13,SPRN_SRR1
 	mfspr	r13,SPRN_SRR1
 	rlwinm.	r13,r13,47-31,30,31
 	rlwinm.	r13,r13,47-31,30,31
+	OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR)
 	beq	9f
 	beq	9f
 
 
+	mfspr	r13,SPRN_SRR1
+	rlwinm.	r13,r13,47-31,30,31
 	/* waking up from powersave (nap) state */
 	/* waking up from powersave (nap) state */
 	cmpwi	cr1,r13,2
 	cmpwi	cr1,r13,2
 	/* Total loss of HV state is fatal. let's just stay stuck here */
 	/* Total loss of HV state is fatal. let's just stay stuck here */
+	OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR)
 	bgt	cr1,.
 	bgt	cr1,.
 9:
 9:
+	OPT_SET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR)
 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
 #endif /* CONFIG_PPC_P7_NAP */
 #endif /* CONFIG_PPC_P7_NAP */
 	EXCEPTION_PROLOG_0(PACA_EXMC)
 	EXCEPTION_PROLOG_0(PACA_EXMC)