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