diff options
Diffstat (limited to 'arch/powerpc/kernel/mce_power.c')
| -rw-r--r-- | arch/powerpc/kernel/mce_power.c | 13 | 
1 files changed, 13 insertions, 0 deletions
| diff --git a/arch/powerpc/kernel/mce_power.c b/arch/powerpc/kernel/mce_power.c index b76ca198e09c..72f153c6f3fa 100644 --- a/arch/powerpc/kernel/mce_power.c +++ b/arch/powerpc/kernel/mce_power.c @@ -624,5 +624,18 @@ long __machine_check_early_realmode_p8(struct pt_regs *regs)  long __machine_check_early_realmode_p9(struct pt_regs *regs)  { +	/* +	 * On POWER9 DD2.1 and below, it's possible to get a machine check +	 * caused by a paste instruction where only DSISR bit 25 is set. This +	 * will result in the MCE handler seeing an unknown event and the kernel +	 * crashing. An MCE that occurs like this is spurious, so we don't need +	 * to do anything in terms of servicing it. If there is something that +	 * needs to be serviced, the CPU will raise the MCE again with the +	 * correct DSISR so that it can be serviced properly. So detect this +	 * case and mark it as handled. +	 */ +	if (SRR1_MC_LOADSTORE(regs->msr) && regs->dsisr == 0x02000000) +		return 1; +  	return mce_handle_error(regs, mce_p9_derror_table, mce_p9_ierror_table);  } |