Support VCPU migration
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.
Signed-off-by Yunhong Jiang <[email protected]>
Signed-off-by Arun Sharma <[email protected]>
xen/arch/x86/domain.c +13 -0
@@ -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
@@ -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
@@ -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
@@ -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 *);