[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/2] Xen/MCA: bugfix for mca bank clear
Xen/MCA: bugfix for mca bank clear mcabank_clear() is common code for real h/w mca and s/w simulated mca. Under s/w simulated case, getting status via mca_rdmsr may trigger #GP if MCx_ADDR/MISC not supported by real h/w. This patch fix the bug. It always invalidates intpose for s/w simulated mca case, and do check real h/w status ADDRV/MISCV to avoid #GP when clear MCx_ADDR/MISC for h/w mca case. Reported-by: Ren Yongjie <yongjie.ren@xxxxxxxxx> Singed-off-by: Liu Jinsong <jinsong.liu@xxxxxxxxx> diff -r e84a79d11d7a xen/arch/x86/cpu/mcheck/mce.c --- a/xen/arch/x86/cpu/mcheck/mce.c Thu Nov 01 01:41:03 2012 +0800 +++ b/xen/arch/x86/cpu/mcheck/mce.c Thu Feb 28 08:05:15 2013 +0800 @@ -138,17 +138,28 @@ xfree(banks); } +/* + * Common code for real h/w mca and s/w simulated mca. + * Always invalidate intpose for s/w simulated mca case, and do check + * real h/w status ADDRV/MISCV to avoid #GP when clear MCx_ADDR/MISC + * for h/w mca case. + */ static void mcabank_clear(int banknum) { - uint64_t status; + uint64_t hw_status; - status = mca_rdmsr(MSR_IA32_MCx_STATUS(banknum)); + /* For s/w simulated mca case */ + intpose_inval(smp_processor_id(), MSR_IA32_MCx_ADDR(banknum)); + intpose_inval(smp_processor_id(), MSR_IA32_MCx_MISC(banknum)); - if (status & MCi_STATUS_ADDRV) - mca_wrmsr(MSR_IA32_MCx_ADDR(banknum), 0x0ULL); - if (status & MCi_STATUS_MISCV) - mca_wrmsr(MSR_IA32_MCx_MISC(banknum), 0x0ULL); + /* For real h/w mca case */ + rdmsrl(MSR_IA32_MCx_STATUS(banknum), hw_status); + if (hw_status & MCi_STATUS_ADDRV) + wrmsrl(MSR_IA32_MCx_ADDR(banknum), 0x0ULL); + if (hw_status & MCi_STATUS_MISCV) + wrmsrl(MSR_IA32_MCx_MISC(banknum), 0x0ULL); + /* For both cases */ mca_wrmsr(MSR_IA32_MCx_STATUS(banknum), 0x0ULL); } Attachment:
mca-bank-clear-bugfix.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |