diff options
author | Yazen Ghannam <Yazen.Ghannam@amd.com> | 2016-09-12 03:59:39 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-13 09:23:13 -0400 |
commit | 4f29b73bae158e3635b8f289f77376b054904ef5 (patch) | |
tree | 71c43c13ac47c67104e47b4ee17aba2059f69341 /arch/x86 | |
parent | 4b711f92c9b21878794597997ecda1428acc334c (diff) |
x86/mce/AMD: Extract the error address on SMCA systems
The MCA_ADDR registers on Scalable MCA systems contain the ErrorAddr
in bits [55:0] and the least significant bit of the address in bits
[61:56]. We should extract the valid ErrorAddr bits from the MCA_ADDR
register rather than saving the raw value to struct mce.
Signed-off-by: Yazen Ghannam <Yazen.Ghannam@amd.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1473275643-1721-1-git-send-email-Yazen.Ghannam@amd.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 10 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd.c | 13 |
2 files changed, 22 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 7d905e3d58a2..a7fdf453d895 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -588,6 +588,16 @@ static void mce_read_aux(struct mce *m, int i) | |||
588 | m->addr >>= shift; | 588 | m->addr >>= shift; |
589 | m->addr <<= shift; | 589 | m->addr <<= shift; |
590 | } | 590 | } |
591 | |||
592 | /* | ||
593 | * Extract [55:<lsb>] where lsb is the least significant | ||
594 | * *valid* bit of the address bits. | ||
595 | */ | ||
596 | if (mce_flags.smca) { | ||
597 | u8 lsb = (m->addr >> 56) & 0x3f; | ||
598 | |||
599 | m->addr &= GENMASK_ULL(55, lsb); | ||
600 | } | ||
591 | } | 601 | } |
592 | 602 | ||
593 | if (mce_flags.smca) { | 603 | if (mce_flags.smca) { |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index d2f92ab5322f..9b5403462936 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
@@ -561,9 +561,20 @@ __log_error(unsigned int bank, bool deferred_err, bool threshold_err, u64 misc) | |||
561 | if (threshold_err) | 561 | if (threshold_err) |
562 | m.misc = misc; | 562 | m.misc = misc; |
563 | 563 | ||
564 | if (m.status & MCI_STATUS_ADDRV) | 564 | if (m.status & MCI_STATUS_ADDRV) { |
565 | rdmsrl(msr_addr, m.addr); | 565 | rdmsrl(msr_addr, m.addr); |
566 | 566 | ||
567 | /* | ||
568 | * Extract [55:<lsb>] where lsb is the least significant | ||
569 | * *valid* bit of the address bits. | ||
570 | */ | ||
571 | if (mce_flags.smca) { | ||
572 | u8 lsb = (m.addr >> 56) & 0x3f; | ||
573 | |||
574 | m.addr &= GENMASK_ULL(55, lsb); | ||
575 | } | ||
576 | } | ||
577 | |||
567 | if (mce_flags.smca) { | 578 | if (mce_flags.smca) { |
568 | rdmsrl(MSR_AMD64_SMCA_MCx_IPID(bank), m.ipid); | 579 | rdmsrl(MSR_AMD64_SMCA_MCx_IPID(bank), m.ipid); |
569 | 580 | ||