diff options
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r-- | arch/x86/kvm/vmx.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index c00f03de1b79..b1eb202ee76a 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -3619,6 +3619,7 @@ static void seg_setup(int seg) | |||
3619 | 3619 | ||
3620 | static int alloc_apic_access_page(struct kvm *kvm) | 3620 | static int alloc_apic_access_page(struct kvm *kvm) |
3621 | { | 3621 | { |
3622 | struct page *page; | ||
3622 | struct kvm_userspace_memory_region kvm_userspace_mem; | 3623 | struct kvm_userspace_memory_region kvm_userspace_mem; |
3623 | int r = 0; | 3624 | int r = 0; |
3624 | 3625 | ||
@@ -3633,7 +3634,13 @@ static int alloc_apic_access_page(struct kvm *kvm) | |||
3633 | if (r) | 3634 | if (r) |
3634 | goto out; | 3635 | goto out; |
3635 | 3636 | ||
3636 | kvm->arch.apic_access_page = gfn_to_page(kvm, 0xfee00); | 3637 | page = gfn_to_page(kvm, 0xfee00); |
3638 | if (is_error_page(page)) { | ||
3639 | r = -EFAULT; | ||
3640 | goto out; | ||
3641 | } | ||
3642 | |||
3643 | kvm->arch.apic_access_page = page; | ||
3637 | out: | 3644 | out: |
3638 | mutex_unlock(&kvm->slots_lock); | 3645 | mutex_unlock(&kvm->slots_lock); |
3639 | return r; | 3646 | return r; |
@@ -3641,6 +3648,7 @@ out: | |||
3641 | 3648 | ||
3642 | static int alloc_identity_pagetable(struct kvm *kvm) | 3649 | static int alloc_identity_pagetable(struct kvm *kvm) |
3643 | { | 3650 | { |
3651 | struct page *page; | ||
3644 | struct kvm_userspace_memory_region kvm_userspace_mem; | 3652 | struct kvm_userspace_memory_region kvm_userspace_mem; |
3645 | int r = 0; | 3653 | int r = 0; |
3646 | 3654 | ||
@@ -3656,8 +3664,13 @@ static int alloc_identity_pagetable(struct kvm *kvm) | |||
3656 | if (r) | 3664 | if (r) |
3657 | goto out; | 3665 | goto out; |
3658 | 3666 | ||
3659 | kvm->arch.ept_identity_pagetable = gfn_to_page(kvm, | 3667 | page = gfn_to_page(kvm, kvm->arch.ept_identity_map_addr >> PAGE_SHIFT); |
3660 | kvm->arch.ept_identity_map_addr >> PAGE_SHIFT); | 3668 | if (is_error_page(page)) { |
3669 | r = -EFAULT; | ||
3670 | goto out; | ||
3671 | } | ||
3672 | |||
3673 | kvm->arch.ept_identity_pagetable = page; | ||
3661 | out: | 3674 | out: |
3662 | mutex_unlock(&kvm->slots_lock); | 3675 | mutex_unlock(&kvm->slots_lock); |
3663 | return r; | 3676 | return r; |
@@ -6575,7 +6588,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | |||
6575 | /* Exposing INVPCID only when PCID is exposed */ | 6588 | /* Exposing INVPCID only when PCID is exposed */ |
6576 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); | 6589 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); |
6577 | if (vmx_invpcid_supported() && | 6590 | if (vmx_invpcid_supported() && |
6578 | best && (best->ecx & bit(X86_FEATURE_INVPCID)) && | 6591 | best && (best->ebx & bit(X86_FEATURE_INVPCID)) && |
6579 | guest_cpuid_has_pcid(vcpu)) { | 6592 | guest_cpuid_has_pcid(vcpu)) { |
6580 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; | 6593 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; |
6581 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6594 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, |
@@ -6585,7 +6598,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | |||
6585 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6598 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, |
6586 | exec_control); | 6599 | exec_control); |
6587 | if (best) | 6600 | if (best) |
6588 | best->ecx &= ~bit(X86_FEATURE_INVPCID); | 6601 | best->ebx &= ~bit(X86_FEATURE_INVPCID); |
6589 | } | 6602 | } |
6590 | } | 6603 | } |
6591 | 6604 | ||