Skip to content

Commit

Permalink
powerpc/lib/sstep: Add bpermd instruction emulation
Browse files Browse the repository at this point in the history
This adds emulation for the bpermd instruction.
Tested for correctness against the bpermd instruction 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 dcbd19b commit f312793
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion arch/powerpc/lib/sstep.c
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,24 @@ static nokprobe_inline void do_popcnt(struct pt_regs *regs, unsigned long v1,
regs->gpr[ra] = out; /* popcntd */
}

#ifdef CONFIG_PPC64
static nokprobe_inline void do_bpermd(struct pt_regs *regs, unsigned long v1,
unsigned long v2, int ra)
{
unsigned char perm, idx;
unsigned int i;

perm = 0;
for (i = 0; i < 8; i++) {
idx = (v1 >> (i * 8)) & 0xff;
if (idx < 64)
if (v2 & PPC_BIT(idx))
perm |= 1 << i;
}
regs->gpr[ra] = perm;
}
#endif /* CONFIG_PPC64 */

static nokprobe_inline int trap_compare(long v1, long v2)
{
int ret = 0;
Expand Down Expand Up @@ -1244,7 +1262,11 @@ 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;

#ifdef CONFIG_PPC64
case 252: /* bpermd */
do_bpermd(regs, regs->gpr[rd], regs->gpr[rb], ra);
goto logical_done;
#endif
case 284: /* xor */
regs->gpr[ra] = ~(regs->gpr[rd] ^ regs->gpr[rb]);
goto logical_done;
Expand Down

0 comments on commit f312793

Please sign in to comment.