Skip to contentSkip to conversation

Support VCPU migration

PATCH New Arun Sharma 1 participant 1 message Aug 11, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 4/15 Support VCPU migration

Support VCPU migration

Reorganize the low level asm code to support relaunching a VMCS on a different logical CPU.

xen/arch/x86/domain.c +13 -0
diff -r b370beb3e107 -r e4ad3feadd4e xen/arch/x86/domain.c
@@ -303,6 +303,7 @@
     if ( VMX_DOMAIN(v) && (v->processor != newcpu) ){
         u64 vmcs_phys_ptr = (u64) virt_to_phys(v->arch.arch_vmx.vmcs);
         __vmpclear(vmcs_phys_ptr);
+        v->arch.schedule_tail = arch_vmx_do_relaunch;
     }
 }
 
@@ -325,6 +326,18 @@
     load_vmcs(&v->arch.arch_vmx, vmcs_phys_ptr);
     vmx_do_launch(v);
     reset_stack_and_jump(vmx_asm_do_launch);
+}
+
+void arch_vmx_do_relaunch(struct vcpu *v)
+{
+    u64 vmcs_phys_ptr = (u64) virt_to_phys(v->arch.arch_vmx.vmcs);
+
+    load_vmcs(&v->arch.arch_vmx, vmcs_phys_ptr);
+    vmx_do_resume(v);
+    vmx_set_host_env(v);
+    v->arch.schedule_tail = arch_vmx_do_resume;
+
+    reset_stack_and_jump(vmx_asm_do_relaunch);
 }
 
 static int vmx_final_setup_guest(
xen/arch/x86/vmx_vmcs.c +1 -2
diff -r b370beb3e107 -r e4ad3feadd4e xen/arch/x86/vmx_vmcs.c
@@ -198,7 +198,7 @@
     host_env.idtr_limit = desc.size;
     host_env.idtr_base = desc.address;
     error |= __vmwrite(HOST_IDTR_BASE, host_env.idtr_base);
- 
+
     __asm__ __volatile__ ("sgdt  (%0) \n" :: "a"(&desc) : "memory");
     host_env.gdtr_limit = desc.size;
     host_env.gdtr_base = desc.address;
@@ -210,7 +210,6 @@
     host_env.tr_base = (unsigned long) &init_tss[cpu];
     error |= __vmwrite(HOST_TR_SELECTOR, host_env.tr_selector);
     error |= __vmwrite(HOST_TR_BASE, host_env.tr_base);
-
 }
 
 void vmx_do_launch(struct vcpu *v) 
xen/arch/x86/x86_32/entry.S +43 -33

111 lines not on this page · raw message

xen/arch/x86/x86_64/entry.S +52 -48

133 lines not on this page · raw message

xen/include/asm-x86/vmx.h +1 -0
diff -r b370beb3e107 -r e4ad3feadd4e xen/include/asm-x86/vmx.h
@@ -35,6 +35,7 @@
 
 extern void arch_vmx_do_launch(struct vcpu *);
 extern void arch_vmx_do_resume(struct vcpu *);
+extern void arch_vmx_do_relaunch(struct vcpu *);
 
 extern int vmcs_size;
 extern unsigned int cpu_rev;
xen/include/asm-x86/vmx_vmcs.h +1 -0
diff -r b370beb3e107 -r e4ad3feadd4e xen/include/asm-x86/vmx_vmcs.h
@@ -93,6 +93,7 @@
 
 void vmx_do_launch(struct vcpu *); 
 void vmx_do_resume(struct vcpu *); 
+void vmx_set_host_env(struct vcpu *);
 
 struct vmcs_struct *alloc_vmcs(void);
 void free_vmcs(struct vmcs_struct *);