aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index bd254779d1cc..063c07296764 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -783,12 +783,12 @@ EXPORT_SYMBOL_GPL(kvm_get_dr);
783 * kvm-specific. Those are put in the beginning of the list. 783 * kvm-specific. Those are put in the beginning of the list.
784 */ 784 */
785 785
786#define KVM_SAVE_MSRS_BEGIN 7 786#define KVM_SAVE_MSRS_BEGIN 8
787static u32 msrs_to_save[] = { 787static u32 msrs_to_save[] = {
788 MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, 788 MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK,
789 MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW, 789 MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW,
790 HV_X64_MSR_GUEST_OS_ID, HV_X64_MSR_HYPERCALL, 790 HV_X64_MSR_GUEST_OS_ID, HV_X64_MSR_HYPERCALL,
791 HV_X64_MSR_APIC_ASSIST_PAGE, 791 HV_X64_MSR_APIC_ASSIST_PAGE, MSR_KVM_ASYNC_PF_EN,
792 MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP, 792 MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP,
793 MSR_STAR, 793 MSR_STAR,
794#ifdef CONFIG_X86_64 794#ifdef CONFIG_X86_64
@@ -1425,6 +1425,29 @@ static int set_msr_hyperv(struct kvm_vcpu *vcpu, u32 msr, u64 data)
1425 return 0; 1425 return 0;
1426} 1426}
1427 1427
1428static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
1429{
1430 gpa_t gpa = data & ~0x3f;
1431
1432 /* Bits 1:5 are resrved, Should be zero */
1433 if (data & 0x3e)
1434 return 1;
1435
1436 vcpu->arch.apf.msr_val = data;
1437
1438 if (!(data & KVM_ASYNC_PF_ENABLED)) {
1439 kvm_clear_async_pf_completion_queue(vcpu);
1440 kvm_async_pf_hash_reset(vcpu);
1441 return 0;
1442 }
1443
1444 if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa))
1445 return 1;
1446
1447 kvm_async_pf_wakeup_all(vcpu);
1448 return 0;
1449}
1450
1428int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) 1451int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
1429{ 1452{
1430 switch (msr) { 1453 switch (msr) {
@@ -1506,6 +1529,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
1506 } 1529 }
1507 break; 1530 break;
1508 } 1531 }
1532 case MSR_KVM_ASYNC_PF_EN:
1533 if (kvm_pv_enable_async_pf(vcpu, data))
1534 return 1;
1535 break;
1509 case MSR_IA32_MCG_CTL: 1536 case MSR_IA32_MCG_CTL:
1510 case MSR_IA32_MCG_STATUS: 1537 case MSR_IA32_MCG_STATUS:
1511 case MSR_IA32_MC0_CTL ... MSR_IA32_MC0_CTL + 4 * KVM_MAX_MCE_BANKS - 1: 1538 case MSR_IA32_MC0_CTL ... MSR_IA32_MC0_CTL + 4 * KVM_MAX_MCE_BANKS - 1:
@@ -1782,6 +1809,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
1782 case MSR_KVM_SYSTEM_TIME_NEW: 1809 case MSR_KVM_SYSTEM_TIME_NEW:
1783 data = vcpu->arch.time; 1810 data = vcpu->arch.time;
1784 break; 1811 break;
1812 case MSR_KVM_ASYNC_PF_EN:
1813 data = vcpu->arch.apf.msr_val;
1814 break;
1785 case MSR_IA32_P5_MC_ADDR: 1815 case MSR_IA32_P5_MC_ADDR:
1786 case MSR_IA32_P5_MC_TYPE: 1816 case MSR_IA32_P5_MC_TYPE:
1787 case MSR_IA32_MCG_CAP: 1817 case MSR_IA32_MCG_CAP:
@@ -1929,6 +1959,7 @@ int kvm_dev_ioctl_check_extension(long ext)
1929 case KVM_CAP_DEBUGREGS: 1959 case KVM_CAP_DEBUGREGS:
1930 case KVM_CAP_X86_ROBUST_SINGLESTEP: 1960 case KVM_CAP_X86_ROBUST_SINGLESTEP:
1931 case KVM_CAP_XSAVE: 1961 case KVM_CAP_XSAVE:
1962 case KVM_CAP_ASYNC_PF:
1932 r = 1; 1963 r = 1;
1933 break; 1964 break;
1934 case KVM_CAP_COALESCED_MMIO: 1965 case KVM_CAP_COALESCED_MMIO:
@@ -5792,6 +5823,8 @@ free_vcpu:
5792 5823
5793void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) 5824void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
5794{ 5825{
5826 vcpu->arch.apf.msr_val = 0;
5827
5795 vcpu_load(vcpu); 5828 vcpu_load(vcpu);
5796 kvm_mmu_unload(vcpu); 5829 kvm_mmu_unload(vcpu);
5797 vcpu_put(vcpu); 5830 vcpu_put(vcpu);
@@ -5811,6 +5844,7 @@ int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu)
5811 vcpu->arch.dr7 = DR7_FIXED_1; 5844 vcpu->arch.dr7 = DR7_FIXED_1;
5812 5845
5813 kvm_make_request(KVM_REQ_EVENT, vcpu); 5846 kvm_make_request(KVM_REQ_EVENT, vcpu);
5847 vcpu->arch.apf.msr_val = 0;
5814 5848
5815 kvm_clear_async_pf_completion_queue(vcpu); 5849 kvm_clear_async_pf_completion_queue(vcpu);
5816 kvm_async_pf_hash_reset(vcpu); 5850 kvm_async_pf_hash_reset(vcpu);