| From fa94d0c6e0f3431523f5701084d799c77c7d4a4f Mon Sep 17 00:00:00 2001 |
| From: Tony Luck <tony.luck@intel.com> |
| Date: Tue, 6 Mar 2018 15:21:41 +0100 |
| Subject: x86/MCE: Save microcode revision in machine check records |
| |
| From: Tony Luck <tony.luck@intel.com> |
| |
| commit fa94d0c6e0f3431523f5701084d799c77c7d4a4f upstream. |
| |
| Updating microcode used to be relatively rare. Now that it has become |
| more common we should save the microcode version in a machine check |
| record to make sure that those people looking at the error have this |
| important information bundled with the rest of the logged information. |
| |
| [ Borislav: Simplify a bit. ] |
| |
| Signed-off-by: Tony Luck <tony.luck@intel.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Yazen Ghannam <yazen.ghannam@amd.com> |
| Cc: linux-edac <linux-edac@vger.kernel.org> |
| Cc: stable@vger.kernel.org |
| Link: http://lkml.kernel.org/r/20180301233449.24311-1-tony.luck@intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/uapi/asm/mce.h | 1 + |
| arch/x86/kernel/cpu/mcheck/mce.c | 4 +++- |
| 2 files changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/include/uapi/asm/mce.h |
| +++ b/arch/x86/include/uapi/asm/mce.h |
| @@ -30,6 +30,7 @@ struct mce { |
| __u64 synd; /* MCA_SYND MSR: only valid on SMCA systems */ |
| __u64 ipid; /* MCA_IPID MSR: only valid on SMCA systems */ |
| __u64 ppin; /* Protected Processor Inventory Number */ |
| + __u32 microcode;/* Microcode revision */ |
| }; |
| |
| #define MCE_GET_RECORD_LEN _IOR('M', 1, int) |
| --- a/arch/x86/kernel/cpu/mcheck/mce.c |
| +++ b/arch/x86/kernel/cpu/mcheck/mce.c |
| @@ -131,6 +131,8 @@ void mce_setup(struct mce *m) |
| |
| if (this_cpu_has(X86_FEATURE_INTEL_PPIN)) |
| rdmsrl(MSR_PPIN, m->ppin); |
| + |
| + m->microcode = boot_cpu_data.microcode; |
| } |
| |
| DEFINE_PER_CPU(struct mce, injectm); |
| @@ -263,7 +265,7 @@ static void __print_mce(struct mce *m) |
| */ |
| pr_emerg(HW_ERR "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x microcode %x\n", |
| m->cpuvendor, m->cpuid, m->time, m->socketid, m->apicid, |
| - cpu_data(m->extcpu).microcode); |
| + m->microcode); |
| } |
| |
| static void print_mce(struct mce *m) |