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