From: Avi Kivity <a...@redhat.com> This makes sure the cpu state is properly loaded.
Signed-off-by: Avi Kivity <a...@redhat.com> diff --git a/kvm-tpr-opt.c b/kvm-tpr-opt.c index 89256d4..bf9c9a0 100644 --- a/kvm-tpr-opt.c +++ b/kvm-tpr-opt.c @@ -233,7 +233,7 @@ static int get_pcr_cpu(CPUState *env) return (int)b; } -static int enable_vapic(CPUState *env) +int kvm_tpr_enable_vapic(CPUState *env) { static uint8_t one = 1; int pcr_cpu = get_pcr_cpu(env); @@ -243,8 +243,15 @@ static int enable_vapic(CPUState *env) kvm_enable_vapic(env, vapic_phys + (pcr_cpu << 7)); cpu_physical_memory_rw(vapic_phys + (pcr_cpu << 7) + 4, &one, 1, 1); + env->update_vapic = 0; bios_enabled = 1; + return 1; +} +static int enable_vapic(CPUState *env) +{ + bios_enabled = 1; + env->update_vapic = 1; return 1; } @@ -307,7 +314,7 @@ void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write) return; if (!bios_is_mapped(env, rip)) return; - if (!enable_vapic(env)) + if (!kvm_tpr_enable_vapic(env)) return; patch_instruction(env, rip); } @@ -316,7 +323,7 @@ void kvm_tpr_vcpu_start(CPUState *env) { kvm_enable_tpr_access_reporting(env); if (bios_enabled) - enable_vapic(env); + kvm_tpr_enable_vapic(env); } static void tpr_save(QEMUFile *f, void *s) @@ -391,7 +398,7 @@ static void vtpr_ioport_write(void *opaque, uint32_t addr, uint32_t val) } bios_enabled = 1; update_vbios_real_tpr(); - enable_vapic(env); + kvm_tpr_enable_vapic(env); } void kvm_tpr_opt_setup(void) diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 1f0d37a..7b7bc0f 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -1401,6 +1401,9 @@ int kvm_arch_halt(CPUState *env) int kvm_arch_pre_run(CPUState *env, struct kvm_run *run) { + if (env->update_vapic) { + kvm_tpr_enable_vapic(env); + } if (!kvm_irqchip_in_kernel()) kvm_set_cr8(env, cpu_get_apic_tpr(env)); return 0; diff --git a/qemu-kvm.h b/qemu-kvm.h index 74f3746..a81ff12 100644 --- a/qemu-kvm.h +++ b/qemu-kvm.h @@ -1161,6 +1161,8 @@ int kvm_vm_ioctl(KVMState *s, int type, ...); int kvm_vcpu_ioctl(CPUState *env, int type, ...); int kvm_check_extension(KVMState *s, unsigned int ext); +int kvm_tpr_enable_vapic(CPUState *env); + #endif #endif diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 31412a8..eddb4bd 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -732,6 +732,8 @@ typedef struct CPUX86State { uint16_t fpus_vmstate; uint16_t fptag_vmstate; uint16_t fpregs_format_vmstate; + + int update_vapic; } CPUX86State; CPUX86State *cpu_x86_init(const char *cpu_model); -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html