aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2009-06-15 09:21:24 -0400
committerAvi Kivity <avi@redhat.com>2009-09-10 01:32:58 -0400
commitff092385e8285c03d8b148f42f46f98c5f4becd5 (patch)
treeb011de50b5802e20b7b0d39385b29e999f1b3023 /arch
parent3c5d0a44b011e0a1d857452f05c698e1008b4b4a (diff)
KVM: SVM: Implement INVLPGA
SVM adds another way to do INVLPG by ASID which Hyper-V makes use of, so let's implement it! For now we just do the same thing invlpg does, as asid switching means we flush the mmu anyways. That might change one day though. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/svm.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 146c17d406ed..be699795d70f 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1880,6 +1880,19 @@ static int clgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
1880 return 1; 1880 return 1;
1881} 1881}
1882 1882
1883static int invlpga_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
1884{
1885 struct kvm_vcpu *vcpu = &svm->vcpu;
1886 nsvm_printk("INVLPGA\n");
1887
1888 /* Let's treat INVLPGA the same as INVLPG (can be optimized!) */
1889 kvm_mmu_invlpg(vcpu, vcpu->arch.regs[VCPU_REGS_RAX]);
1890
1891 svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
1892 skip_emulated_instruction(&svm->vcpu);
1893 return 1;
1894}
1895
1883static int invalid_op_interception(struct vcpu_svm *svm, 1896static int invalid_op_interception(struct vcpu_svm *svm,
1884 struct kvm_run *kvm_run) 1897 struct kvm_run *kvm_run)
1885{ 1898{
@@ -2227,7 +2240,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
2227 [SVM_EXIT_INVD] = emulate_on_interception, 2240 [SVM_EXIT_INVD] = emulate_on_interception,
2228 [SVM_EXIT_HLT] = halt_interception, 2241 [SVM_EXIT_HLT] = halt_interception,
2229 [SVM_EXIT_INVLPG] = invlpg_interception, 2242 [SVM_EXIT_INVLPG] = invlpg_interception,
2230 [SVM_EXIT_INVLPGA] = invalid_op_interception, 2243 [SVM_EXIT_INVLPGA] = invlpga_interception,
2231 [SVM_EXIT_IOIO] = io_interception, 2244 [SVM_EXIT_IOIO] = io_interception,
2232 [SVM_EXIT_MSR] = msr_interception, 2245 [SVM_EXIT_MSR] = msr_interception,
2233 [SVM_EXIT_TASK_SWITCH] = task_switch_interception, 2246 [SVM_EXIT_TASK_SWITCH] = task_switch_interception,