Skip to content

Commit

Permalink
powerpc/lib/sstep: Add prty instruction emulation
Browse files Browse the repository at this point in the history
This adds emulation for the prtyw and prtyd instructions.
Tested for logical correctness against the prtyw and prtyd instructions
on ppc64le.

Signed-off-by: Matt Brown <matthew.brown.dev@gmail.com>
Reviewed-by: Cyril Bur <cyrilbur@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Matt Brown authored and Michael Ellerman committed Aug 10, 2017
1 parent f312793 commit 2c979c4
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions arch/powerpc/lib/sstep.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,24 @@ static nokprobe_inline void do_bpermd(struct pt_regs *regs, unsigned long v1,
regs->gpr[ra] = perm;
}
#endif /* CONFIG_PPC64 */
/*
* The size parameter adjusts the equivalent prty instruction.
* prtyw = 32, prtyd = 64
*/
static nokprobe_inline void do_prty(struct pt_regs *regs, unsigned long v,
int size, int ra)
{
unsigned long long res = v ^ (v >> 8);

res ^= res >> 16;
if (size == 32) { /* prtyw */
regs->gpr[ra] = res & 0x0000000100000001;
return;
}

res ^= res >> 32;
regs->gpr[ra] = res & 1; /*prtyd */
}

static nokprobe_inline int trap_compare(long v1, long v2)
{
Expand Down Expand Up @@ -1262,6 +1280,14 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs,
case 124: /* nor */
regs->gpr[ra] = ~(regs->gpr[rd] | regs->gpr[rb]);
goto logical_done;

case 154: /* prtyw */
do_prty(regs, regs->gpr[rd], 32, ra);
goto logical_done;

case 186: /* prtyd */
do_prty(regs, regs->gpr[rd], 64, ra);
goto logical_done;
#ifdef CONFIG_PPC64
case 252: /* bpermd */
do_bpermd(regs, regs->gpr[rd], regs->gpr[rb], ra);
Expand Down

0 comments on commit 2c979c4

Please sign in to comment.