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