From: Yazen Ghannam <[email protected]> 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 <[email protected]> --- Link: https://lkml.kernel.org/r/[email protected] v2->v3: * No change. v1->v2: * No change. 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 986de830f26e..551366c155ef 100644 --- a/arch/x86/kernel/cpu/mce/core.c +++ b/arch/x86/kernel/cpu/mce/core.c @@ -1567,10 +1567,13 @@ static void __mcheck_cpu_init_clear_banks(void) for (i = 0; i < this_cpu_read(mce_num_banks); i++) { struct mce_bank *b = &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); } } @@ -2325,8 +2328,10 @@ static void mce_reenable_cpu(void) for (i = 0; i < this_cpu_read(mce_num_banks); i++) { struct mce_bank *b = &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

