Skip to content

Commit e8a308e

Browse files
stellarhoppersuryasaimadhu
authored andcommitted
acpi/nfit, x86/mce: Validate a MCE's address before using it
The NFIT machine check handler uses the physical address from the mce structure, and compares it against information in the ACPI NFIT table to determine whether that location lies on an NVDIMM. The mce->addr field however may not always be valid, and this is indicated by the MCI_STATUS_ADDRV bit in the status field. Export mce_usable_address() which already performs validation for the address, and use it in the NFIT handler. Fixes: 6839a6d ("nfit: do an ARS scrub on hitting a latent media error") Reported-by: Robert Elliott <elliott@hpe.com> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> CC: Arnd Bergmann <arnd@arndb.de> Cc: Dan Williams <dan.j.williams@intel.com> CC: Dave Jiang <dave.jiang@intel.com> CC: elliott@hpe.com CC: "H. Peter Anvin" <hpa@zytor.com> CC: Ingo Molnar <mingo@redhat.com> CC: Len Brown <lenb@kernel.org> CC: linux-acpi@vger.kernel.org CC: linux-edac <linux-edac@vger.kernel.org> CC: linux-nvdimm@lists.01.org CC: Qiuxu Zhuo <qiuxu.zhuo@intel.com> CC: "Rafael J. Wysocki" <rjw@rjwysocki.net> CC: Ross Zwisler <zwisler@kernel.org> CC: stable <stable@vger.kernel.org> CC: Thomas Gleixner <tglx@linutronix.de> CC: Tony Luck <tony.luck@intel.com> CC: x86-ml <x86@kernel.org> CC: Yazen Ghannam <yazen.ghannam@amd.com> Link: http://lkml.kernel.org/r/20181026003729.8420-2-vishal.l.verma@intel.com
1 parent 5d96c93 commit e8a308e

File tree

3 files changed

+7
-1
lines changed

3 files changed

+7
-1
lines changed

arch/x86/include/asm/mce.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ static inline void mce_hygon_feature_init(struct cpuinfo_x86 *c) { return mce_am
222222
int mce_available(struct cpuinfo_x86 *c);
223223
bool mce_is_memory_error(struct mce *m);
224224
bool mce_is_correctable(struct mce *m);
225+
int mce_usable_address(struct mce *m);
225226

226227
DECLARE_PER_CPU(unsigned, mce_exception_count);
227228
DECLARE_PER_CPU(unsigned, mce_poll_count);

arch/x86/kernel/cpu/mcheck/mce.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ static void mce_report_event(struct pt_regs *regs)
485485
* be somewhat complicated (e.g. segment offset would require an instruction
486486
* parser). So only support physical addresses up to page granuality for now.
487487
*/
488-
static int mce_usable_address(struct mce *m)
488+
int mce_usable_address(struct mce *m)
489489
{
490490
if (!(m->status & MCI_STATUS_ADDRV))
491491
return 0;
@@ -505,6 +505,7 @@ static int mce_usable_address(struct mce *m)
505505

506506
return 1;
507507
}
508+
EXPORT_SYMBOL_GPL(mce_usable_address);
508509

509510
bool mce_is_memory_error(struct mce *m)
510511
{

drivers/acpi/nfit/mce.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ static int nfit_handle_mce(struct notifier_block *nb, unsigned long val,
2929
if (!mce_is_memory_error(mce) || mce_is_correctable(mce))
3030
return NOTIFY_DONE;
3131

32+
/* Verify the address reported in the MCE is valid. */
33+
if (!mce_usable_address(mce))
34+
return NOTIFY_DONE;
35+
3236
/*
3337
* mce->addr contains the physical addr accessed that caused the
3438
* machine check. We need to walk through the list of NFITs, and see

0 commit comments

Comments
 (0)