diff options
author | Avi Kivity <avi@redhat.com> | 2009-11-22 15:11:29 +0200 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-11-22 15:11:29 +0200 |
commit | 0b04e23bfe861522689765229143d9671e2308df (patch) | |
tree | 6c270982bd88387870e48e40879d7b0cb978ac32 /target-i386 | |
parent | Merge commit '91011d4f3b7c311a42b842f6682ac64a2372d2b7' into upstream-merge (diff) | |
parent | kvm: x86: Refactor use of interrupt_bitmap (diff) | |
download | qemu-kvm-0b04e23bfe861522689765229143d9671e2308df.tar.gz qemu-kvm-0b04e23bfe861522689765229143d9671e2308df.tar.bz2 qemu-kvm-0b04e23bfe861522689765229143d9671e2308df.zip |
Merge commit '0e607a80d323ba9f46dee71cd07380c4eb5c2b0a' into upstream-merge
* commit '0e607a80d323ba9f46dee71cd07380c4eb5c2b0a': (22 commits)
kvm: x86: Refactor use of interrupt_bitmap
kvm: Add arch reset handler
Enable migration without shared storage from the monitor
Block live migration
Expose a mechanism to trace block writes
char: rename qemu_chr_reset to qemu_chr_generic_open
char: Remove special init_reset handling
char: don't limit data sent to backends to 1k per buffer
ARM PB-A8 support
LAN9118 emulation
mips_r4k: fix reset
PPC64: map Uni-North AGP bus aka fix Linux boot
PPC64: Partial fix to Linux crash: revert to old devfn
PCI: make duplicate devfn allocation fatal
Do not execute shell scripts directly
mips malta: fix indentation
target-mips: fix indentation
mips-malta: fix reset
mips: fix cpu_reset memory leak
fix make clean targets
...
Carry changes to qemu-kvm-x86.c.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/cpu.h | 3 | ||||
-rw-r--r-- | target-i386/kvm.c | 29 | ||||
-rw-r--r-- | target-i386/machine.c | 24 |
3 files changed, 25 insertions, 31 deletions
diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 4605fd280..a638e702b 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -709,8 +709,8 @@ typedef struct CPUX86State { MTRRVar mtrr_var[8]; /* For KVM */ - uint64_t interrupt_bitmap[256 / 64]; uint32_t mp_state; + int32_t interrupt_injected; /* in order to simplify APIC support, we leave this pointer to the user */ @@ -727,7 +727,6 @@ typedef struct CPUX86State { uint16_t fpus_vmstate; uint16_t fptag_vmstate; uint16_t fpregs_format_vmstate; - int32_t pending_irq_vmstate; } CPUX86State; CPUX86State *cpu_x86_init(const char *cpu_model); diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 83c83297b..552866563 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -23,6 +23,7 @@ #include "kvm.h" #include "cpu.h" #include "gdbstub.h" +#include "host-utils.h" #ifdef KVM_UPSTREAM //#define DEBUG_KVM @@ -222,6 +223,11 @@ int kvm_arch_init_vcpu(CPUState *env) return kvm_vcpu_ioctl(env, KVM_SET_CPUID2, &cpuid_data); } +void kvm_arch_reset_vcpu(CPUState *env) +{ + env->interrupt_injected = -1; +} + static int kvm_has_msr_star(CPUState *env) { static int has_msr_star; @@ -408,9 +414,11 @@ static int kvm_put_sregs(CPUState *env) { struct kvm_sregs sregs; - memcpy(sregs.interrupt_bitmap, - env->interrupt_bitmap, - sizeof(sregs.interrupt_bitmap)); + memset(sregs.interrupt_bitmap, 0, sizeof(sregs.interrupt_bitmap)); + if (env->interrupt_injected >= 0) { + sregs.interrupt_bitmap[env->interrupt_injected / 64] |= + (uint64_t)1 << (env->interrupt_injected % 64); + } if ((env->eflags & VM_MASK)) { set_v8086_seg(&sregs.cs, &env->segs[R_CS]); @@ -518,15 +526,22 @@ static int kvm_get_sregs(CPUState *env) { struct kvm_sregs sregs; uint32_t hflags; - int ret; + int bit, i, ret; ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs); if (ret < 0) return ret; - memcpy(env->interrupt_bitmap, - sregs.interrupt_bitmap, - sizeof(sregs.interrupt_bitmap)); + /* There can only be one pending IRQ set in the bitmap at a time, so try + to find it and save its number instead (-1 for none). */ + env->interrupt_injected = -1; + for (i = 0; i < ARRAY_SIZE(sregs.interrupt_bitmap); i++) { + if (sregs.interrupt_bitmap[i]) { + bit = ctz64(sregs.interrupt_bitmap[i]); + env->interrupt_injected = i * 64 + bit; + break; + } + } get_seg(&env->segs[R_CS], &sregs.cs); get_seg(&env->segs[R_DS], &sregs.ds); diff --git a/target-i386/machine.c b/target-i386/machine.c index 2b88fea63..6bd447fbf 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -2,7 +2,6 @@ #include "hw/boards.h" #include "hw/pc.h" #include "hw/isa.h" -#include "host-utils.h" #include "exec-all.h" #include "kvm.h" @@ -321,7 +320,7 @@ static const VMStateInfo vmstate_hack_uint64_as_uint32 = { static void cpu_pre_save(void *opaque) { CPUState *env = opaque; - int i, bit; + int i; cpu_synchronize_state(env); kvm_save_mpstate(env); @@ -338,17 +337,6 @@ static void cpu_pre_save(void *opaque) #else env->fpregs_format_vmstate = 1; #endif - - /* There can only be one pending IRQ set in the bitmap at a time, so try - to find it and save its number instead (-1 for none). */ - env->pending_irq_vmstate = -1; - for (i = 0; i < ARRAY_SIZE(env->interrupt_bitmap); i++) { - if (env->interrupt_bitmap[i]) { - bit = ctz64(env->interrupt_bitmap[i]); - env->pending_irq_vmstate = i * 64 + bit; - break; - } - } } static int cpu_pre_load(void *opaque) @@ -377,14 +365,6 @@ static int cpu_post_load(void *opaque, int version_id) for (i = 0; i < 4; i++) hw_breakpoint_insert(env, i); - if (version_id >= 9) { - memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap)); - if (env->pending_irq_vmstate >= 0) { - env->interrupt_bitmap[env->pending_irq_vmstate / 64] |= - (uint64_t)1 << (env->pending_irq_vmstate % 64); - } - } - tlb_flush(env, 1); kvm_load_mpstate(env); @@ -469,7 +449,7 @@ static const VMStateDescription vmstate_cpu = { VMSTATE_UINT64_V(mtrr_deftype, CPUState, 8), VMSTATE_MTRR_VARS(mtrr_var, CPUState, 8, 8), /* KVM-related states */ - VMSTATE_INT32_V(pending_irq_vmstate, CPUState, 9), + VMSTATE_INT32_V(interrupt_injected, CPUState, 9), VMSTATE_UINT32_V(mp_state, CPUState, 9), VMSTATE_UINT64_V(tsc, CPUState, 9), /* MCE */ |