Message ID | 20250402135229.28143-2-mads@ynddal.dk (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Fix GDB support for macOS hvf | expand |
On Wed, Apr 02, 2025 at 03:52:28PM +0100, Mads Ynddal wrote: > From: Mads Ynddal <m.ynddal@samsung.com> > > hvf_arch_set_traps is already called from a context of a specific > CPUState, so we don't need to do a nested CPU_FOREACH. > > It also results in an error from hv_vcpu_set_sys_reg, as it may only be > called from the thread owning the vCPU. > Reported-by: Daniel Gomez <da.gomez@samsung.com> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2895 > Tested-by: Daniel Gomez <da.gomez@samsung.com> > Signed-off-by: Mads Ynddal <m.ynddal@samsung.com> > --- > target/arm/hvf/hvf.c | 27 +++++++++++---------------- > 1 file changed, 11 insertions(+), 16 deletions(-) > > diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c > index 2439af63a0..48e4b12725 100644 > --- a/target/arm/hvf/hvf.c > +++ b/target/arm/hvf/hvf.c > @@ -2277,28 +2277,23 @@ static inline bool hvf_arm_hw_debug_active(CPUState *cpu) > return ((cur_hw_wps > 0) || (cur_hw_bps > 0)); > } > > -static void hvf_arch_set_traps(void) > +static void hvf_arch_set_traps(CPUState *cpu) > { > - CPUState *cpu; > bool should_enable_traps = false; > hv_return_t r = HV_SUCCESS; > > /* Check whether guest debugging is enabled for at least one vCPU; if it > * is, enable exiting the guest on all vCPUs */ > - CPU_FOREACH(cpu) { > - should_enable_traps |= cpu->accel->guest_debug_enabled; > - } > - CPU_FOREACH(cpu) { > - /* Set whether debug exceptions exit the guest */ > - r = hv_vcpu_set_trap_debug_exceptions(cpu->accel->fd, > - should_enable_traps); > - assert_hvf_ok(r); > + should_enable_traps |= cpu->accel->guest_debug_enabled; > + /* Set whether debug exceptions exit the guest */ > + r = hv_vcpu_set_trap_debug_exceptions(cpu->accel->fd, > + should_enable_traps); > + assert_hvf_ok(r); > > - /* Set whether accesses to debug registers exit the guest */ > - r = hv_vcpu_set_trap_debug_reg_accesses(cpu->accel->fd, > - should_enable_traps); > - assert_hvf_ok(r); > - } > + /* Set whether accesses to debug registers exit the guest */ > + r = hv_vcpu_set_trap_debug_reg_accesses(cpu->accel->fd, > + should_enable_traps); > + assert_hvf_ok(r); > } > > void hvf_arch_update_guest_debug(CPUState *cpu) > @@ -2339,7 +2334,7 @@ void hvf_arch_update_guest_debug(CPUState *cpu) > deposit64(env->cp15.mdscr_el1, MDSCR_EL1_MDE_SHIFT, 1, 0); > } > > - hvf_arch_set_traps(); > + hvf_arch_set_traps(cpu); > } > > bool hvf_arch_supports_guest_debug(void) > -- > 2.48.1 > >
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 2439af63a0..48e4b12725 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -2277,28 +2277,23 @@ static inline bool hvf_arm_hw_debug_active(CPUState *cpu) return ((cur_hw_wps > 0) || (cur_hw_bps > 0)); } -static void hvf_arch_set_traps(void) +static void hvf_arch_set_traps(CPUState *cpu) { - CPUState *cpu; bool should_enable_traps = false; hv_return_t r = HV_SUCCESS; /* Check whether guest debugging is enabled for at least one vCPU; if it * is, enable exiting the guest on all vCPUs */ - CPU_FOREACH(cpu) { - should_enable_traps |= cpu->accel->guest_debug_enabled; - } - CPU_FOREACH(cpu) { - /* Set whether debug exceptions exit the guest */ - r = hv_vcpu_set_trap_debug_exceptions(cpu->accel->fd, - should_enable_traps); - assert_hvf_ok(r); + should_enable_traps |= cpu->accel->guest_debug_enabled; + /* Set whether debug exceptions exit the guest */ + r = hv_vcpu_set_trap_debug_exceptions(cpu->accel->fd, + should_enable_traps); + assert_hvf_ok(r); - /* Set whether accesses to debug registers exit the guest */ - r = hv_vcpu_set_trap_debug_reg_accesses(cpu->accel->fd, - should_enable_traps); - assert_hvf_ok(r); - } + /* Set whether accesses to debug registers exit the guest */ + r = hv_vcpu_set_trap_debug_reg_accesses(cpu->accel->fd, + should_enable_traps); + assert_hvf_ok(r); } void hvf_arch_update_guest_debug(CPUState *cpu) @@ -2339,7 +2334,7 @@ void hvf_arch_update_guest_debug(CPUState *cpu) deposit64(env->cp15.mdscr_el1, MDSCR_EL1_MDE_SHIFT, 1, 0); } - hvf_arch_set_traps(); + hvf_arch_set_traps(cpu); } bool hvf_arch_supports_guest_debug(void)