diff options
author | Borislav Petkov <bp@suse.de> | 2017-04-18 14:39:24 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-04-19 06:04:46 -0400 |
commit | c6a9583fb41c8bd017f643d5bc90a0fe0a92fe43 (patch) | |
tree | 778468d19aabb514809cd930b6766c01002e8205 | |
parent | 7237c75b2717d59ebf2c2595d416e16a160154e1 (diff) |
x86/mce: Check MCi_STATUS[MISCV] for usable addr on Intel only
mce_usable_address() does a bunch of basic sanity checks to verify
whether the address reported with the error is usable for further
processing. However, we do check MCi_STATUS[MISCV] and that is not
needed on AMD as that bit says that there's additional information about
the logged error in the MCi_MISCj banks.
But we don't need that to know whether the address is usable - we only
need to know whether the physical address is valid - i.e., ADDRV.
On Intel the MISCV bit is needed to perform additional checks to determine
whether the reported address is a physical one, etc.
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Yazen Ghannam <yazen.ghannam@amd.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: http://lkml.kernel.org/r/20170418183924.6agjkebilwqj26or@pd.tnic
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 9d41ec8c8927..4a29f7481761 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -491,17 +491,22 @@ static void mce_report_event(struct pt_regs *regs) | |||
491 | */ | 491 | */ |
492 | static int mce_usable_address(struct mce *m) | 492 | static int mce_usable_address(struct mce *m) |
493 | { | 493 | { |
494 | if (!(m->status & MCI_STATUS_MISCV) || !(m->status & MCI_STATUS_ADDRV)) | 494 | if (!(m->status & MCI_STATUS_ADDRV)) |
495 | return 0; | 495 | return 0; |
496 | 496 | ||
497 | /* Checks after this one are Intel-specific: */ | 497 | /* Checks after this one are Intel-specific: */ |
498 | if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) | 498 | if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) |
499 | return 1; | 499 | return 1; |
500 | 500 | ||
501 | if (!(m->status & MCI_STATUS_MISCV)) | ||
502 | return 0; | ||
503 | |||
501 | if (MCI_MISC_ADDR_LSB(m->misc) > PAGE_SHIFT) | 504 | if (MCI_MISC_ADDR_LSB(m->misc) > PAGE_SHIFT) |
502 | return 0; | 505 | return 0; |
506 | |||
503 | if (MCI_MISC_ADDR_MODE(m->misc) != MCI_MISC_ADDR_PHYS) | 507 | if (MCI_MISC_ADDR_MODE(m->misc) != MCI_MISC_ADDR_PHYS) |
504 | return 0; | 508 | return 0; |
509 | |||
505 | return 1; | 510 | return 1; |
506 | } | 511 | } |
507 | 512 | ||