diff options
Diffstat (limited to 'arch/powerpc/lib/sstep.c')
| -rw-r--r-- | arch/powerpc/lib/sstep.c | 29 | 
1 files changed, 16 insertions, 13 deletions
| diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index fb9f58b868e7..f208f560aecd 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);  		: "r" (addr), "i" (-EFAULT), "0" (err))  static nokprobe_inline void set_cr0(const struct pt_regs *regs, -				    struct instruction_op *op, int rd) +				    struct instruction_op *op)  { -	long val = regs->gpr[rd]; +	long val = op->val;  	op->type |= SETCC;  	op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); @@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,  	case 13:	/* addic. */  		imm = (short) instr;  		add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); -		set_cr0(regs, op, rd); +		set_cr0(regs, op);  		return 1;  	case 14:	/* addi */ @@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,  	case 28:	/* andi. */  		op->val = regs->gpr[rd] & (unsigned short) instr; -		set_cr0(regs, op, ra); +		set_cr0(regs, op);  		goto logical_done_nocc;  	case 29:	/* andis. */  		imm = (unsigned short) instr;  		op->val = regs->gpr[rd] & (imm << 16); -		set_cr0(regs, op, ra); +		set_cr0(regs, op);  		goto logical_done_nocc;  #ifdef __powerpc64__ @@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,  			op->type = COMPUTE + SETCC;  			imm = 0xf0000000UL;  			val = regs->gpr[rd]; -			op->val = regs->ccr; +			op->ccval = regs->ccr;  			for (sh = 0; sh < 8; ++sh) {  				if (instr & (0x80000 >> sh)) -					op->val = (op->val & ~imm) | +					op->ccval = (op->ccval & ~imm) |  						(val & imm);  				imm >>= 4;  			} @@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,  			goto arith_done;  		case 235:	/* mullw */ -			op->val = (unsigned int) regs->gpr[ra] * -				(unsigned int) regs->gpr[rb]; +			op->val = (long)(int) regs->gpr[ra] * +				(int) regs->gpr[rb]; +  			goto arith_done;  		case 266:	/* add */ @@ -1683,11 +1684,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,   * Logical instructions   */  		case 26:	/* cntlzw */ -			op->val = __builtin_clz((unsigned int) regs->gpr[rd]); +			val = (unsigned int) regs->gpr[rd]; +			op->val = ( val ? __builtin_clz(val) : 32 );  			goto logical_done;  #ifdef __powerpc64__  		case 58:	/* cntlzd */ -			op->val = __builtin_clzl(regs->gpr[rd]); +			val = regs->gpr[rd]; +			op->val = ( val ? __builtin_clzl(val) : 64 );  			goto logical_done;  #endif  		case 28:	/* and */ @@ -2526,7 +2529,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,   logical_done:  	if (instr & 1) -		set_cr0(regs, op, ra); +		set_cr0(regs, op);   logical_done_nocc:  	op->reg = ra;  	op->type |= SETREG; @@ -2534,7 +2537,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,   arith_done:  	if (instr & 1) -		set_cr0(regs, op, rd); +		set_cr0(regs, op);   compute_done:  	op->reg = rd;  	op->type |= SETREG; |