Revision f6584ee2

b/target-i386/cpu.h
681 681
#endif
682 682
    uint64_t system_time_msr;
683 683
    uint64_t wall_clock_msr;
684
    uint64_t async_pf_en_msr;
684 685

  
685 686
    uint64_t tsc;
686 687

  
b/target-i386/cpuid.c
73 73
};
74 74

  
75 75
static const char *kvm_feature_name[] = {
76
    "kvmclock", "kvm_nopiodelay", "kvm_mmu", NULL, NULL, NULL, NULL, NULL,
76
    "kvmclock", "kvm_nopiodelay", "kvm_mmu", NULL, "kvm_asyncpf", NULL, NULL, NULL,
77 77
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
78 78
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
79 79
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
b/target-i386/kvm.c
162 162
#ifdef KVM_CAP_PV_MMU
163 163
        { KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP },
164 164
#endif
165
#ifdef KVM_CAP_ASYNC_PF
166
        { KVM_CAP_ASYNC_PF, KVM_FEATURE_ASYNC_PF },
167
#endif
165 168
        { -1, -1 }
166 169
};
167 170

  
......
838 841
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_SYSTEM_TIME,
839 842
                          env->system_time_msr);
840 843
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr);
844
#ifdef KVM_CAP_ASYNC_PF
845
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_ASYNC_PF_EN, env->async_pf_en_msr);
846
#endif
841 847
    }
842 848
#ifdef KVM_CAP_MCE
843 849
    if (env->mcg_cap) {
......
1064 1070
#endif
1065 1071
    msrs[n++].index = MSR_KVM_SYSTEM_TIME;
1066 1072
    msrs[n++].index = MSR_KVM_WALL_CLOCK;
1073
#ifdef KVM_CAP_ASYNC_PF
1074
    msrs[n++].index = MSR_KVM_ASYNC_PF_EN;
1075
#endif
1067 1076

  
1068 1077
#ifdef KVM_CAP_MCE
1069 1078
    if (env->mcg_cap) {
......
1135 1144
            }
1136 1145
#endif
1137 1146
            break;
1147
#ifdef KVM_CAP_ASYNC_PF
1148
        case MSR_KVM_ASYNC_PF_EN:
1149
            env->async_pf_en_msr = msrs[i].data;
1150
            break;
1151
#endif
1138 1152
        }
1139 1153
    }
1140 1154

  
b/target-i386/machine.c
373 373
    return 0;
374 374
}
375 375

  
376
static bool async_pf_msr_needed(void *opaque)
377
{
378
    CPUState *cpu = opaque;
379

  
380
    return cpu->async_pf_en_msr != 0;
381
}
382

  
383
static const VMStateDescription vmstate_async_pf_msr = {
384
    .name = "cpu/async_pf_msr",
385
    .version_id = 1,
386
    .minimum_version_id = 1,
387
    .minimum_version_id_old = 1,
388
    .fields      = (VMStateField []) {
389
        VMSTATE_UINT64(async_pf_en_msr, CPUState),
390
        VMSTATE_END_OF_LIST()
391
    }
392
};
393

  
376 394
static const VMStateDescription vmstate_cpu = {
377 395
    .name = "cpu",
378 396
    .version_id = CPU_SAVE_VERSION,
......
475 493
        VMSTATE_YMMH_REGS_VARS(ymmh_regs, CPUState, CPU_NB_REGS, 12),
476 494
        VMSTATE_END_OF_LIST()
477 495
        /* The above list is not sorted /wrt version numbers, watch out! */
496
    },
497
    .subsections = (VMStateSubsection []) {
498
        {
499
            .vmsd = &vmstate_async_pf_msr,
500
            .needed = async_pf_msr_needed,
501
        } , {
502
            /* empty */
503
        }
478 504
    }
479 505
};
480 506

  

Also available in: Unified diff