KVM: PPC: Book3S_64 PR: Access shadow slb in big endian
authorAlexander Graf <agraf@suse.de>
Thu, 24 Apr 2014 10:57:11 +0000 (12:57 +0200)
committerAlexander Graf <agraf@suse.de>
Fri, 30 May 2014 12:26:19 +0000 (14:26 +0200)
The "shadow SLB" in the PACA is shared with the hypervisor, so it has to
be big endian. We access the shadow SLB during world switch, so let's make
sure we access it in big endian even when we're on a little endian host.

Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/kvm/book3s_64_slb.S

index 4f12e8f0c7187b3bf2887e4db6af39da36ce44d2..596140e5c889aaa2b4d36b13ccced5bd8d7f40c7 100644 (file)
  * Authors: Alexander Graf <agraf@suse.de>
  */
 
-#ifdef __LITTLE_ENDIAN__
-#error Need to fix SLB shadow accesses in little endian mode
-#endif
-
 #define SHADOW_SLB_ESID(num)   (SLBSHADOW_SAVEAREA + (num * 0x10))
 #define SHADOW_SLB_VSID(num)   (SLBSHADOW_SAVEAREA + (num * 0x10) + 0x8)
 #define UNBOLT_SLB_ENTRY(num) \
-       ld      r9, SHADOW_SLB_ESID(num)(r12); \
-       /* Invalid? Skip. */; \
-       rldicl. r0, r9, 37, 63; \
-       beq     slb_entry_skip_ ## num; \
-       xoris   r9, r9, SLB_ESID_V@h; \
-       std     r9, SHADOW_SLB_ESID(num)(r12); \
+       li      r11, SHADOW_SLB_ESID(num);      \
+       LDX_BE  r9, r12, r11;                   \
+       /* Invalid? Skip. */;                   \
+       rldicl. r0, r9, 37, 63;                 \
+       beq     slb_entry_skip_ ## num;         \
+       xoris   r9, r9, SLB_ESID_V@h;           \
+       STDX_BE r9, r12, r11;                   \
   slb_entry_skip_ ## num:
 
 #define REBOLT_SLB_ENTRY(num) \
-       ld      r10, SHADOW_SLB_ESID(num)(r11); \
-       cmpdi   r10, 0; \
-       beq     slb_exit_skip_ ## num; \
-       oris    r10, r10, SLB_ESID_V@h; \
-       ld      r9, SHADOW_SLB_VSID(num)(r11); \
-       slbmte  r9, r10; \
-       std     r10, SHADOW_SLB_ESID(num)(r11); \
+       li      r8, SHADOW_SLB_ESID(num);       \
+       li      r7, SHADOW_SLB_VSID(num);       \
+       LDX_BE  r10, r11, r8;                   \
+       cmpdi   r10, 0;                         \
+       beq     slb_exit_skip_ ## num;          \
+       oris    r10, r10, SLB_ESID_V@h;         \
+       LDX_BE  r9, r11, r7;                    \
+       slbmte  r9, r10;                        \
+       STDX_BE r10, r11, r8;                   \
 slb_exit_skip_ ## num:
 
 /******************************************************************************