Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Mahesh Salgaonkar and committed by
Benjamin Herrenschmidt
d410ae21 422b9b96

+13
+8
arch/powerpc/include/asm/exception-64s.h
··· 147 147 END_FTR_SECTION_NESTED(ftr,ftr,943) 148 148 149 149 /* 150 + * Set an SPR from a register if the CPU has the given feature 151 + */ 152 + #define OPT_SET_SPR(ra, spr, ftr) \ 153 + BEGIN_FTR_SECTION_NESTED(943) \ 154 + mtspr spr,ra; \ 155 + END_FTR_SECTION_NESTED(ftr,ftr,943) 156 + 157 + /* 150 158 * Save a register to the PACA if the CPU has the given feature 151 159 */ 152 160 #define OPT_SAVE_REG_TO_PACA(offset, ra, ftr) \
+5
arch/powerpc/kernel/exceptions-64s.S
··· 164 164 */ 165 165 mfspr r13,SPRN_SRR1 166 166 rlwinm. r13,r13,47-31,30,31 167 + OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) 167 168 beq 9f 168 169 170 + mfspr r13,SPRN_SRR1 171 + rlwinm. r13,r13,47-31,30,31 169 172 /* waking up from powersave (nap) state */ 170 173 cmpwi cr1,r13,2 171 174 /* Total loss of HV state is fatal. let's just stay stuck here */ 175 + OPT_GET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) 172 176 bgt cr1,. 173 177 9: 178 + OPT_SET_SPR(r13, SPRN_CFAR, CPU_FTR_CFAR) 174 179 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) 175 180 #endif /* CONFIG_PPC_P7_NAP */ 176 181 EXCEPTION_PROLOG_0(PACA_EXMC)