Merge tag 'powerpc-5.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[linux-2.6-microblaze.git] / arch / powerpc / lib / sstep.c
index bd3734d..6f79bde 100644 (file)
@@ -75,10 +75,8 @@ extern int do_stqcx(unsigned long ea, unsigned long val0, unsigned long val1,
 static nokprobe_inline unsigned long truncate_if_32bit(unsigned long msr,
                                                        unsigned long val)
 {
-#ifdef __powerpc64__
        if ((msr & MSR_64BIT) == 0)
                val &= 0xffffffffUL;
-#endif
        return val;
 }
 
@@ -112,9 +110,9 @@ static nokprobe_inline long address_ok(struct pt_regs *regs,
 {
        if (!user_mode(regs))
                return 1;
-       if (__access_ok(ea, nb))
+       if (access_ok((void __user *)ea, nb))
                return 1;
-       if (__access_ok(ea, 1))
+       if (access_ok((void __user *)ea, 1))
                /* Access overlaps the end of the user region */
                regs->dar = TASK_SIZE_MAX - 1;
        else
@@ -1065,15 +1063,9 @@ Efault:
 int emulate_dcbz(unsigned long ea, struct pt_regs *regs)
 {
        int err;
-       unsigned long size;
+       unsigned long size = l1_dcache_bytes();
 
-#ifdef __powerpc64__
-       size = ppc64_caches.l1d.block_size;
-       if (!(regs->msr & MSR_64BIT))
-               ea &= 0xffffffffUL;
-#else
-       size = L1_CACHE_BYTES;
-#endif
+       ea = truncate_if_32bit(regs->msr, ea);
        ea &= ~(size - 1);
        if (!address_ok(regs, ea, size))
                return -EFAULT;
@@ -1097,7 +1089,10 @@ NOKPROBE_SYMBOL(emulate_dcbz);
 
 #define __put_user_asmx(x, addr, err, op, cr)          \
        __asm__ __volatile__(                           \
+               ".machine push\n"                       \
+               ".machine power8\n"                     \
                "1:     " op " %2,0,%3\n"               \
+               ".machine pop\n"                        \
                "       mfcr    %1\n"                   \
                "2:\n"                                  \
                ".section .fixup,\"ax\"\n"              \
@@ -1110,7 +1105,10 @@ NOKPROBE_SYMBOL(emulate_dcbz);
 
 #define __get_user_asmx(x, addr, err, op)              \
        __asm__ __volatile__(                           \
+               ".machine push\n"                       \
+               ".machine power8\n"                     \
                "1:     "op" %1,0,%2\n"                 \
+               ".machine pop\n"                        \
                "2:\n"                                  \
                ".section .fixup,\"ax\"\n"              \
                "3:     li      %0,%3\n"                \
@@ -1139,10 +1137,8 @@ static nokprobe_inline void set_cr0(const struct pt_regs *regs,
 
        op->type |= SETCC;
        op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
-#ifdef __powerpc64__
        if (!(regs->msr & MSR_64BIT))
                val = (int) val;
-#endif
        if (val < 0)
                op->ccval |= 0x80000000;
        else if (val > 0)
@@ -1173,12 +1169,8 @@ static nokprobe_inline void add_with_carry(const struct pt_regs *regs,
        op->type = COMPUTE + SETREG + SETXER;
        op->reg = rd;
        op->val = val;
-#ifdef __powerpc64__
-       if (!(regs->msr & MSR_64BIT)) {
-               val = (unsigned int) val;
-               val1 = (unsigned int) val1;
-       }
-#endif
+       val = truncate_if_32bit(regs->msr, val);
+       val1 = truncate_if_32bit(regs->msr, val1);
        op->xerval = regs->xer;
        if (val < val1 || (carry_in && val == val1))
                op->xerval |= XER_CA;
@@ -3389,7 +3381,7 @@ int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op)
                        __put_user_asmx(op->val, ea, err, "stbcx.", cr);
                        break;
                case 2:
-                       __put_user_asmx(op->val, ea, err, "stbcx.", cr);
+                       __put_user_asmx(op->val, ea, err, "sthcx.", cr);
                        break;
 #endif
                case 4: