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

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

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

Xen patchbot-unstable
# HG changeset patch
# User Keir Fraser <[hidden email]>
# Date 1195761342 0
# Node ID f2711b7eae9566c2ea96e51da0e8f5b5f4a03110
# Parent  69b56d3289f52092f797cf1f7d500883dbbf2867
hvm: Clean up VMCS/VMCB construction.
Signed-off-by: Keir Fraser <[hidden email]>
---
 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
[hidden email]
http://lists.xensource.com/xen-changelog