Commit c9c831ae authored by Jordan Niethe's avatar Jordan Niethe Committed by Michael Ellerman
Browse files

powerpc/xmon: Don't allow breakpoints on suffixes



Do not allow placing xmon breakpoints on the suffix of a prefix
instruction.

Signed-off-by: default avatarJordan Niethe <jniethe5@gmail.com>
[mpe: Don't split printf strings across lines]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200506034050.24806-27-jniethe5@gmail.com
parent 785b79d1
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -889,8 +889,8 @@ static struct bpt *new_breakpoint(unsigned long a)
static void insert_bpts(void)
{
	int i;
	struct ppc_inst instr;
	struct bpt *bp;
	struct ppc_inst instr, instr2;
	struct bpt *bp, *bp2;

	bp = bpts;
	for (i = 0; i < NBPTS; ++i, ++bp) {
@@ -908,6 +908,29 @@ static void insert_bpts(void)
			bp->enabled = 0;
			continue;
		}
		/*
		 * Check the address is not a suffix by looking for a prefix in
		 * front of it.
		 */
		if (mread_instr(bp->address - 4, &instr2) == 8) {
			printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
			       bp->address);
			bp->enabled = 0;
			continue;
		}
		/*
		 * We might still be a suffix - if the prefix has already been
		 * replaced by a breakpoint we won't catch it with the above
		 * test.
		 */
		bp2 = at_breakpoint(bp->address - 4);
		if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
			printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
			       bp->address);
			bp->enabled = 0;
			continue;
		}

		patch_instruction(bp->instr, instr);
		patch_instruction((void *)bp->instr + ppc_inst_len(instr),
				  ppc_inst(bpinstr));