mirror of https://gitee.com/openkylin/linux.git
KVM: PPC: Book3S_32: PR: Access HTAB in big endian
The HTAB is always big endian. We access the guest's HTAB using copy_from/to_user, but don't yet take care of the fact that we might be running on an LE host. Wrap all accesses to the guest HTAB with big endian accessors. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
740f834eb2
commit
860540bc50
|
@ -208,6 +208,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
u32 sre;
|
||||
hva_t ptegp;
|
||||
u32 pteg[16];
|
||||
u32 pte0, pte1;
|
||||
u32 ptem = 0;
|
||||
int i;
|
||||
int found = 0;
|
||||
|
@ -233,11 +234,13 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
}
|
||||
|
||||
for (i=0; i<16; i+=2) {
|
||||
if (ptem == pteg[i]) {
|
||||
pte0 = be32_to_cpu(pteg[i]);
|
||||
pte1 = be32_to_cpu(pteg[i + 1]);
|
||||
if (ptem == pte0) {
|
||||
u8 pp;
|
||||
|
||||
pte->raddr = (pteg[i+1] & ~(0xFFFULL)) | (eaddr & 0xFFF);
|
||||
pp = pteg[i+1] & 3;
|
||||
pte->raddr = (pte1 & ~(0xFFFULL)) | (eaddr & 0xFFF);
|
||||
pp = pte1 & 3;
|
||||
|
||||
if ((sr_kp(sre) && (vcpu->arch.shared->msr & MSR_PR)) ||
|
||||
(sr_ks(sre) && !(vcpu->arch.shared->msr & MSR_PR)))
|
||||
|
@ -260,7 +263,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
}
|
||||
|
||||
dprintk_pte("MMU: Found PTE -> %x %x - %x\n",
|
||||
pteg[i], pteg[i+1], pp);
|
||||
pte0, pte1, pp);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -269,7 +272,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
/* Update PTE C and A bits, so the guest's swapper knows we used the
|
||||
page */
|
||||
if (found) {
|
||||
u32 pte_r = pteg[i+1];
|
||||
u32 pte_r = pte1;
|
||||
char __user *addr = (char __user *) (ptegp + (i+1) * sizeof(u32));
|
||||
|
||||
/*
|
||||
|
@ -296,7 +299,8 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|||
to_book3s(vcpu)->sdr1, ptegp);
|
||||
for (i=0; i<16; i+=2) {
|
||||
dprintk_pte(" %02d: 0x%x - 0x%x (0x%x)\n",
|
||||
i, pteg[i], pteg[i+1], ptem);
|
||||
i, be32_to_cpu(pteg[i]),
|
||||
be32_to_cpu(pteg[i+1]), ptem);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue