Revision 0e607a80 target-i386/kvm.c
b/target-i386/kvm.c | ||
---|---|---|
23 | 23 |
#include "kvm.h" |
24 | 24 |
#include "cpu.h" |
25 | 25 |
#include "gdbstub.h" |
26 |
#include "host-utils.h" |
|
26 | 27 |
|
27 | 28 |
//#define DEBUG_KVM |
28 | 29 |
|
... | ... | |
223 | 224 |
|
224 | 225 |
void kvm_arch_reset_vcpu(CPUState *env) |
225 | 226 |
{ |
227 |
env->interrupt_injected = -1; |
|
226 | 228 |
} |
227 | 229 |
|
228 | 230 |
static int kvm_has_msr_star(CPUState *env) |
... | ... | |
411 | 413 |
{ |
412 | 414 |
struct kvm_sregs sregs; |
413 | 415 |
|
414 |
memcpy(sregs.interrupt_bitmap, |
|
415 |
env->interrupt_bitmap, |
|
416 |
sizeof(sregs.interrupt_bitmap)); |
|
416 |
memset(sregs.interrupt_bitmap, 0, sizeof(sregs.interrupt_bitmap)); |
|
417 |
if (env->interrupt_injected >= 0) { |
|
418 |
sregs.interrupt_bitmap[env->interrupt_injected / 64] |= |
|
419 |
(uint64_t)1 << (env->interrupt_injected % 64); |
|
420 |
} |
|
417 | 421 |
|
418 | 422 |
if ((env->eflags & VM_MASK)) { |
419 | 423 |
set_v8086_seg(&sregs.cs, &env->segs[R_CS]); |
... | ... | |
520 | 524 |
{ |
521 | 525 |
struct kvm_sregs sregs; |
522 | 526 |
uint32_t hflags; |
523 |
int ret; |
|
527 |
int bit, i, ret;
|
|
524 | 528 |
|
525 | 529 |
ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs); |
526 | 530 |
if (ret < 0) |
527 | 531 |
return ret; |
528 | 532 |
|
529 |
memcpy(env->interrupt_bitmap, |
|
530 |
sregs.interrupt_bitmap, |
|
531 |
sizeof(sregs.interrupt_bitmap)); |
|
533 |
/* There can only be one pending IRQ set in the bitmap at a time, so try |
|
534 |
to find it and save its number instead (-1 for none). */ |
|
535 |
env->interrupt_injected = -1; |
|
536 |
for (i = 0; i < ARRAY_SIZE(sregs.interrupt_bitmap); i++) { |
|
537 |
if (sregs.interrupt_bitmap[i]) { |
|
538 |
bit = ctz64(sregs.interrupt_bitmap[i]); |
|
539 |
env->interrupt_injected = i * 64 + bit; |
|
540 |
break; |
|
541 |
} |
|
542 |
} |
|
532 | 543 |
|
533 | 544 |
get_seg(&env->segs[R_CS], &sregs.cs); |
534 | 545 |
get_seg(&env->segs[R_DS], &sregs.ds); |
Also available in: Unified diff