diff options
author | Avi Kivity <avi@redhat.com> | 2009-08-30 16:36:26 +0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-08-30 16:36:26 +0300 |
commit | b3baac42de9e26e911f75ac51a89edde92e60a67 (patch) | |
tree | d21b00a2b9a71174ed3de37c90f1ad36436baadf /qemu-kvm.c | |
parent | Merge branch 'upstream-merge' (diff) | |
parent | Merge commit '757506d282c3c579368055b1bf50fa4056dbe5bc' into upstream-merge (diff) | |
download | qemu-kvm-b3baac42de9e26e911f75ac51a89edde92e60a67.tar.gz qemu-kvm-b3baac42de9e26e911f75ac51a89edde92e60a67.tar.bz2 qemu-kvm-b3baac42de9e26e911f75ac51a89edde92e60a67.zip |
Merge branch 'upstream-merge'
* upstream-merge: (142 commits)
Fix gcc 3 warning: comparison is always true due to limited range of data type
Fix gcc 3 warning about uninitialized variable
Sparc32: port Slavio misc devices to VMState design
Sparc32: port ECC memory controller to VMState design
Sparc32: port IOMMU to VMState design
Sparc32: port DMA controller to VMState design
Sparc32: port TCX to VMState design
Sparc32: port interrupt controller to VMState design
Update OpenBIOS images to r569
Suppress kraxelisms
Fix Sparc64 breakage: add dummy ISA irqs
Fix merge of 59f2a78793b6d17634f39646d604e84af51e0919
Don't compile aio code if CONFIG_LINUX_AIO is undefined
Fix sb16 breakage due to unassigned s->irq
Fix formatting
Relax pthreads check to avoid win32
e1000 cleanup
pcnet: Add pci_pcnet_{save/load} functions, then remove PCNetState pci_dev field
pcnet: remove useless casts This are casts to the very type of the function
pcnet: Change casts to DO_UPCAST() for PCIPCNetState
...
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'qemu-kvm.c')
-rw-r--r-- | qemu-kvm.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/qemu-kvm.c b/qemu-kvm.c index b59e40370..2d3ca7166 100644 --- a/qemu-kvm.c +++ b/qemu-kvm.c @@ -874,6 +874,15 @@ int kvm_set_mpstate(kvm_vcpu_context_t vcpu, struct kvm_mp_state *mp_state) } #endif +void kvm_cpu_synchronize_state(CPUState *env) +{ + if (!env->kvm_cpu_state.regs_modified) { + kvm_arch_get_registers(env); + kvm_arch_save_mpstate(env); + env->kvm_cpu_state.regs_modified = 1; + } +} + static int handle_mmio(kvm_vcpu_context_t vcpu) { unsigned long addr = vcpu->run->mmio.phys_addr; @@ -947,6 +956,7 @@ int kvm_run(kvm_vcpu_context_t vcpu, void *env) int fd = vcpu->fd; struct kvm_run *run = vcpu->run; kvm_context_t kvm = vcpu->kvm; + CPUState *_env = env; again: push_nmi(kvm); @@ -954,6 +964,13 @@ int kvm_run(kvm_vcpu_context_t vcpu, void *env) if (!kvm->irqchip_in_kernel) run->request_interrupt_window = kvm_arch_try_push_interrupts(env); #endif + + if (_env->kvm_cpu_state.regs_modified) { + kvm_arch_put_registers(_env); + kvm_arch_load_mpstate(_env); + _env->kvm_cpu_state.regs_modified = 0; + } + r = pre_kvm_run(kvm, env); if (r) return r; |