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/kernel/cpu | |
| 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/kernel/cpu')
| -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 | ||
