vMCE: Add AMD support
PATCH 1/1 vMCE: Add AMD support
Add vMCE support to AMD.
Add vmce namespace to Intel specific vMCE MSR functions. Move vMCE prototypes from mce.h to vmce.h
Signature · 6 lines
---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85689 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
# User Christoph Egger
# Date 1347954757 -7200
Add vMCE support to AMD.
Add vmce namespace to Intel specific vMCE MSR functions. Move vMCE prototypes from mce.h to vmce.h
xen/arch/x86/cpu/mcheck/amd_f10.c +37 -0
@@ -104,3 +104,40 @@ enum mcheck_type amd_f10_mcheck_init(strreturn mcheck_amd_famXX; } + +/* amd specific MCA MSR */ +int vmce_amd_wrmsr (struct vcpu *v,uint32_t msr,uint64_t val) +{ +int ret =0 ; + +switch (msr) { +case MSR_F10_MC4_MISC1 : +case MSR_F10_MC4_MISC2 : +case MSR_F10_MC4_MISC3 : +break ; +default : +mce_printk (MCE_QUIET ,"Guest writes unhandled MSR 0x%x\n" , msr); + ret =1 ; +break ; + } + +return ret; +} + +int vmce_amd_rdmsr (const struct vcpu *v,uint32_t msr,uint64_t *val) +{ +int ret =0 ; + +switch (msr) { +case MSR_F10_MC4_MISC1 : +case MSR_F10_MC4_MISC2 : +case MSR_F10_MC4_MISC3 : +break ; +default : +mce_printk (MCE_QUIET ,"Guest reads unhandled MSR 0x%x\n" , msr); + ret =1 ; +break ; + } + +return ret; +}
xen/arch/x86/cpu/mcheck/amd_nonfatal.c +1 -0
@@ -64,6 +64,7 @@#include <asm/msr.h> #include "mce.h" +#include "vmce.h" static struct timer mce_timer;
xen/arch/x86/cpu/mcheck/mce.c +1 -0
@@ -25,6 +25,7 @@#include "mce.h" #include "barrier.h" #include "util.h" +#include "vmce.h" bool_t __read_mostly mce_disabled;invbool_param ("mce" , mce_disabled);
xen/arch/x86/cpu/mcheck/mce.h +1 -16
@@ -49,15 +49,9 @@ void intel_mcheck_timer(struct cpuinfo_xvoid mce_intel_feature_init (struct cpuinfo_x86 *c);void amd_nonfatal_mcheck_init (struct cpuinfo_x86 *c); -int is_vmce_ready (struct mcinfo_bank *bank,struct domain *d); -int unmmap_broken_page (struct domain *d,mfn_t mfn,unsigned long gfn); - -u64 mce_cap_init (void ); +uint64_t mce_cap_init (void );extern unsigned int firstbank; -int intel_mce_rdmsr (const struct vcpu *,uint32_t msr,uint64_t *val); -int intel_mce_wrmsr (struct vcpu *,uint32_t msr,uint64_t val); -struct mcinfo_extended *intel_get_extended_msrs (struct mcinfo_global *mig,struct mc_info *mi);
@@ -69,9 +63,6 @@ void mc_panic(char *s);void x86_mc_get_cpu_info (unsigned ,uint32_t *,uint16_t *,uint16_t *,uint32_t *,uint32_t *,uint32_t *,uint32_t *); -#define dom0_vmce_enabled () (dom0 && dom0->max_vcpus && dom0->vcpu[0] \ - && guest_enabled_event(dom0->vcpu[0], VIRQ_MCA)) -/* Register a handler for machine check exceptions. */ typedef void (*x86_mce_vector_t )(struct cpu_user_regs *,long );extern void x86_mce_vector_register (x86_mce_vector_t );
@@ -166,12 +157,6 @@ void *x86_mcinfo_add(struct mc_info *mi,void *x86_mcinfo_reserve (struct mc_info *mi,int size);void x86_mcinfo_dump (struct mc_info *mi); -int fill_vmsr_data (struct mcinfo_bank *mc_bank,struct domain *d, -uint64_t gstatus); -int inject_vmce (struct domain *d); -int vmce_domain_inject (struct mcinfo_bank *bank,struct domain *d, -struct mcinfo_global *global); -static inline int mce_vendor_bank_msr (const struct vcpu *v,uint32_t msr) {switch (boot_cpu_data.x86_vendor) {
xen/arch/x86/cpu/mcheck/mce_intel.c +3 -2
@@ -18,6 +18,7 @@#include "x86_mca.h" #include "barrier.h" #include "util.h" +#include "vmce.h" DEFINE_PER_CPU(struct mca_banks *, mce_banks_owned); DEFINE_PER_CPU(struct mca_banks *, no_cmci_banks);
@@ -980,7 +981,7 @@ enum mcheck_type intel_mcheck_init(struc }/* intel specific MCA MSR */ -int intel_mce_wrmsr (struct vcpu *v,uint32_t msr,uint64_t val) +int vmce_intel_wrmsr (struct vcpu *v,uint32_t msr,uint64_t val) {int ret =0 ;
@@ -995,7 +996,7 @@ int intel_mce_wrmsr(struct vcpu *v, uintreturn ret; } -int intel_mce_rdmsr (const struct vcpu *v,uint32_t msr,uint64_t *val) +int vmce_intel_rdmsr (const struct vcpu *v,uint32_t msr,uint64_t *val) {int ret =0 ;
xen/arch/x86/cpu/mcheck/non-fatal.c +1 -0
@@ -21,6 +21,7 @@#include <asm/msr.h> #include "mce.h" +#include "vmce.h" DEFINE_PER_CPU(struct mca_banks *, poll_bankmask);static struct timer mce_timer;
xen/arch/x86/cpu/mcheck/vmce.c +13 -5
@@ -16,8 +16,10 @@#include <asm/system.h> #include <asm/msr.h> #include <asm/p2m.h> +#include "mce.h" #include "x86_mca.h" +#include "vmce.h" /* * Emulate 2 banks for guest
@@ -27,7 +29,7 @@* Bank1: used to transfer error info to guest */ #define GUEST_BANK_NUM 2 -#define GUEST_MCG_CAP (MCG_TES_P | MCG_SER_P | GUEST_BANK_NUM) +#define GUEST_MCG_CAP (GUEST_BANK_NUM)#define dom_vmce (x) ((x)->arch.vmca_msrs)
@@ -138,7 +140,10 @@ static int bank_mce_rdmsr(const struct vswitch ( boot_cpu_data.x86_vendor ) {case X86_VENDOR_INTEL : - ret =intel_mce_rdmsr (v, msr, val); + ret =vmce_intel_rdmsr (v, msr, val); +break ; +case X86_VENDOR_AMD : + ret =vmce_amd_rdmsr (v, msr, val);break ;default : ret =0 ;
@@ -193,7 +198,7 @@ int vmce_rdmsr(uint32_t msr, uint64_t *vreturn ret; } -static int bank_mce_wrmsr (struct vcpu *v,u32 msr,u64 val) +static int bank_mce_wrmsr (struct vcpu *v,uint32_t msr,uint64_t val) {int ret =1 ;unsigned int bank = (msr -MSR_IA32_MC0_CTL ) /4 ;
@@ -266,7 +271,10 @@ static int bank_mce_wrmsr(struct vcpu *vswitch ( boot_cpu_data.x86_vendor ) {case X86_VENDOR_INTEL : - ret =intel_mce_wrmsr (v, msr, val); + ret =vmce_intel_wrmsr (v, msr, val); +break ; +case X86_VENDOR_AMD : + ret =vmce_amd_wrmsr (v, msr, val);break ;default : ret =0 ;
@@ -283,7 +291,7 @@ static int bank_mce_wrmsr(struct vcpu *v* = 0: Not handled, should be handled by other components * > 0: Success */ -int vmce_wrmsr (u32 msr,u64 val) +int vmce_wrmsr (uint32_t msr,uint64_t val) {struct vcpu *cur = current;struct bank_entry *entry =NULL ;
xen/arch/x86/cpu/mcheck/vmce.h new file +25 -0
@@ -0,0 +1,25 @@ +#ifndef _MCHECK_VMCE_H +#define _MCHECK_VMCE_H + +#include "x86_mca.h" + +int vmce_init (struct cpuinfo_x86 *c); + +#define dom0_vmce_enabled () (dom0 && dom0->max_vcpus && dom0->vcpu[0] \ + && guest_enabled_event(dom0->vcpu[0], VIRQ_MCA)) + +int is_vmce_ready (struct mcinfo_bank *bank,struct domain *d); +int unmmap_broken_page (struct domain *d,mfn_t mfn,unsigned long gfn); + +int vmce_intel_rdmsr (const struct vcpu *,uint32_t msr,uint64_t *val); +int vmce_intel_wrmsr (struct vcpu *,uint32_t msr,uint64_t val); +int vmce_amd_rdmsr (const struct vcpu *,uint32_t msr,uint64_t *val); +int vmce_amd_wrmsr (struct vcpu *,uint32_t msr,uint64_t val); + +int fill_vmsr_data (struct mcinfo_bank *mc_bank,struct domain *d, +uint64_t gstatus); +int inject_vmce (struct domain *d); +int vmce_domain_inject (struct mcinfo_bank *bank,struct domain *d, +struct mcinfo_global *global); + +#endif
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Quoted 6 lines
Quoted 1 line
Quoted 1 line · Christoph Egger
Add vMCE support to AMD.
Add vmce namespace to Intel specific vMCE MSR functions. Move vMCE prototypes frommce.htovmce.hSigned-off-by Christoph Egger <[email protected]>
I put the patch almost as-is (i.e. modified only where necessary to apply on top of Jinsong's), but ...
Quoted 25 lines
xen/arch/x86/cpu/mcheck/amd_f10.c +25
-0+int vmce_amd_wrmsr (struct vcpu *v,uint32_t msr,uint64_t val) +{ +int ret =0 ; + +switch (msr) { +case MSR_F10_MC4_MISC1 : +case MSR_F10_MC4_MISC2 : +case MSR_F10_MC4_MISC3 : +break ; +default : +mce_printk (MCE_QUIET ,"Guest writes unhandled MSR 0x%x\n" , msr); + ret =1 ; +break ; + } + +return ret; +} + +int vmce_amd_rdmsr (const struct vcpu *v,uint32_t msr,uint64_t *val) +{ +int ret =0 ; + +switch (msr) { +case MSR_F10_MC4_MISC1 : +case MSR_F10_MC4_MISC2 :
xen/arch/x86/cpu/mcheck/amd_f10.c enum mcheck_type amd_f10_mcheck_init(str · line 143
Quoted 10 lines
xen/arch/x86/cpu/mcheck/amd_f10.c +10
-0+case MSR_F10_MC4_MISC3 : +break ; +default : +mce_printk (MCE_QUIET ,"Guest reads unhandled MSR 0x%x\n" , msr); + ret =1 ; +break ; + } + +return ret; +}
... the return values here were inverted afaict (fixed), and the functions in this shape are just pointless (i.e. I assume you will make them actually do something in a subsequent patch) - I took the liberty to remove the bogus printk()-s as minimal action.
Jan