Skip to contentSkip to conversation

Nested Virtualization: CRn & paged real mode

PATCH In review Christoph Egger 2 participants 3 messages Aug 5, 2010 – Aug 11, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 6/14 Nested Virtualization: CRn & paged real mode

Signature · 6 lines
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

# HG changeset patch
# User cegger
# Date 1280925502 -7200
Allow paged real mode during vmrun emulation. Emulate cr0 and cr4 when guest does not intercept them.

xen/arch/x86/hvm/hvm.c +4 -2
diff -r 917f9eb07fc3 -r b1a356e5658d xen/arch/x86/hvm/hvm.c
@@ -54,6 +54,7 @@
 #include <asm/hvm/support.h>
 #include <asm/hvm/cacheattr.h>
 #include <asm/hvm/trace.h>
+#include <asm/hvm/nestedhvm.h>
 #include <asm/mtrr.h>
 #include <asm/apic.h>
 #include <public/sched.h>
@@ -1105,7 +1106,8 @@ int hvm_set_cr0(unsigned long value)
     /* ET is reserved and should be always be 1. */
     value |= X86_CR0_ET;
 
-    if ( (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
+    if ( !nestedhvm_vmentry_emulate(v) &&
+         (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
         goto gpf;
 
     if ( (value & X86_CR0_PG) && !(old_value & X86_CR0_PG) )
@@ -1159,7 +1161,7 @@ int hvm_set_cr0(unsigned long value)
         }
     }
 
-    if ( has_arch_mmios(v->domain) )
+    if ( !nestedhvm_vmentry_emulate(v) && has_arch_mmios(v->domain) )
     {
         if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) )
         {

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw
Quoted 2 lines

Allow paged real mode during vmrun emulation. Emulate cr0 and cr4 when guest does not intercept them.

I understand the paged-real-mode case, but why do you also allow CR0.CD and CR0.NW for nested VMs?

Cheers,

Tim.

Quoted 22 lines

diff -r 917f9eb07fc3 -r b1a356e5658d xen/arch/x86/hvm/hvm.c

xen/arch/x86/hvm/hvm.c +3 -1
@@ -54,6 +54,7 @@
 #include <asm/hvm/support.h>
 #include <asm/hvm/cacheattr.h>
 #include <asm/hvm/trace.h>
+#include <asm/hvm/nestedhvm.h>
 #include <asm/mtrr.h>
 #include <asm/apic.h>
 #include <public/sched.h>
@@ -1105,7 +1106,8 @@ int hvm_set_cr0(unsigned long value)
     /* ET is reserved and should be always be 1. */
     value |= X86_CR0_ET;
 
-    if ( (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
+    if ( !nestedhvm_vmentry_emulate(v) &&
+         (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
         goto gpf;
 
     if ( (value & X86_CR0_PG) && !(old_value & X86_CR0_PG) )

xen/arch/x86/hvm/hvm.c int hvm_set_cr0(unsigned long value) · line 1167

Quoted 8 lines
xen/arch/x86/hvm/hvm.c +1 -1
@@ -1159,7 +1161,7 @@ int hvm_set_cr0(unsigned long value)
         }
     }
 
-    if ( has_arch_mmios(v->domain) )
+    if ( !nestedhvm_vmentry_emulate(v) && has_arch_mmios(v->domain) )
     {
         if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) )
         {

Content-Description: ATT00001..txt

Quoted 4 lines

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

Signature · 3 lines
Tim Deegan <[email protected]>
Principal Software Engineer, XenServer Engineering
Citrix Systems UK Ltd.  (Company #02937203, SL9 0BG)
#2 lore raw
Quoted 5 lines · On Monday 09 August 2010 14:40:12 Tim Deegan wrote:
Quoted 2 lines

Allow paged real mode during vmrun emulation. Emulate cr0 and cr4 when guest does not intercept them.

I understand the paged-real-mode case, but why do you also allow CR0.CD and CR0.NW for nested VMs?

Oh, I haven't considered about those bits. You are right, they should not be allowed for l2 guests. Thanks for bringing this up. Fixed in my local tree.

Christoph

Quoted 42 lines

Cheers,

Tim.

Quoted 22 lines

diff -r 917f9eb07fc3 -r b1a356e5658d xen/arch/x86/hvm/hvm.c

xen/arch/x86/hvm/hvm.c +3 -1
@@ -54,6 +54,7 @@
 #include <asm/hvm/support.h>
 #include <asm/hvm/cacheattr.h>
 #include <asm/hvm/trace.h>
+#include <asm/hvm/nestedhvm.h>
 #include <asm/mtrr.h>
 #include <asm/apic.h>
 #include <public/sched.h>
@@ -1105,7 +1106,8 @@ int hvm_set_cr0(unsigned long value)
     /* ET is reserved and should be always be 1. */
     value |= X86_CR0_ET;
 
-    if ( (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
+    if ( !nestedhvm_vmentry_emulate(v) &&
+         (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
         goto gpf;
 
     if ( (value & X86_CR0_PG) && !(old_value & X86_CR0_PG) )

xen/arch/x86/hvm/hvm.c int hvm_set_cr0(unsigned long value) · line 1167

Quoted 8 lines
xen/arch/x86/hvm/hvm.c +1 -1
@@ -1159,7 +1161,7 @@ int hvm_set_cr0(unsigned long value)
         }
     }
 
-    if ( has_arch_mmios(v->domain) )
+    if ( !nestedhvm_vmentry_emulate(v) && has_arch_mmios(v->domain) )
     {
         if ( (value & X86_CR0_CD) && !(value & X86_CR0_NW) )
         {

Content-Description: ATT00001..txt

Quoted 4 lines

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

Signature · 6 lines
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632