Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02c0f62a authored by Matt Brown's avatar Matt Brown Committed by Michael Ellerman
Browse files

powerpc/lib/sstep: Add cmpb instruction emulation



This patch adds emulation of the cmpb instruction, enabling xmon to
emulate this instruction.
Tested for correctness against the cmpb asm instruction on ppc64le.

Signed-off-by: default avatarMatt Brown <matthew.brown.dev@gmail.com>
Reviewed-by: default avatarCyril Bur <cyrilbur@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 93fc5ca9
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -596,6 +596,22 @@ static nokprobe_inline void do_cmp_unsigned(struct pt_regs *regs, unsigned long
	regs->ccr = (regs->ccr & ~(0xf << shift)) | (crval << shift);
}

static nokprobe_inline void do_cmpb(struct pt_regs *regs, unsigned long v1,
				unsigned long v2, int rd)
{
	unsigned long long out_val, mask;
	int i;

	out_val = 0;
	for (i = 0; i < 8; i++) {
		mask = 0xffUL << (i * 8);
		if ((v1 & mask) == (v2 & mask))
			out_val |= mask;
	}

	regs->gpr[rd] = out_val;
}

static nokprobe_inline int trap_compare(long v1, long v2)
{
	int ret = 0;
@@ -1064,6 +1080,10 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs,
			do_cmp_unsigned(regs, val, val2, rd >> 2);
			goto instr_done;

		case 508: /* cmpb */
			do_cmpb(regs, regs->gpr[rd], regs->gpr[rb], ra);
			goto instr_done;

/*
 * Arithmetic instructions
 */