Add an identifier for use by targets with BP_CPU. For all targets the index of the hardware breakpoint resource is to hand.
Signed-off-by: Richard Henderson <[email protected]> --- include/exec/breakpoint.h | 3 ++- accel/tcg/tcg-accel-ops.c | 2 +- cpu-common.c | 3 ++- gdbstub/user.c | 2 +- linux-user/main.c | 2 +- target/arm/tcg/debug.c | 2 +- target/i386/tcg/system/bpt_helper.c | 2 +- target/ppc/cpu.c | 2 +- target/riscv/debug.c | 5 +++-- target/xtensa/dbg_helper.c | 4 ++-- 10 files changed, 15 insertions(+), 12 deletions(-) diff --git a/include/exec/breakpoint.h b/include/exec/breakpoint.h index f1186b909f..588ff13fe1 100644 --- a/include/exec/breakpoint.h +++ b/include/exec/breakpoint.h @@ -31,6 +31,7 @@ typedef uint32_t BreakpointFlags; struct CPUBreakpoint { vaddr pc; BreakpointFlags flags; + unsigned id; QTAILQ_ENTRY(CPUBreakpoint) entry; }; @@ -44,7 +45,7 @@ struct CPUWatchpoint { }; int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, BreakpointFlags flags, - CPUBreakpoint **breakpoint); + unsigned id, CPUBreakpoint **breakpoint); int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, BreakpointFlags flags); void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint); void cpu_breakpoint_remove_all(CPUState *cpu, BreakpointFlags mask); diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c index 76af8d67c0..88d0c093eb 100644 --- a/accel/tcg/tcg-accel-ops.c +++ b/accel/tcg/tcg-accel-ops.c @@ -137,7 +137,7 @@ static int tcg_insert_gdbstub_breakpoint(CPUState *cs, GdbBreakpointType type, case GDB_BREAKPOINT_SW: case GDB_BREAKPOINT_HW: CPU_FOREACH(cpu) { - err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); + err = cpu_breakpoint_insert(cpu, addr, BP_GDB, 0, NULL); if (err) { break; } diff --git a/cpu-common.c b/cpu-common.c index af64bb1126..9476bb612a 100644 --- a/cpu-common.c +++ b/cpu-common.c @@ -406,7 +406,7 @@ bool cpu_breakpoint_test(CPUState *cpu, vaddr pc, BreakpointFlags mask) /* Add a breakpoint. */ int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, BreakpointFlags flags, - CPUBreakpoint **breakpoint) + unsigned id, CPUBreakpoint **breakpoint) { CPUBreakpoint *bp; @@ -418,6 +418,7 @@ int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, BreakpointFlags flags, bp->pc = pc; bp->flags = flags; + bp->id = id; /* keep all GDB-injected breakpoints in front */ if (flags & BP_GDB) { diff --git a/gdbstub/user.c b/gdbstub/user.c index 0a61bd7d92..ed0e88d169 100644 --- a/gdbstub/user.c +++ b/gdbstub/user.c @@ -801,7 +801,7 @@ int gdb_breakpoint_insert(CPUState *cs, GdbBreakpointType type, case GDB_BREAKPOINT_SW: case GDB_BREAKPOINT_HW: CPU_FOREACH(cpu) { - err = cpu_breakpoint_insert(cpu, addr, BP_GDB, NULL); + err = cpu_breakpoint_insert(cpu, addr, BP_GDB, 0, NULL); if (err) { break; } diff --git a/linux-user/main.c b/linux-user/main.c index c08c73fd80..83b9c88ac4 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -260,7 +260,7 @@ CPUArchState *cpu_copy(CPUArchState *env) BP_CPU break/watchpoints are handled correctly on clone. */ QTAILQ_INIT(&new_cpu->breakpoints); QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) { - cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL); + cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, 0, NULL); } return new_env; diff --git a/target/arm/tcg/debug.c b/target/arm/tcg/debug.c index f245d5b072..73d694ca4f 100644 --- a/target/arm/tcg/debug.c +++ b/target/arm/tcg/debug.c @@ -726,7 +726,7 @@ void hw_breakpoint_update(ARMCPU *cpu, int n) return; } - cpu_breakpoint_insert(CPU(cpu), addr, flags, &env->cpu_breakpoint[n]); + cpu_breakpoint_insert(CPU(cpu), addr, flags, n, &env->cpu_breakpoint[n]); } void hw_breakpoint_update_all(ARMCPU *cpu) diff --git a/target/i386/tcg/system/bpt_helper.c b/target/i386/tcg/system/bpt_helper.c index 0ba2f01016..d847d77d71 100644 --- a/target/i386/tcg/system/bpt_helper.c +++ b/target/i386/tcg/system/bpt_helper.c @@ -62,7 +62,7 @@ static int hw_breakpoint_insert(CPUX86State *env, int index) switch (hw_breakpoint_type(dr7, index)) { case DR7_TYPE_BP_INST: if (hw_breakpoint_enabled(dr7, index)) { - err = cpu_breakpoint_insert(cs, drN, BP_CPU, + err = cpu_breakpoint_insert(cs, drN, BP_CPU, index, &env->cpu_breakpoint[index]); } break; diff --git a/target/ppc/cpu.c b/target/ppc/cpu.c index 7ff352b11b..020c8126b3 100644 --- a/target/ppc/cpu.c +++ b/target/ppc/cpu.c @@ -121,7 +121,7 @@ void ppc_update_ciabr(CPUPPCState *env) } if (priv) { - cpu_breakpoint_insert(cs, ciea, BP_CPU, &env->ciabr_breakpoint); + cpu_breakpoint_insert(cs, ciea, BP_CPU, 0, &env->ciabr_breakpoint); } } diff --git a/target/riscv/debug.c b/target/riscv/debug.c index 67c09b1a53..bf9accf6e8 100644 --- a/target/riscv/debug.c +++ b/target/riscv/debug.c @@ -488,7 +488,7 @@ static void type2_breakpoint_insert(CPURISCVState *env, target_ulong index) } if (ctrl & TYPE2_EXEC) { - cpu_breakpoint_insert(cs, addr, flags, &env->cpu_breakpoint[index]); + cpu_breakpoint_insert(cs, addr, flags, 0, &env->cpu_breakpoint[index]); } if (ctrl & TYPE2_LOAD) { @@ -613,7 +613,8 @@ static void type6_breakpoint_insert(CPURISCVState *env, target_ulong index) } if (ctrl & TYPE6_EXEC) { - cpu_breakpoint_insert(cs, addr, flags, &env->cpu_breakpoint[index]); + cpu_breakpoint_insert(cs, addr, flags, index, + &env->cpu_breakpoint[index]); } if (ctrl & TYPE6_LOAD) { diff --git a/target/xtensa/dbg_helper.c b/target/xtensa/dbg_helper.c index e180096b42..4cf147bbfb 100644 --- a/target/xtensa/dbg_helper.c +++ b/target/xtensa/dbg_helper.c @@ -43,7 +43,7 @@ void HELPER(wsr_ibreakenable)(CPUXtensaState *env, uint32_t v) if (change & (1 << i)) { if (v & (1 << i)) { cpu_breakpoint_insert(cs, env->sregs[IBREAKA + i], - BP_CPU, &env->cpu_breakpoint[i]); + BP_CPU, i, &env->cpu_breakpoint[i]); } else { cpu_breakpoint_remove_by_ref(cs, env->cpu_breakpoint[i]); env->cpu_breakpoint[i] = NULL; @@ -59,7 +59,7 @@ void HELPER(wsr_ibreaka)(CPUXtensaState *env, uint32_t i, uint32_t v) CPUState *cs = env_cpu(env); cpu_breakpoint_remove_by_ref(cs, env->cpu_breakpoint[i]); - cpu_breakpoint_insert(cs, v, BP_CPU, &env->cpu_breakpoint[i]); + cpu_breakpoint_insert(cs, v, BP_CPU, i, &env->cpu_breakpoint[i]); } env->sregs[IBREAKA + i] = v; } -- 2.43.0
