Skip to content

Commit ff09238

Browse files
agrafavikivity
authored andcommitted
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 <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
1 parent 3c5d0a4 commit ff09238

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

arch/x86/kvm/svm.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1880,6 +1880,19 @@ static int clgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
18801880
return 1;
18811881
}
18821882

1883+
static 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+
18831896
static int invalid_op_interception(struct vcpu_svm *svm,
18841897
struct kvm_run *kvm_run)
18851898
{
@@ -2227,7 +2240,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
22272240
[SVM_EXIT_INVD] = emulate_on_interception,
22282241
[SVM_EXIT_HLT] = halt_interception,
22292242
[SVM_EXIT_INVLPG] = invlpg_interception,
2230-
[SVM_EXIT_INVLPGA] = invalid_op_interception,
2243+
[SVM_EXIT_INVLPGA] = invlpga_interception,
22312244
[SVM_EXIT_IOIO] = io_interception,
22322245
[SVM_EXIT_MSR] = msr_interception,
22332246
[SVM_EXIT_TASK_SWITCH] = task_switch_interception,

0 commit comments

Comments
 (0)