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] [SVM] Strip down svm_do_launch() pending

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [SVM] Strip down svm_do_launch() pending complete removal.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 07 Nov 2006 12:30:17 +0000
Delivery-date: Tue, 07 Nov 2006 04:30:16 -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 kaf24@xxxxxxxxxxxxxxxxxxxxx
# Node ID ad8f0e049d633eb9c24ed10633e0669352816bd0
# Parent  81c451bd398e950f9df8819ab7fab4b847815c82
[SVM] Strip down svm_do_launch() pending complete removal.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/svm.c  |    3 +-
 xen/arch/x86/hvm/svm/vmcb.c |   64 +++++++++-----------------------------------
 2 files changed, 16 insertions(+), 51 deletions(-)

diff -r 81c451bd398e -r ad8f0e049d63 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Mon Nov 06 20:23:08 2006 +0000
+++ b/xen/arch/x86/hvm/svm/svm.c        Mon Nov 06 20:47:10 2006 +0000
@@ -750,6 +750,8 @@ static int svm_vcpu_initialise(struct vc
     v->arch.schedule_tail    = arch_svm_do_launch;
     v->arch.ctxt_switch_from = svm_ctxt_switch_from;
     v->arch.ctxt_switch_to   = svm_ctxt_switch_to;
+
+    v->arch.hvm_svm.saved_irq_vector = -1;
 
     if ( (rc = svm_create_vmcb(v)) != 0 )
     {
@@ -2503,7 +2505,6 @@ asmlinkage void svm_vmexit_handler(struc
     exit_reason = vmcb->exitcode;
     save_svm_cpu_user_regs(v, regs);
 
-    vmcb->tlb_control = 1;
     v->arch.hvm_svm.inject_event = 0;
 
     if (exit_reason == VMEXIT_INVALID)
diff -r 81c451bd398e -r ad8f0e049d63 xen/arch/x86/hvm/svm/vmcb.c
--- a/xen/arch/x86/hvm/svm/vmcb.c       Mon Nov 06 20:23:08 2006 +0000
+++ b/xen/arch/x86/hvm/svm/vmcb.c       Mon Nov 06 20:47:10 2006 +0000
@@ -93,6 +93,9 @@ static int construct_vmcb(struct vcpu *v
     segment_attributes_t attrib;
     unsigned long dr7;
 
+    /* Always flush the TLB on VMRUN. */
+    vmcb->tlb_control = 1;
+
     /* SVM intercepts. */
     vmcb->general1_intercepts = 
         GENERAL1_INTERCEPT_INTR         | GENERAL1_INTERCEPT_NMI         |
@@ -137,6 +140,9 @@ static int construct_vmcb(struct vcpu *v
     /* TSC. */
     vmcb->tsc_offset = 0;
     
+    /* Guest EFER: *must* contain SVME or VMRUN will fail. */
+    vmcb->efer = EFER_SVME;
+
     /* Guest segment limits. */
     vmcb->cs.limit = GUEST_SEGMENT_LIMIT;
     vmcb->es.limit = GUEST_SEGMENT_LIMIT;
@@ -178,11 +184,10 @@ static int construct_vmcb(struct vcpu *v
     vmcb->gdtr.limit = 0;
 
     /* Guest LDT. */
-    attrib.fields.s = 0;      /* not code or data segement */
-    attrib.fields.type = 0x2; /* LDT */
-    attrib.fields.db = 0;     /* 16-bit */
-    attrib.fields.g = 0;
-    vmcb->ldtr.attributes = attrib;
+    vmcb->ldtr.sel = 0;
+    vmcb->ldtr.base = 0;
+    vmcb->ldtr.limit = 0;
+    vmcb->ldtr.attributes.bytes = 0;
 
     /* Guest TSS. */
     attrib.fields.type = 0xb; /* 32-bit TSS (busy) */
@@ -203,6 +208,9 @@ static int construct_vmcb(struct vcpu *v
     __asm__ __volatile__ ("mov %%dr7, %0\n" : "=r" (dr7));
     vmcb->dr7 = dr7;
 
+    shadow_update_paging_modes(v);
+    vmcb->cr3 = v->arch.hvm_vcpu.hw_cr3; 
+
     arch_svm->vmcb->exception_intercepts = MONITOR_DEFAULT_EXCEPTION_BITMAP;
 
     return 0;
@@ -263,7 +271,6 @@ void svm_do_launch(struct vcpu *v)
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
     int core = smp_processor_id();
 
-    /* Update CR3, GDT, LDT, TR */
     hvm_stts(v);
 
     /* current core is the one we intend to perform the VMRUN on */
@@ -272,50 +279,8 @@ void svm_do_launch(struct vcpu *v)
     if ( !asidpool_assign_next(vmcb, 0, core, core) )
         BUG();
 
-    vmcb->ldtr.sel = 0;
-    vmcb->ldtr.base = 0;
-    vmcb->ldtr.limit = 0;
-    vmcb->ldtr.attributes.bytes = 0;
-
-    vmcb->efer = EFER_SVME; /* Make sure VMRUN won't return with -1 */
-    
-    if ( svm_dbg_on )
-    {
-        unsigned long pt;
-        printk("%s: hw_cr3 = %llx\n", __func__, 
-               (unsigned long long) v->arch.hvm_vcpu.hw_cr3);
-        pt = pagetable_get_paddr(v->arch.guest_table);
-        printk("%s: guest_table  = %lx\n", __func__, pt);
-        pt = pagetable_get_paddr(v->domain->arch.phys_table);
-        printk("%s: phys_table   = %lx\n", __func__, pt);
-    }
-
-    /* Set cr3 from hw_cr3 even when guest-visible paging is not enabled */
-    vmcb->cr3 = v->arch.hvm_vcpu.hw_cr3; 
-
-    if ( svm_dbg_on )
-    {
-        printk("%s: cr3 = %lx ", __func__, (unsigned long)vmcb->cr3);
-        printk("init_guest_table: guest_table = 0x%08x, "
-               "monitor_table = 0x%08x, hw_cr3 = 0x%16llx\n",
-               (int)v->arch.guest_table.pfn, 
-               (int)v->arch.monitor_table.pfn, 
-               (unsigned long long)v->arch.hvm_vcpu.hw_cr3);
-    }
-
     v->arch.schedule_tail = arch_svm_do_resume;
-
-    v->arch.hvm_svm.saved_irq_vector = -1;
-
-    hvm_set_guest_time(v, 0);
-
-    if (svm_dbg_on)
-        svm_dump_vmcb(__func__, vmcb);
-
-    vmcb->tlb_control = 1;
-}
-
-
+}
 
 static void svm_dump_sel(char *name, segment_selector_t *s)
 {
@@ -323,7 +288,6 @@ static void svm_dump_sel(char *name, seg
            name, s->sel, s->attributes.bytes, s->limit,
            (unsigned long long)s->base);
 }
-
 
 void svm_dump_vmcb(const char *from, struct vmcb_struct *vmcb)
 {

_______________________________________________
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] [SVM] Strip down svm_do_launch() pending complete removal., Xen patchbot-unstable <=