From: Yazen Ghannam <yazen.ghan...@amd.com> The OS is expected to write all bits in MCA_CTL. However, only implemented bits get set in the hardware.
Read back MCA_CTL so that the value in the hardware is saved and reported through sysfs. Signed-off-by: Yazen Ghannam <yazen.ghan...@amd.com> --- arch/x86/kernel/cpu/mce/core.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c index 4a066c1e8ab2..ed5374ab3ac3 100644 --- a/arch/x86/kernel/cpu/mce/core.c +++ b/arch/x86/kernel/cpu/mce/core.c @@ -1566,10 +1566,13 @@ static void __mcheck_cpu_init_clear_banks(void) for (i = 0; i < this_cpu_read(num_banks); i++) { struct mce_bank *b = &this_cpu_read(mce_banks)[i]; - if (!b->init) - continue; - wrmsrl(msr_ops.ctl(i), b->ctl); - wrmsrl(msr_ops.status(i), 0); + if (b->init) { + wrmsrl(msr_ops.ctl(i), b->ctl); + wrmsrl(msr_ops.status(i), 0); + } + + /* Save bits set in hardware. */ + rdmsrl(msr_ops.ctl(i), b->ctl); } } @@ -2313,8 +2316,10 @@ static void mce_reenable_cpu(void) for (i = 0; i < this_cpu_read(num_banks); i++) { struct mce_bank *b = &this_cpu_read(mce_banks)[i]; - if (b->init) + if (b->init) { wrmsrl(msr_ops.ctl(i), b->ctl); + rdmsrl(msr_ops.ctl(i), b->ctl); + } } } -- 2.17.1