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.
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
Mads Ynddal <mads@ynddal.dk> writes: > 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. > > Tested-by: Daniel Gomez <da.gomez@samsung.com> > Signed-off-by: Mads Ynddal <m.ynddal@samsung.com> Looks reasonable to me: Reviewed-by: Alex Bennée <alex.bennee@linaro.org> -- Alex Bennée Virtualisation Tech Lead @ Linaro
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
>
>
© 2016 - 2025 Red Hat, Inc.