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-changelog

[Xen-changelog] [xen-unstable] hvm: Clean up VMCS/VMCB construction.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] hvm: Clean up VMCS/VMCB construction.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 23 Nov 2007 07:40:11 -0800
Delivery-date: Fri, 23 Nov 2007 07:40:38 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1195761342 0
# Node ID f2711b7eae9566c2ea96e51da0e8f5b5f4a03110
# Parent  69b56d3289f52092f797cf1f7d500883dbbf2867
hvm: Clean up VMCS/VMCB construction.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/vmcb.c        |   38 ++++++--------------
 xen/arch/x86/hvm/vmx/vmcs.c        |   69 +++++++++++++------------------------
 xen/include/asm-x86/hvm/svm/vmcb.h |    3 -
 3 files changed, 40 insertions(+), 70 deletions(-)

diff -r 69b56d3289f5 -r f2711b7eae95 xen/arch/x86/hvm/svm/vmcb.c
--- a/xen/arch/x86/hvm/svm/vmcb.c       Thu Nov 22 19:23:40 2007 +0000
+++ b/xen/arch/x86/hvm/svm/vmcb.c       Thu Nov 22 19:55:42 2007 +0000
@@ -40,8 +40,6 @@
 
 extern int svm_dbg_on;
 
-#define GUEST_SEGMENT_LIMIT 0xffffffff
-
 #define IOPM_SIZE   (12 * 1024)
 #define MSRPM_SIZE  (8  * 1024)
 
@@ -110,7 +108,6 @@ static int construct_vmcb(struct vcpu *v
 {
     struct arch_svm_struct *arch_svm = &v->arch.hvm_svm;
     struct vmcb_struct *vmcb = arch_svm->vmcb;
-    svm_segment_attributes_t attrib;
 
     /* TLB control, and ASID assigment. */
     svm_asid_init_vcpu(v);
@@ -173,12 +170,12 @@ static int construct_vmcb(struct vcpu *v
     vmcb->efer = EFER_SVME;
 
     /* Guest segment limits. */
-    vmcb->cs.limit = GUEST_SEGMENT_LIMIT;
-    vmcb->es.limit = GUEST_SEGMENT_LIMIT;
-    vmcb->ss.limit = GUEST_SEGMENT_LIMIT;
-    vmcb->ds.limit = GUEST_SEGMENT_LIMIT;
-    vmcb->fs.limit = GUEST_SEGMENT_LIMIT;
-    vmcb->gs.limit = GUEST_SEGMENT_LIMIT;
+    vmcb->cs.limit = ~0u;
+    vmcb->es.limit = ~0u;
+    vmcb->ss.limit = ~0u;
+    vmcb->ds.limit = ~0u;
+    vmcb->fs.limit = ~0u;
+    vmcb->gs.limit = ~0u;
 
     /* Guest segment bases. */
     vmcb->cs.base = 0;
@@ -189,20 +186,12 @@ static int construct_vmcb(struct vcpu *v
     vmcb->gs.base = 0;
 
     /* Guest segment AR bytes. */
-    attrib.bytes = 0;
-    attrib.fields.type = 0x3; /* type = 3 */
-    attrib.fields.s = 1;      /* code or data, i.e. not system */
-    attrib.fields.dpl = 0;    /* DPL = 0 */
-    attrib.fields.p = 1;      /* segment present */
-    attrib.fields.db = 1;     /* 32-bit */
-    attrib.fields.g = 1;      /* 4K pages in limit */
-    vmcb->es.attr = attrib;
-    vmcb->ss.attr = attrib;
-    vmcb->ds.attr = attrib;
-    vmcb->fs.attr = attrib;
-    vmcb->gs.attr = attrib;
-    attrib.fields.type = 0xb; /* type=0xb -> executable/readable, accessed */
-    vmcb->cs.attr = attrib;
+    vmcb->es.attr.bytes = 0xc93; /* read/write, accessed */
+    vmcb->ss.attr.bytes = 0xc93;
+    vmcb->ds.attr.bytes = 0xc93;
+    vmcb->fs.attr.bytes = 0xc93;
+    vmcb->gs.attr.bytes = 0xc93;
+    vmcb->cs.attr.bytes = 0xc9b; /* exec/read, accessed */
 
     /* Guest IDT. */
     vmcb->idtr.base = 0;
@@ -219,8 +208,7 @@ static int construct_vmcb(struct vcpu *v
     vmcb->ldtr.attr.bytes = 0;
 
     /* Guest TSS. */
-    attrib.fields.type = 0xb; /* 32-bit TSS (busy) */
-    vmcb->tr.attr = attrib;
+    vmcb->tr.attr.bytes = 0x08b; /* 32-bit TSS (busy) */
     vmcb->tr.base = 0;
     vmcb->tr.limit = 0xff;
 
diff -r 69b56d3289f5 -r f2711b7eae95 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Thu Nov 22 19:23:40 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Thu Nov 22 19:55:42 2007 +0000
@@ -443,11 +443,8 @@ void vmx_disable_intercept_for_msr(struc
     }
 }
 
-#define GUEST_SEGMENT_LIMIT     0xffffffff
-
 static int construct_vmcs(struct vcpu *v)
 {
-    union vmcs_arbytes arbytes;
     uint16_t sysenter_cs;
     unsigned long sysenter_eip;
 
@@ -537,46 +534,39 @@ static int construct_vmcs(struct vcpu *v
     __vmwrite(GUEST_CS_BASE, 0);
 
     /* Guest segment limits. */
-    __vmwrite(GUEST_ES_LIMIT, GUEST_SEGMENT_LIMIT);
-    __vmwrite(GUEST_SS_LIMIT, GUEST_SEGMENT_LIMIT);
-    __vmwrite(GUEST_DS_LIMIT, GUEST_SEGMENT_LIMIT);
-    __vmwrite(GUEST_FS_LIMIT, GUEST_SEGMENT_LIMIT);
-    __vmwrite(GUEST_GS_LIMIT, GUEST_SEGMENT_LIMIT);
-    __vmwrite(GUEST_CS_LIMIT, GUEST_SEGMENT_LIMIT);
+    __vmwrite(GUEST_ES_LIMIT, ~0u);
+    __vmwrite(GUEST_SS_LIMIT, ~0u);
+    __vmwrite(GUEST_DS_LIMIT, ~0u);
+    __vmwrite(GUEST_FS_LIMIT, ~0u);
+    __vmwrite(GUEST_GS_LIMIT, ~0u);
+    __vmwrite(GUEST_CS_LIMIT, ~0u);
 
     /* Guest segment AR bytes. */
-    arbytes.bytes = 0;
-    arbytes.fields.seg_type = 0x3;          /* type = 3 */
-    arbytes.fields.s = 1;                   /* code or data, i.e. not system */
-    arbytes.fields.dpl = 0;                 /* DPL = 3 */
-    arbytes.fields.p = 1;                   /* segment present */
-    arbytes.fields.default_ops_size = 1;    /* 32-bit */
-    arbytes.fields.g = 1;
-    arbytes.fields.null_bit = 0;            /* not null */
-    __vmwrite(GUEST_ES_AR_BYTES, arbytes.bytes);
-    __vmwrite(GUEST_SS_AR_BYTES, arbytes.bytes);
-    __vmwrite(GUEST_DS_AR_BYTES, arbytes.bytes);
-    __vmwrite(GUEST_FS_AR_BYTES, arbytes.bytes);
-    __vmwrite(GUEST_GS_AR_BYTES, arbytes.bytes);
-    arbytes.fields.seg_type = 0xb;          /* type = 0xb */
-    __vmwrite(GUEST_CS_AR_BYTES, arbytes.bytes);
+    __vmwrite(GUEST_ES_AR_BYTES, 0xc093); /* read/write, accessed */
+    __vmwrite(GUEST_SS_AR_BYTES, 0xc093);
+    __vmwrite(GUEST_DS_AR_BYTES, 0xc093);
+    __vmwrite(GUEST_FS_AR_BYTES, 0xc093);
+    __vmwrite(GUEST_GS_AR_BYTES, 0xc093);
+    __vmwrite(GUEST_CS_AR_BYTES, 0xc09b); /* exec/read, accessed */
+
+    /* Guest IDT. */
+    __vmwrite(GUEST_IDTR_BASE, 0);
+    __vmwrite(GUEST_IDTR_LIMIT, 0);
 
     /* Guest GDT. */
     __vmwrite(GUEST_GDTR_BASE, 0);
     __vmwrite(GUEST_GDTR_LIMIT, 0);
 
-    /* Guest IDT. */
-    __vmwrite(GUEST_IDTR_BASE, 0);
-    __vmwrite(GUEST_IDTR_LIMIT, 0);
-
-    /* Guest LDT and TSS. */
-    arbytes.fields.s = 0;                   /* not code or data segement */
-    arbytes.fields.seg_type = 0x2;          /* LTD */
-    arbytes.fields.default_ops_size = 0;    /* 16-bit */
-    arbytes.fields.g = 0;
-    __vmwrite(GUEST_LDTR_AR_BYTES, arbytes.bytes);
-    arbytes.fields.seg_type = 0xb;          /* 32-bit TSS (busy) */
-    __vmwrite(GUEST_TR_AR_BYTES, arbytes.bytes);
+    /* Guest LDT. */
+    __vmwrite(GUEST_LDTR_AR_BYTES, 0x0082); /* LDT */
+    __vmwrite(GUEST_LDTR_SELECTOR, 0);
+    __vmwrite(GUEST_LDTR_BASE, 0);
+    __vmwrite(GUEST_LDTR_LIMIT, 0);
+
+    /* Guest TSS. */
+    __vmwrite(GUEST_TR_AR_BYTES, 0x008b); /* 32-bit TSS (busy) */
+    __vmwrite(GUEST_TR_BASE, 0);
+    __vmwrite(GUEST_TR_LIMIT, 0xff);
 
     __vmwrite(GUEST_INTERRUPTIBILITY_INFO, 0);
     __vmwrite(GUEST_DR7, 0);
@@ -599,13 +589,6 @@ static int construct_vmcs(struct vcpu *v
                   page_to_maddr(vcpu_vlapic(v)->regs_page));
         __vmwrite(TPR_THRESHOLD, 0);
     }
-
-    __vmwrite(GUEST_LDTR_SELECTOR, 0);
-    __vmwrite(GUEST_LDTR_BASE, 0);
-    __vmwrite(GUEST_LDTR_LIMIT, 0);
-
-    __vmwrite(GUEST_TR_BASE, 0);
-    __vmwrite(GUEST_TR_LIMIT, 0xff);
 
     vmx_vmcs_exit(v);
 
diff -r 69b56d3289f5 -r f2711b7eae95 xen/include/asm-x86/hvm/svm/vmcb.h
--- a/xen/include/asm-x86/hvm/svm/vmcb.h        Thu Nov 22 19:23:40 2007 +0000
+++ b/xen/include/asm-x86/hvm/svm/vmcb.h        Thu Nov 22 19:55:42 2007 +0000
@@ -303,8 +303,7 @@ enum VMEXIT_EXITCODE
     VMEXIT_INVALID          =  -1
 };
 
-/* Definitions of segment state are borrowed by the generic HVM code. */
-typedef segment_attributes_t svm_segment_attributes_t;
+/* Definition of segment state is borrowed by the generic HVM code. */
 typedef segment_register_t svm_segment_register_t;
 
 typedef union 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] hvm: Clean up VMCS/VMCB construction., Xen patchbot-unstable <=