diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/kvm/kvm.h | 1 | ||||
| -rw-r--r-- | drivers/kvm/kvm_main.c | 4 | ||||
| -rw-r--r-- | drivers/kvm/mmu.c | 43 | ||||
| -rw-r--r-- | drivers/kvm/svm.c | 1 | ||||
| -rw-r--r-- | drivers/kvm/vmx.c | 13 |
5 files changed, 0 insertions, 62 deletions
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index 1d0be85651f5..6e4daf404146 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h | |||
| @@ -158,7 +158,6 @@ struct kvm_vcpu; | |||
| 158 | struct kvm_mmu { | 158 | struct kvm_mmu { |
| 159 | void (*new_cr3)(struct kvm_vcpu *vcpu); | 159 | void (*new_cr3)(struct kvm_vcpu *vcpu); |
| 160 | int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err); | 160 | int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err); |
| 161 | void (*inval_page)(struct kvm_vcpu *vcpu, gva_t gva); | ||
| 162 | void (*free)(struct kvm_vcpu *vcpu); | 161 | void (*free)(struct kvm_vcpu *vcpu); |
| 163 | gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva); | 162 | gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva); |
| 164 | hpa_t root_hpa; | 163 | hpa_t root_hpa; |
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 79032438dd16..cec10106ce77 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
| @@ -943,10 +943,6 @@ static unsigned long get_segment_base(struct kvm_vcpu *vcpu, int seg) | |||
| 943 | 943 | ||
| 944 | int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address) | 944 | int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address) |
| 945 | { | 945 | { |
| 946 | spin_lock(&vcpu->kvm->lock); | ||
| 947 | vcpu->mmu.inval_page(vcpu, address); | ||
| 948 | spin_unlock(&vcpu->kvm->lock); | ||
| 949 | kvm_arch_ops->invlpg(vcpu, address); | ||
| 950 | return X86EMUL_CONTINUE; | 946 | return X86EMUL_CONTINUE; |
| 951 | } | 947 | } |
| 952 | 948 | ||
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index e4a20a45d834..b7b05c44399d 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
| @@ -767,10 +767,6 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, | |||
| 767 | return nonpaging_map(vcpu, addr & PAGE_MASK, paddr); | 767 | return nonpaging_map(vcpu, addr & PAGE_MASK, paddr); |
| 768 | } | 768 | } |
| 769 | 769 | ||
| 770 | static void nonpaging_inval_page(struct kvm_vcpu *vcpu, gva_t addr) | ||
| 771 | { | ||
| 772 | } | ||
| 773 | |||
| 774 | static void nonpaging_free(struct kvm_vcpu *vcpu) | 770 | static void nonpaging_free(struct kvm_vcpu *vcpu) |
| 775 | { | 771 | { |
| 776 | mmu_free_roots(vcpu); | 772 | mmu_free_roots(vcpu); |
| @@ -782,7 +778,6 @@ static int nonpaging_init_context(struct kvm_vcpu *vcpu) | |||
| 782 | 778 | ||
| 783 | context->new_cr3 = nonpaging_new_cr3; | 779 | context->new_cr3 = nonpaging_new_cr3; |
| 784 | context->page_fault = nonpaging_page_fault; | 780 | context->page_fault = nonpaging_page_fault; |
| 785 | context->inval_page = nonpaging_inval_page; | ||
| 786 | context->gva_to_gpa = nonpaging_gva_to_gpa; | 781 | context->gva_to_gpa = nonpaging_gva_to_gpa; |
| 787 | context->free = nonpaging_free; | 782 | context->free = nonpaging_free; |
| 788 | context->root_level = 0; | 783 | context->root_level = 0; |
| @@ -895,42 +890,6 @@ static int may_access(u64 pte, int write, int user) | |||
| 895 | return 1; | 890 | return 1; |
| 896 | } | 891 | } |
| 897 | 892 | ||
| 898 | /* | ||
| 899 | * Remove a shadow pte. | ||
| 900 | */ | ||
| 901 | static void paging_inval_page(struct kvm_vcpu *vcpu, gva_t addr) | ||
| 902 | { | ||
| 903 | hpa_t page_addr = vcpu->mmu.root_hpa; | ||
| 904 | int level = vcpu->mmu.shadow_root_level; | ||
| 905 | |||
| 906 | ++kvm_stat.invlpg; | ||
| 907 | |||
| 908 | for (; ; level--) { | ||
| 909 | u32 index = PT64_INDEX(addr, level); | ||
| 910 | u64 *table = __va(page_addr); | ||
| 911 | |||
| 912 | if (level == PT_PAGE_TABLE_LEVEL ) { | ||
| 913 | rmap_remove(vcpu->kvm, &table[index]); | ||
| 914 | table[index] = 0; | ||
| 915 | return; | ||
| 916 | } | ||
| 917 | |||
| 918 | if (!is_present_pte(table[index])) | ||
| 919 | return; | ||
| 920 | |||
| 921 | page_addr = table[index] & PT64_BASE_ADDR_MASK; | ||
| 922 | |||
| 923 | if (level == PT_DIRECTORY_LEVEL && | ||
| 924 | (table[index] & PT_SHADOW_PS_MARK)) { | ||
| 925 | table[index] = 0; | ||
| 926 | release_pt_page_64(vcpu, page_addr, PT_PAGE_TABLE_LEVEL); | ||
| 927 | |||
| 928 | kvm_arch_ops->tlb_flush(vcpu); | ||
| 929 | return; | ||
| 930 | } | ||
| 931 | } | ||
| 932 | } | ||
| 933 | |||
| 934 | static void paging_free(struct kvm_vcpu *vcpu) | 893 | static void paging_free(struct kvm_vcpu *vcpu) |
| 935 | { | 894 | { |
| 936 | nonpaging_free(vcpu); | 895 | nonpaging_free(vcpu); |
| @@ -951,7 +910,6 @@ static int paging64_init_context_common(struct kvm_vcpu *vcpu, int level) | |||
| 951 | ASSERT(is_pae(vcpu)); | 910 | ASSERT(is_pae(vcpu)); |
| 952 | context->new_cr3 = paging_new_cr3; | 911 | context->new_cr3 = paging_new_cr3; |
| 953 | context->page_fault = paging64_page_fault; | 912 | context->page_fault = paging64_page_fault; |
| 954 | context->inval_page = paging_inval_page; | ||
| 955 | context->gva_to_gpa = paging64_gva_to_gpa; | 913 | context->gva_to_gpa = paging64_gva_to_gpa; |
| 956 | context->free = paging_free; | 914 | context->free = paging_free; |
| 957 | context->root_level = level; | 915 | context->root_level = level; |
| @@ -974,7 +932,6 @@ static int paging32_init_context(struct kvm_vcpu *vcpu) | |||
| 974 | 932 | ||
| 975 | context->new_cr3 = paging_new_cr3; | 933 | context->new_cr3 = paging_new_cr3; |
| 976 | context->page_fault = paging32_page_fault; | 934 | context->page_fault = paging32_page_fault; |
| 977 | context->inval_page = paging_inval_page; | ||
| 978 | context->gva_to_gpa = paging32_gva_to_gpa; | 935 | context->gva_to_gpa = paging32_gva_to_gpa; |
| 979 | context->free = paging_free; | 936 | context->free = paging_free; |
| 980 | context->root_level = PT32_ROOT_LEVEL; | 937 | context->root_level = PT32_ROOT_LEVEL; |
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index 869b524dda6b..99250011a471 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c | |||
| @@ -497,7 +497,6 @@ static void init_vmcb(struct vmcb *vmcb) | |||
| 497 | /* (1ULL << INTERCEPT_SELECTIVE_CR0) | */ | 497 | /* (1ULL << INTERCEPT_SELECTIVE_CR0) | */ |
| 498 | (1ULL << INTERCEPT_CPUID) | | 498 | (1ULL << INTERCEPT_CPUID) | |
| 499 | (1ULL << INTERCEPT_HLT) | | 499 | (1ULL << INTERCEPT_HLT) | |
| 500 | (1ULL << INTERCEPT_INVLPG) | | ||
| 501 | (1ULL << INTERCEPT_INVLPGA) | | 500 | (1ULL << INTERCEPT_INVLPGA) | |
| 502 | (1ULL << INTERCEPT_IOIO_PROT) | | 501 | (1ULL << INTERCEPT_IOIO_PROT) | |
| 503 | (1ULL << INTERCEPT_MSR_PROT) | | 502 | (1ULL << INTERCEPT_MSR_PROT) | |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 2a1c37eed711..59178ad4d344 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
| @@ -1059,7 +1059,6 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) | |||
| 1059 | | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ | 1059 | | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ |
| 1060 | | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ | 1060 | | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ |
| 1061 | | CPU_BASED_UNCOND_IO_EXITING /* 20.6.2 */ | 1061 | | CPU_BASED_UNCOND_IO_EXITING /* 20.6.2 */ |
| 1062 | | CPU_BASED_INVDPG_EXITING | ||
| 1063 | | CPU_BASED_MOV_DR_EXITING | 1062 | | CPU_BASED_MOV_DR_EXITING |
| 1064 | | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ | 1063 | | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ |
| 1065 | ); | 1064 | ); |
| @@ -1438,17 +1437,6 @@ static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 1438 | return 0; | 1437 | return 0; |
| 1439 | } | 1438 | } |
| 1440 | 1439 | ||
| 1441 | static int handle_invlpg(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
| 1442 | { | ||
| 1443 | u64 address = vmcs_read64(EXIT_QUALIFICATION); | ||
| 1444 | int instruction_length = vmcs_read32(VM_EXIT_INSTRUCTION_LEN); | ||
| 1445 | spin_lock(&vcpu->kvm->lock); | ||
| 1446 | vcpu->mmu.inval_page(vcpu, address); | ||
| 1447 | spin_unlock(&vcpu->kvm->lock); | ||
| 1448 | vmcs_writel(GUEST_RIP, vmcs_readl(GUEST_RIP) + instruction_length); | ||
| 1449 | return 1; | ||
| 1450 | } | ||
| 1451 | |||
| 1452 | static int handle_cr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 1440 | static int handle_cr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
| 1453 | { | 1441 | { |
| 1454 | u64 exit_qualification; | 1442 | u64 exit_qualification; |
| @@ -1636,7 +1624,6 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
| 1636 | [EXIT_REASON_EXCEPTION_NMI] = handle_exception, | 1624 | [EXIT_REASON_EXCEPTION_NMI] = handle_exception, |
| 1637 | [EXIT_REASON_EXTERNAL_INTERRUPT] = handle_external_interrupt, | 1625 | [EXIT_REASON_EXTERNAL_INTERRUPT] = handle_external_interrupt, |
| 1638 | [EXIT_REASON_IO_INSTRUCTION] = handle_io, | 1626 | [EXIT_REASON_IO_INSTRUCTION] = handle_io, |
| 1639 | [EXIT_REASON_INVLPG] = handle_invlpg, | ||
| 1640 | [EXIT_REASON_CR_ACCESS] = handle_cr, | 1627 | [EXIT_REASON_CR_ACCESS] = handle_cr, |
| 1641 | [EXIT_REASON_DR_ACCESS] = handle_dr, | 1628 | [EXIT_REASON_DR_ACCESS] = handle_dr, |
| 1642 | [EXIT_REASON_CPUID] = handle_cpuid, | 1629 | [EXIT_REASON_CPUID] = handle_cpuid, |
