Skip to content

Commit fce1243

Browse files
vittyvkSomasundaram Krishnasamy
authored andcommitted
KVM: x86: take as_id into account when checking PGD
OVMF booted guest running on shadow pages crashes on TRIPLE FAULT after enabling paging from SMM. The crash is triggered from mmu_check_root() and is caused by kvm_is_visible_gfn() searching through memslots with as_id = 0 while vCPU may be in a different context (address space). Introduce kvm_vcpu_is_visible_gfn() and use it from mmu_check_root(). Signed-off-by: Vitaly Kuznetsov <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> (cherry picked from commit 995decb) Orabug: 31722725 Conflicts: arch/x86/kvm/mmu/mmu.c (file split out later from arch/x86/kvm/mmu.c) Signed-off-by: Maciej S. Szmigiero <[email protected]> Reviewed-by: Mihai Carabas <[email protected]> Signed-off-by: Somasundaram Krishnasamy <[email protected]>
1 parent 7037590 commit fce1243

File tree

3 files changed

+10
-1
lines changed

3 files changed

+10
-1
lines changed

arch/x86/kvm/mmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3710,7 +3710,7 @@ static int mmu_check_root(struct kvm_vcpu *vcpu, gfn_t root_gfn)
37103710
{
37113711
int ret = 0;
37123712

3713-
if (!kvm_is_visible_gfn(vcpu->kvm, root_gfn)) {
3713+
if (!kvm_vcpu_is_visible_gfn(vcpu, root_gfn)) {
37143714
kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
37153715
ret = 1;
37163716
}

include/linux/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
734734
int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
735735
struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
736736
bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
737+
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
737738
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
738739
void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
739740

virt/kvm/kvm_main.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,14 @@ bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
13821382
}
13831383
EXPORT_SYMBOL_GPL(kvm_is_visible_gfn);
13841384

1385+
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn)
1386+
{
1387+
struct kvm_memory_slot *memslot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
1388+
1389+
return kvm_is_visible_memslot(memslot);
1390+
}
1391+
EXPORT_SYMBOL_GPL(kvm_vcpu_is_visible_gfn);
1392+
13851393
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn)
13861394
{
13871395
struct vm_area_struct *vma;

0 commit comments

Comments
 (0)