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