[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Limit MCG Cap
Given that we don't properly virtualise/emulate machine check (we only set the feature bit because some versions of Windows demand it) can we get away with returning zero for reads of MCG_CAP? -- Keir On 27/8/07 20:11, "Ben Guthro" <bguthro@xxxxxxxxxxxxxxx> wrote: > Intercept guest reads of MSR_IA32_MCG_CAP and limit the number of memory banks > reported to one. > This prevents us from trying to read status of non-existent banks when > migrated to a machine > with fewer banks. > > Signed-off-by: Ben Guthro > Signed-off-by: David Lively <dlively@xxxxxxxxxxxxxxx> > > diff -r 4eea7c9b3bf2 xen/arch/x86/hvm/svm/svm.c > --- a/xen/arch/x86/hvm/svm/svm.c Thu Aug 02 08:59:43 2007 -0400 > +++ b/xen/arch/x86/hvm/svm/svm.c Thu Aug 02 08:59:43 2007 -0400 > @@ -2162,7 +2162,19 @@ static void svm_do_msr_access( > /* No point in letting the guest see real MCEs */ > msr_content = 0; > break; > - > + case MSR_IA32_MCG_CAP: > + if ( rdmsr_safe(ecx, regs->eax, regs->edx) == 0 ) { > + /* > + * Report at most one memory bank so migration to a machine > with > + * fewer banks doesn't cause guest GPFs when the guest tries > to read the > + * (now, after migration) non-existent banks' MSRs. > + */ > + regs->eax = (regs->eax & ~0xFF) | !!(regs->eax & 0xFF); > + goto done; > + } > + gdprintk(XENLOG_ERR, "%s: rdmsr_safe(MCG_CAP) failed!\n", > __FUNCTION__); > + svm_inject_exception(v, TRAP_gp_fault, 1, 0); > + return; > default: > if ( rdmsr_hypervisor_regs(ecx, &eax, &edx) || > rdmsr_safe(ecx, eax, edx) == 0 ) > diff -r 4eea7c9b3bf2 xen/arch/x86/hvm/vmx/vmx.c > --- a/xen/arch/x86/hvm/vmx/vmx.c Thu Aug 02 08:59:43 2007 -0400 > +++ b/xen/arch/x86/hvm/vmx/vmx.c Thu Aug 02 09:14:06 2007 -0400 > @@ -2754,6 +2754,19 @@ static int vmx_do_msr_read(struct cpu_us > /* No point in letting the guest see real MCEs */ > msr_content = 0; > break; > + case MSR_IA32_MCG_CAP: > + if ( rdmsr_safe(ecx, regs->eax, regs->edx) == 0 ) { > + /* > + * Report only a single memory bank so migration to a machine > with > + * fewer banks doesn't cause guest GPFs when the guest tries to > read the > + * (now, after migration) non-existent banks' MSRs. > + */ > + regs->eax = (regs->eax & ~0xFF) | !!(regs->eax & 0xFF); > + goto done; > + } > + gdprintk(XENLOG_ERR, "%s: rdmsr_safe(MCG_CAP) failed!\n", > __FUNCTION__); > + vmx_inject_hw_exception(v, TRAP_gp_fault, 0); > + return 0; > default: > switch ( long_mode_do_msr_read(regs) ) > { > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |