Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: powerpc: pseries/dtl.c should include asm/firmware.h powerpc: Fix data-corrupting bug in __futex_atomic_op powerpc/pseries: Set error_state to pci_channel_io_normal in eeh_report_reset() powerpc: Allow 256kB pages with SHMEM powerpc: Document new FSL I2C bindings and cleanup powerpc/mm: Fix compile warning powerpc/85xx: TQM8548: update defconfig powerpc/85xx: TQM8548: use proper phy-handles for enet2 and enet3 powerpc/85xx: TQM85xx: correct address of LM75 I2C device nodes powerpc: Add support for early tlbilx opcode powerpc: Fix tlbilx opcode
This commit is contained in:
@@ -27,7 +27,7 @@
|
||||
PPC_LONG "1b,4b,2b,4b\n" \
|
||||
".previous" \
|
||||
: "=&r" (oldval), "=&r" (ret) \
|
||||
: "b" (uaddr), "i" (-EFAULT), "1" (oparg) \
|
||||
: "b" (uaddr), "i" (-EFAULT), "r" (oparg) \
|
||||
: "cr0", "memory")
|
||||
|
||||
static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
|
||||
@@ -47,19 +47,19 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
|
||||
|
||||
switch (op) {
|
||||
case FUTEX_OP_SET:
|
||||
__futex_atomic_op("", ret, oldval, uaddr, oparg);
|
||||
__futex_atomic_op("mr %1,%4\n", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_ADD:
|
||||
__futex_atomic_op("add %1,%0,%1\n", ret, oldval, uaddr, oparg);
|
||||
__futex_atomic_op("add %1,%0,%4\n", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_OR:
|
||||
__futex_atomic_op("or %1,%0,%1\n", ret, oldval, uaddr, oparg);
|
||||
__futex_atomic_op("or %1,%0,%4\n", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_ANDN:
|
||||
__futex_atomic_op("andc %1,%0,%1\n", ret, oldval, uaddr, oparg);
|
||||
__futex_atomic_op("andc %1,%0,%4\n", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_XOR:
|
||||
__futex_atomic_op("xor %1,%0,%1\n", ret, oldval, uaddr, oparg);
|
||||
__futex_atomic_op("xor %1,%0,%4\n", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
default:
|
||||
ret = -ENOSYS;
|
||||
|
||||
@@ -52,6 +52,12 @@
|
||||
*/
|
||||
#define MMU_FTR_NEED_DTLB_SW_LRU ASM_CONST(0x00200000)
|
||||
|
||||
/* This indicates that the processor uses the wrong opcode for tlbilx
|
||||
* instructions. During the ISA 2.06 development the opcode for tlbilx
|
||||
* changed and some early implementations used to old opcode
|
||||
*/
|
||||
#define MMU_FTR_TLBILX_EARLY_OPCODE ASM_CONST(0x00400000)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/cputable.h>
|
||||
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
|
||||
#define PPC_INST_STSWI 0x7c0005aa
|
||||
#define PPC_INST_STSWX 0x7c00052a
|
||||
#define PPC_INST_TLBILX 0x7c000626
|
||||
#define PPC_INST_TLBILX 0x7c000024
|
||||
#define PPC_INST_TLBILX_EARLY 0x7c000626
|
||||
#define PPC_INST_WAIT 0x7c00007c
|
||||
|
||||
/* macros to insert fields into opcodes */
|
||||
@@ -63,10 +64,18 @@
|
||||
#define PPC_RFDI stringify_in_c(.long PPC_INST_RFDI)
|
||||
#define PPC_RFMCI stringify_in_c(.long PPC_INST_RFMCI)
|
||||
#define PPC_TLBILX(t, a, b) stringify_in_c(.long PPC_INST_TLBILX | \
|
||||
__PPC_T_TLB(t) | __PPC_RA(a) | __PPC_RB(b))
|
||||
__PPC_T_TLB(t) | \
|
||||
__PPC_RA(a) | __PPC_RB(b))
|
||||
#define PPC_TLBILX_ALL(a, b) PPC_TLBILX(0, a, b)
|
||||
#define PPC_TLBILX_PID(a, b) PPC_TLBILX(1, a, b)
|
||||
#define PPC_TLBILX_VA(a, b) PPC_TLBILX(3, a, b)
|
||||
|
||||
#define PPC_TLBILX_EARLY(t, a, b) stringify_in_c(.long PPC_INST_TLBILX_EARLY | \
|
||||
__PPC_T_TLB(t) | \
|
||||
__PPC_RA(a) | __PPC_RB(b))
|
||||
#define PPC_TLBILX_ALL_EARLY(a, b) PPC_TLBILX_EARLY(0, a, b)
|
||||
#define PPC_TLBILX_PID_EARLY(a, b) PPC_TLBILX_EARLY(1, a, b)
|
||||
#define PPC_TLBILX_VA_EARLY(a, b) PPC_TLBILX_EARLY(3, a, b)
|
||||
#define PPC_WAIT(w) stringify_in_c(.long PPC_INST_WAIT | \
|
||||
__PPC_WC(w))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user