Skip to contentSkip to conversation

x86/mce: Add Zhaoxin LMCE support

PATCH Tony W Wang-oc 2 participants 2 messages Sep 17, 2019 EDAC-core

lore
Share & tools
lore
#0 lore raw
Quoted 18 lines · Tony
Quoted 7 lines · Tony W Wang-oc

Zhaoxin newer CPUs support LMCE that compatible with Intel's "Machine-Check Architecture", so add support for Zhaoxin LMCE in mce/core.c.

---
 arch/x86/kernel/cpu/mce/core.c | 35

+++++++++++++++++++++++++++++++++--

Quoted 9 lines
 1 file changed, 33 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/mce/core.c +0 -0
index 65c5a1f..acdd76b 100644
@@ -1132,6 +1132,27 @@ static bool __mc_check_crashing_cpu(int cpu)
 		u64 mcgstatus;
 
Quoted 11 lines

arch/x86/kernel/cpu/mce/core.c static bool __mc_check_crashing_cpu(int cpu) · line 1140

Quoted 7 lines
arch/x86/kernel/cpu/mce/core.c +6 -0
 		mcgstatus = mce_rdmsrl(MSR_IA32_MCG_STATUS);
+
+		if (boot_cpu_data.x86_vendor == X86_VENDOR_ZHAOXIN) {
+			if (mcgstatus & MCG_STATUS_LMCES)
+				return false;
+
+			if (!(mcgstatus & MCG_STATUS_LMCES)) {

Don't really need this test ... you already did "return false" if the LMCES bit was set ... so this test is redundant (and you can avoid indenting the next dozen lines.

Got it, Thank you.

But have a question about below codes:

	if (mcgstatus & MCG_STATUS_RIPV) {
		mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
		return true;
	}

These seems require all #MC exception errors set MCG_STATUS_RIPV = 1 in order to skip synchronize which "return true;" actually does for this.

As Intel SDM show, "Recoverable-not-continuable SRAR Type" errors may set MCG_STATUS_RIPV = 0, PCC = 0. When these #MC errors broadcast to offline CPU, may cause kernel panic with synchronize timeout (offline CPU can't skip synchronize in this case).

Could "return true;" outside the if-case?

	if (mcgstatus & MCG_STATUS_RIPV) {
		mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
	} 
	return true; 

Sincerely
TonyWWang-oc

maintainer
#1 lore raw
Quoted 13 lines · Tony W Wang-oc

But have a question about below codes:

	if (mcgstatus & MCG_STATUS_RIPV) {
		mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
		return true;
	}

These seems require all #MC exception errors set MCG_STATUS_RIPV = 1 in order to skip synchronize which "return true;" actually does for this.

As Intel SDM show, "Recoverable-not-continuable SRAR Type" errors may set MCG_STATUS_RIPV = 0, PCC = 0. When these #MC errors broadcast to offline CPU, may cause kernel panic with synchronize timeout (offline CPU can't skip synchronize in this case).

Quoted 5 lines

Could "return true;" outside the if-case?

	if (mcgstatus & MCG_STATUS_RIPV) {
		mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
	} 
	return true; 

If RIPV bit is not set in mcgstatus, then where will the CPU return to if you simply return from the #MC handler? RIPV=1 means that the CPU pushed a valid return instruction pointer onto the stack.

E.g. in the not-continuable case you mention above? The CPU will likely do something undefined if you try to continue a not-continuable instruction.

-Tony