Use the new ioctl's to save and restore the MP_STATE for all vcpu's. Fixes SMP migration.
Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]> Index: kvm-userspace.io/libkvm/libkvm.c =================================================================== --- kvm-userspace.io.orig/libkvm/libkvm.c +++ kvm-userspace.io/libkvm/libkvm.c @@ -776,6 +776,17 @@ int kvm_set_sregs(kvm_context_t kvm, int return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_SREGS, sregs); } +int kvm_get_mpstate(kvm_context_t kvm, int vcpu, int *mpstate) +{ + return ioctl(kvm->vcpu_fd[vcpu], KVM_GET_MP_STATE, mpstate); +} + +int kvm_set_mpstate(kvm_context_t kvm, int vcpu, int *mpstate) +{ + return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_MP_STATE, mpstate); +} + + static int handle_mmio(kvm_context_t kvm, struct kvm_run *kvm_run) { unsigned long addr = kvm_run->mmio.phys_addr; Index: kvm-userspace.io/libkvm/libkvm.h =================================================================== --- kvm-userspace.io.orig/libkvm/libkvm.h +++ kvm-userspace.io/libkvm/libkvm.h @@ -301,6 +301,18 @@ int kvm_get_sregs(kvm_context_t kvm, int int kvm_set_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *regs); /*! + * * \brief Read VCPU MP state + * + */ +int kvm_get_mpstate(kvm_context_t kvm, int vcpu, int *mpstate); + +/*! + * * \brief Write VCPU MP state + * + */ +int kvm_set_mpstate(kvm_context_t kvm, int vcpu, int *mpstate); + +/*! * \brief Simulate an external vectored interrupt * * This allows you to simulate an external vectored interrupt. Index: kvm-userspace.io/qemu/qemu-kvm-x86.c =================================================================== --- kvm-userspace.io.orig/qemu/qemu-kvm-x86.c +++ kvm-userspace.io/qemu/qemu-kvm-x86.c @@ -282,6 +282,15 @@ void kvm_arch_load_regs(CPUState *env) perror("kvm_set_msrs FAILED"); } +void kvm_save_mpstate(CPUState *env) +{ + kvm_get_mpstate(kvm_context, env->cpu_index, &env->mp_state); +} + +void kvm_load_mpstate(CPUState *env) +{ + kvm_set_mpstate(kvm_context, env->cpu_index, &env->mp_state); +} void kvm_arch_save_regs(CPUState *env) { Index: kvm-userspace.io/qemu/qemu-kvm.h =================================================================== --- kvm-userspace.io.orig/qemu/qemu-kvm.h +++ kvm-userspace.io/qemu/qemu-kvm.h @@ -18,6 +18,8 @@ int kvm_init_ap(void); void kvm_qemu_destroy(void); void kvm_load_registers(CPUState *env); void kvm_save_registers(CPUState *env); +void kvm_load_mpstate(CPUState *env); +void kvm_save_mpstate(CPUState *env); int kvm_cpu_exec(CPUState *env); int kvm_update_debugger(CPUState *env); int kvm_qemu_init_env(CPUState *env); Index: kvm-userspace.io/qemu/target-i386/cpu.h =================================================================== --- kvm-userspace.io.orig/qemu/target-i386/cpu.h +++ kvm-userspace.io/qemu/target-i386/cpu.h @@ -599,6 +599,7 @@ typedef struct CPUX86State { /* in order to simplify APIC support, we leave this pointer to the user */ struct APICState *apic_state; + int mp_state; } CPUX86State; CPUX86State *cpu_x86_init(const char *cpu_model); Index: kvm-userspace.io/qemu/vl.c =================================================================== --- kvm-userspace.io.orig/qemu/vl.c +++ kvm-userspace.io/qemu/vl.c @@ -6655,8 +6655,10 @@ void cpu_save(QEMUFile *f, void *opaque) uint32_t hflags; int i; - if (kvm_enabled()) + if (kvm_enabled()) { kvm_save_registers(env); + kvm_save_mpstate(env); + } for(i = 0; i < CPU_NB_REGS; i++) qemu_put_betls(f, &env->regs[i]); @@ -6748,6 +6750,7 @@ void cpu_save(QEMUFile *f, void *opaque) qemu_put_be32s(f, &env->kvm_interrupt_bitmap[i]); } qemu_put_be64s(f, &env->tsc); + qemu_put_be32s(f, &env->mp_state); } } @@ -6899,7 +6902,9 @@ int cpu_load(QEMUFile *f, void *opaque, qemu_get_be32s(f, &env->kvm_interrupt_bitmap[i]); } qemu_get_be64s(f, &env->tsc); + qemu_get_be32s(f, &env->mp_state); kvm_load_registers(env); + kvm_load_mpstate(env); } return 0; } -- ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Register now and save $200. Hurry, offer ends at 11:59 p.m., Monday, April 7! Use priority code J8TLD2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel