[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.