Revision f8d926e9

b/kvm-all.c
181 181
    return ret;
182 182
}
183 183

  
184
int kvm_put_mp_state(CPUState *env)
185
{
186
    struct kvm_mp_state mp_state = { .mp_state = env->mp_state };
187

  
188
    return kvm_vcpu_ioctl(env, KVM_SET_MP_STATE, &mp_state);
189
}
190

  
191
int kvm_get_mp_state(CPUState *env)
192
{
193
    struct kvm_mp_state mp_state;
194
    int ret;
195

  
196
    ret = kvm_vcpu_ioctl(env, KVM_GET_MP_STATE, &mp_state);
197
    if (ret < 0) {
198
        return ret;
199
    }
200
    env->mp_state = mp_state.mp_state;
201
    return 0;
202
}
203

  
184 204
int kvm_sync_vcpus(void)
185 205
{
186 206
    CPUState *env;
b/kvm.h
72 72

  
73 73
int kvm_vcpu_ioctl(CPUState *env, int type, ...);
74 74

  
75
int kvm_get_mp_state(CPUState *env);
76
int kvm_put_mp_state(CPUState *env);
77

  
75 78
/* Arch specific hooks */
76 79

  
77 80
int kvm_arch_post_run(CPUState *env, struct kvm_run *run);
b/target-i386/cpu.h
669 669

  
670 670
    /* For KVM */
671 671
    uint64_t interrupt_bitmap[256 / 64];
672
    uint32_t mp_state;
672 673

  
673 674
    /* in order to simplify APIC support, we leave this pointer to the
674 675
       user */
......
837 838
#define cpu_signal_handler cpu_x86_signal_handler
838 839
#define cpu_list x86_cpu_list
839 840

  
840
#define CPU_SAVE_VERSION 8
841
#define CPU_SAVE_VERSION 9
841 842

  
842 843
/* MMU modes definitions */
843 844
#define MMU_MODE0_SUFFIX _kernel
b/target-i386/kvm.c
126 126
    uint32_t limit, i, j, cpuid_i;
127 127
    uint32_t unused;
128 128

  
129
    env->mp_state = KVM_MP_STATE_RUNNABLE;
130

  
129 131
    cpuid_i = 0;
130 132

  
131 133
    cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
......
648 650
    if (ret < 0)
649 651
        return ret;
650 652

  
653
    ret = kvm_put_mp_state(env);
654
    if (ret < 0)
655
        return ret;
656

  
657
    ret = kvm_get_mp_state(env);
658
    if (ret < 0)
659
        return ret;
660

  
651 661
    return 0;
652 662
}
653 663

  
b/target-i386/machine.c
140 140
        qemu_put_be64s(f, &env->mtrr_var[i].base);
141 141
        qemu_put_be64s(f, &env->mtrr_var[i].mask);
142 142
    }
143

  
144
    for (i = 0; i < sizeof(env->interrupt_bitmap)/8; i++) {
145
        qemu_put_be64s(f, &env->interrupt_bitmap[i]);
146
    }
147
    qemu_put_be64s(f, &env->tsc);
148
    qemu_put_be32s(f, &env->mp_state);
143 149
}
144 150

  
145 151
#ifdef USE_X86LDOUBLE
......
174 180
    uint16_t fpus, fpuc, fptag, fpregs_format;
175 181
    int32_t a20_mask;
176 182

  
177
    if (version_id != 3 && version_id != 4 && version_id != 5
178
        && version_id != 6 && version_id != 7 && version_id != 8)
183
    if (version_id < 3 || version_id > CPU_SAVE_VERSION)
179 184
        return -EINVAL;
180 185
    for(i = 0; i < CPU_NB_REGS; i++)
181 186
        qemu_get_betls(f, &env->regs[i]);
......
319 324
            qemu_get_be64s(f, &env->mtrr_var[i].mask);
320 325
        }
321 326
    }
327
    if (version_id >= 9) {
328
        for (i = 0; i < sizeof(env->interrupt_bitmap)/8; i++) {
329
            qemu_get_be64s(f, &env->interrupt_bitmap[i]);
330
        }
331
        qemu_get_be64s(f, &env->tsc);
332
        qemu_get_be32s(f, &env->mp_state);
333
    }
322 334

  
323 335
    /* XXX: ensure compatiblity for halted bit ? */
324 336
    /* XXX: compute redundant hflags bits */

Also available in: Unified diff