[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-6.2 13/23] target/mips: Fix single stepping
From: |
Richard Henderson |
Subject: |
[PATCH for-6.2 13/23] target/mips: Fix single stepping |
Date: |
Tue, 20 Jul 2021 20:41:45 -1000 |
As per an ancient comment in mips_tr_translate_insn about the
expectations of gdb, when restarting the insn in a delay slot
we also re-execute the branch. Which means that we are
expected to execute two insns in this case.
This has been broken since 8b86d6d2580, where we forced max_insns
to 1 while single-stepping. This resulted in an exit from the
translator loop after the branch but before the delay slot is
translated.
Increase the max_insns to 2 for this case. In addition, bypass
the end-of-page check, for when the branch itself ends the page.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/mips/tcg/translate.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
index 5b03545f09..4d1e08cfb1 100644
--- a/target/mips/tcg/translate.c
+++ b/target/mips/tcg/translate.c
@@ -16162,6 +16162,16 @@ static void
mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
ctx->default_tcg_memop_mask = (ctx->insn_flags & (ISA_MIPS_R6 |
INSN_LOONGSON3A)) ? MO_UNALN : MO_ALIGN;
+ /*
+ * Execute a branch and its delay slot as a single instruction.
+ * This is what GDB expects and is consistent with what the
+ * hardware does (e.g. if a delay slot instruction faults, the
+ * reported PC is the PC of the branch).
+ */
+ if (ctx->base.singlestep_enabled && (ctx->hflags & MIPS_HFLAG_BMASK)) {
+ ctx->base.max_insns = 2;
+ }
+
LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
ctx->hflags);
}
@@ -16231,17 +16241,14 @@ static void mips_tr_translate_insn(DisasContextBase
*dcbase, CPUState *cs)
if (ctx->base.is_jmp != DISAS_NEXT) {
return;
}
+
/*
- * Execute a branch and its delay slot as a single instruction.
- * This is what GDB expects and is consistent with what the
- * hardware does (e.g. if a delay slot instruction faults, the
- * reported PC is the PC of the branch).
+ * End the TB on (most) page crossings.
+ * See mips_tr_init_disas_context about single-stepping a branch
+ * together with its delay slot.
*/
- if (ctx->base.singlestep_enabled &&
- (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
- ctx->base.is_jmp = DISAS_TOO_MANY;
- }
- if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
+ if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE
+ && !ctx->base.singlestep_enabled) {
ctx->base.is_jmp = DISAS_TOO_MANY;
}
}
--
2.25.1
- [PATCH for-6.2 00/23] tcg: gdb singlestep reorg, Richard Henderson, 2021/07/21
- [PATCH for-6.2 01/23] accel/tcg: Handle gdb singlestep in cpu_tb_exec, Richard Henderson, 2021/07/21
- [PATCH for-6.2 02/23] target/alpha: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 03/23] target/avr: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 04/23] target/cris: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 06/23] target/arm: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 07/23] target/hppa: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 08/23] target/i386: Check CF_NO_GOTO_TB for dc->jmp_opt, Richard Henderson, 2021/07/21
- [PATCH for-6.2 13/23] target/mips: Fix single stepping,
Richard Henderson <=
- [PATCH for-6.2 14/23] target/mips: Drop exit checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 15/23] target/openrisc: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 05/23] target/hexagon: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 09/23] target/i386: Drop check for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 10/23] target/m68k: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 11/23] target/microblaze: Check CF_NO_GOTO_TB for DISAS_JUMP, Richard Henderson, 2021/07/21
- [PATCH for-6.2 12/23] target/microblaze: Drop checks for singlestep_enabled, Richard Henderson, 2021/07/21
- [PATCH for-6.2 16/23] target/ppc: Drop exit checks for singlestep_enabled, Richard Henderson, 2021/07/21