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 <ag...@suse.de>
---
 arch/powerpc/kvm/book3s_64_mmu.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
index e9854e7..158fb22 100644
--- a/arch/powerpc/kvm/book3s_64_mmu.c
+++ b/arch/powerpc/kvm/book3s_64_mmu.c
@@ -281,12 +281,15 @@ do_second:
                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;
                        }
@@ -303,8 +306,8 @@ do_second:
                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;
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to