From: Paul Mackerras Date: Wed, 30 Aug 2017 04:12:30 +0000 (+1000) Subject: powerpc: Don't update CR0 in emulation of popcnt, prty, bpermd instructions X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=5762e08344bd7c5bfc41030f74c4ab6ce6e461d0;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git powerpc: Don't update CR0 in emulation of popcnt, prty, bpermd instructions The architecture shows the least-significant bit of the instruction word as reserved for the popcnt[bwd], prty[wd] and bpermd instructions, that is, these instructions never update CR0. Therefore this changes the emulation of these instructions to skip the CR0 update. Signed-off-by: Paul Mackerras Signed-off-by: Michael Ellerman --- diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 00dae7b7e785..10eabd9a255d 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -1469,7 +1469,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 122: /* popcntb */ do_popcnt(regs, op, regs->gpr[rd], 8); - goto logical_done; + goto logical_done_nocc; case 124: /* nor */ op->val = ~(regs->gpr[rd] | regs->gpr[rb]); @@ -1477,15 +1477,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 154: /* prtyw */ do_prty(regs, op, regs->gpr[rd], 32); - goto logical_done; + goto logical_done_nocc; case 186: /* prtyd */ do_prty(regs, op, regs->gpr[rd], 64); - goto logical_done; + goto logical_done_nocc; #ifdef CONFIG_PPC64 case 252: /* bpermd */ do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); - goto logical_done; + goto logical_done_nocc; #endif case 284: /* xor */ op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); @@ -1497,7 +1497,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 378: /* popcntw */ do_popcnt(regs, op, regs->gpr[rd], 32); - goto logical_done; + goto logical_done_nocc; case 412: /* orc */ op->val = regs->gpr[rd] | ~regs->gpr[rb]; @@ -1513,7 +1513,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, #ifdef CONFIG_PPC64 case 506: /* popcntd */ do_popcnt(regs, op, regs->gpr[rd], 64); - goto logical_done; + goto logical_done_nocc; #endif case 922: /* extsh */ op->val = (signed short) regs->gpr[rd];