Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e509af9 authored by Alexander Graf's avatar Alexander Graf
Browse files

KVM: PPC: Book3S_64 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: default avatarAlexander Graf <agraf@suse.de>
parent 860540bc
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -275,12 +275,15 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
		key = 4;

	for (i=0; i<16; i+=2) {
		u64 pte0 = be64_to_cpu(pteg[i]);
		u64 pte1 = be64_to_cpu(pteg[i + 1]);

		/* Check all relevant fields of 1st dword */
		if ((pteg[i] & v_mask) == v_val) {
		if ((pte0 & v_mask) == v_val) {
			/* If large page bit is set, check pgsize encoding */
			if (slbe->large &&
			    (vcpu->arch.hflags & BOOK3S_HFLAG_MULTI_PGSIZE)) {
				pgsize = decode_pagesize(slbe, pteg[i+1]);
				pgsize = decode_pagesize(slbe, pte1);
				if (pgsize < 0)
					continue;
			}
@@ -297,8 +300,8 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
		goto do_second;
	}

	v = pteg[i];
	r = pteg[i+1];
	v = be64_to_cpu(pteg[i]);
	r = be64_to_cpu(pteg[i+1]);
	pp = (r & HPTE_R_PP) | key;
	if (r & HPTE_R_PP0)
		pp |= 8;