mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
KVM: x86/mmu: pass PFERR_GUEST_PAGE/FINAL_MASK to kvm_translate_gpa
The XS/XU bit for EPT are only applied to final accesses, and use the U bit from the page walk itself. While strictly speaking not necessary (any value of PFERR_USER_MASK would be the same for page table accesses, because they're reads and writes only), it is clearer and less hackish to only apply MBEC to PFERR_GUEST_FINAL_MASK. Allow kvm-intel.ko to distinguish the two cases. Tested-by: David Riley <d.riley@proxmox.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a8827c1961
commit
bd1c40114b
|
|
@ -2041,7 +2041,8 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
|
|||
* read with kvm_read_guest().
|
||||
*/
|
||||
if (!hc->fast && is_guest_mode(vcpu)) {
|
||||
hc->ingpa = translate_nested_gpa(vcpu, hc->ingpa, 0, NULL);
|
||||
hc->ingpa = translate_nested_gpa(vcpu, hc->ingpa,
|
||||
PFERR_GUEST_FINAL_MASK, NULL);
|
||||
if (unlikely(hc->ingpa == INVALID_GPA))
|
||||
return HV_STATUS_INVALID_HYPERCALL_INPUT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4348,7 +4348,8 @@ static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
|||
{
|
||||
if (exception)
|
||||
exception->error_code = 0;
|
||||
return kvm_translate_gpa(vcpu, mmu, vaddr, access, exception);
|
||||
return kvm_translate_gpa(vcpu, mmu, vaddr, access | PFERR_GUEST_FINAL_MASK,
|
||||
exception);
|
||||
}
|
||||
|
||||
static bool mmio_info_in_cache(struct kvm_vcpu *vcpu, u64 addr, bool direct)
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
|
|||
walker->pte_gpa[walker->level - 1] = pte_gpa;
|
||||
|
||||
real_gpa = kvm_translate_gpa(vcpu, mmu, gfn_to_gpa(table_gfn),
|
||||
nested_access, &walker->fault);
|
||||
nested_access | PFERR_GUEST_PAGE_MASK,
|
||||
&walker->fault);
|
||||
|
||||
/*
|
||||
* FIXME: This can happen if emulation (for of an INS/OUTS
|
||||
|
|
@ -444,7 +445,9 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
|
|||
gfn += pse36_gfn_delta(pte);
|
||||
#endif
|
||||
|
||||
real_gpa = kvm_translate_gpa(vcpu, mmu, gfn_to_gpa(gfn), access, &walker->fault);
|
||||
real_gpa = kvm_translate_gpa(vcpu, mmu, gfn_to_gpa(gfn),
|
||||
access | PFERR_GUEST_FINAL_MASK,
|
||||
&walker->fault);
|
||||
if (real_gpa == INVALID_GPA)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -1072,7 +1072,8 @@ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3)
|
|||
* to an L1 GPA.
|
||||
*/
|
||||
real_gpa = kvm_translate_gpa(vcpu, mmu, gfn_to_gpa(pdpt_gfn),
|
||||
PFERR_USER_MASK | PFERR_WRITE_MASK, NULL);
|
||||
PFERR_USER_MASK | PFERR_WRITE_MASK |
|
||||
PFERR_GUEST_PAGE_MASK, NULL);
|
||||
if (real_gpa == INVALID_GPA)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user