mirror of https://gitee.com/openkylin/linux.git
KVM: PPC: Book3S PR: Preserve storage control bits
PR KVM page fault handler performs eaddr to pte translation for a guest, however kvmppc_mmu_book3s_64_xlate() does not preserve WIMG bits (storage control) in the kvmppc_pte struct. If PR KVM is running as a second level guest under HV KVM, and PR KVM tries inserting HPT entry, this fails in HV KVM if it already has this mapping. This preserves WIMG bits between kvmppc_mmu_book3s_64_xlate() and kvmppc_mmu_map_page(). Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
parent
bd9166ffe6
commit
96df226769
|
@ -342,6 +342,7 @@ struct kvmppc_pte {
|
|||
bool may_read : 1;
|
||||
bool may_write : 1;
|
||||
bool may_execute : 1;
|
||||
unsigned long wimg;
|
||||
u8 page_size; /* MMU_PAGE_xxx */
|
||||
};
|
||||
|
||||
|
|
|
@ -319,6 +319,7 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
gpte->may_execute = true;
|
||||
gpte->may_read = false;
|
||||
gpte->may_write = false;
|
||||
gpte->wimg = r & HPTE_R_WIMG;
|
||||
|
||||
switch (pp) {
|
||||
case 0:
|
||||
|
|
|
@ -145,6 +145,8 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
|
|||
else
|
||||
kvmppc_mmu_flush_icache(pfn);
|
||||
|
||||
rflags = (rflags & ~HPTE_R_WIMG) | orig_pte->wimg;
|
||||
|
||||
/*
|
||||
* Use 64K pages if possible; otherwise, on 64K page kernels,
|
||||
* we need to transfer 4 more bits from guest real to host real addr.
|
||||
|
|
|
@ -537,7 +537,7 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|||
int r = RESUME_GUEST;
|
||||
int relocated;
|
||||
int page_found = 0;
|
||||
struct kvmppc_pte pte;
|
||||
struct kvmppc_pte pte = { 0 };
|
||||
bool dr = (kvmppc_get_msr(vcpu) & MSR_DR) ? true : false;
|
||||
bool ir = (kvmppc_get_msr(vcpu) & MSR_IR) ? true : false;
|
||||
u64 vsid;
|
||||
|
|
Loading…
Reference in New Issue