Skip to content

Commit 995decb

Browse files
vittyvkbonzini
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]>
1 parent 5668821 commit 995decb

File tree

3 files changed

+10
-1
lines changed

3 files changed

+10
-1
lines changed

arch/x86/kvm/mmu/mmu.c

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

3696-
if (!kvm_is_visible_gfn(vcpu->kvm, root_gfn)) {
3696+
if (!kvm_vcpu_is_visible_gfn(vcpu, root_gfn)) {
36973697
kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
36983698
ret = 1;
36993699
}

include/linux/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
774774
int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
775775
struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
776776
bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
777+
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn);
777778
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn);
778779
void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
779780

virt/kvm/kvm_main.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,14 @@ bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
16261626
}
16271627
EXPORT_SYMBOL_GPL(kvm_is_visible_gfn);
16281628

1629+
bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn)
1630+
{
1631+
struct kvm_memory_slot *memslot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
1632+
1633+
return kvm_is_visible_memslot(memslot);
1634+
}
1635+
EXPORT_SYMBOL_GPL(kvm_vcpu_is_visible_gfn);
1636+
16291637
unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn)
16301638
{
16311639
struct vm_area_struct *vma;

0 commit comments

Comments
 (0)