WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Limit MCG Cap

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] Limit MCG Cap
From: Ben Guthro <bguthro@xxxxxxxxxxxxxxx>
Date: Mon, 27 Aug 2007 15:11:24 -0400
Cc: Dave Lively <dlively@xxxxxxxxxxxxxxx>
Delivery-date: Mon, 27 Aug 2007 12:19:41 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.5 (X11/20070719)
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
<Prev in Thread] Current Thread [Next in Thread>