diff options
Diffstat (limited to 'arch/powerpc/lib/sstep.c')
| -rw-r--r-- | arch/powerpc/lib/sstep.c | 30 | 
1 files changed, 11 insertions, 19 deletions
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 5ed88fbee0db..6f79bde6d6c2 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -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;  } @@ -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:  | 
