* [PATCH v3 01/59] target/arm/hvf: Release memory allocated by hv_vcpu_config_create()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 02/59] target/arm/hvf: Trace vCPU KICK events Philippe Mathieu-Daudé
` (58 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hv_vcpu_config_create() is documented in <Hypervisor/hv_vcpu_config.h>
as:
/*!
@abstract Creates a vcpu configuration object.
@result A new vcpu configuration object. This should be released with os_release when no longer used.
*/
OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT
hv_vcpu_config_t hv_vcpu_config_create(void);
Release the memory allocated by hv_vcpu_config_create() with
os_release().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 0658a99a2d1..83db1088384 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -150,6 +150,8 @@ void hvf_arm_init_debug(void)
max_hw_wps = hvf_arm_num_wrps(config);
hw_watchpoints =
g_array_sized_new(true, true, sizeof(HWWatchpoint), max_hw_wps);
+
+ os_release(config);
}
#define SYSREG_OP0_SHIFT 20
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 02/59] target/arm/hvf: Trace vCPU KICK events
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 01/59] target/arm/hvf: Release memory allocated by hv_vcpu_config_create() Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 03/59] target/arm/hvf: Check hv_vcpus_exit() returned value Philippe Mathieu-Daudé
` (57 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 1 +
target/arm/hvf/trace-events | 1 +
2 files changed, 2 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 83db1088384..91bbd3a6aae 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -963,6 +963,7 @@ int hvf_arch_init_vcpu(CPUState *cpu)
void hvf_kick_vcpu_thread(CPUState *cpu)
{
+ trace_hvf_kick_vcpu_thread(cpu->cpu_index, cpu->stop);
cpus_kick_thread(cpu);
hv_vcpus_exit(&cpu->accel->fd, 1);
}
diff --git a/target/arm/hvf/trace-events b/target/arm/hvf/trace-events
index b29a995f3d3..538af6e0707 100644
--- a/target/arm/hvf/trace-events
+++ b/target/arm/hvf/trace-events
@@ -12,3 +12,4 @@ hvf_psci_call(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, uint32_t cpuid
hvf_vgic_write(const char *name, uint64_t val) "vgic write to %s [val=0x%016"PRIx64"]"
hvf_vgic_read(const char *name, uint64_t val) "vgic read from %s [val=0x%016"PRIx64"]"
hvf_illegal_guest_state(void) "HV_ILLEGAL_GUEST_STATE"
+hvf_kick_vcpu_thread(unsigned cpuidx, bool stop) "cpu:%u stop:%u"
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 03/59] target/arm/hvf: Check hv_vcpus_exit() returned value
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 01/59] target/arm/hvf: Release memory allocated by hv_vcpu_config_create() Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 02/59] target/arm/hvf: Trace vCPU KICK events Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 04/59] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() " Philippe Mathieu-Daudé
` (56 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé, Alex Bennée
hv_vcpus_exit() returns a hv_return_t enum type (defined
in <Hypervisor/hv_error.h>). Assert we succeeded, as we
are not ready to handle any error path.
Suggested-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 91bbd3a6aae..4c98faebbed 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -963,9 +963,11 @@ int hvf_arch_init_vcpu(CPUState *cpu)
void hvf_kick_vcpu_thread(CPUState *cpu)
{
+ hv_return_t ret;
trace_hvf_kick_vcpu_thread(cpu->cpu_index, cpu->stop);
cpus_kick_thread(cpu);
- hv_vcpus_exit(&cpu->accel->fd, 1);
+ ret = hv_vcpus_exit(&cpu->accel->fd, 1);
+ assert_hvf_ok(ret);
}
static void hvf_raise_exception(CPUState *cpu, uint32_t excp,
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 04/59] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() returned value
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 03/59] target/arm/hvf: Check hv_vcpus_exit() returned value Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 05/59] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec() Philippe Mathieu-Daudé
` (55 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hv_vcpu_set_vtimer_mask() returns a hv_return_t enum type
(defined in <Hypervisor/hv_error.h>). Assert we succeeded,
as we are not ready to handle any error path.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 4c98faebbed..bbe0b24b821 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1782,7 +1782,8 @@ static void hvf_sync_vtimer(CPUState *cpu)
if (!irq_state) {
/* Timer no longer asserting, we can unmask it */
- hv_vcpu_set_vtimer_mask(cpu->accel->fd, false);
+ r = hv_vcpu_set_vtimer_mask(cpu->accel->fd, false);
+ assert_hvf_ok(r);
cpu->accel->vtimer_masked = false;
}
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 05/59] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 04/59] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() " Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 06/59] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers Philippe Mathieu-Daudé
` (54 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hvf_vcpu_exec() is implemented per target, rename it as
hvf_arch_vcpu_exec(), following the per target pattern.
Since it calls hv_vcpu_run(), mention it must be called
on the vCPU.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
include/system/hvf_int.h | 4 +++-
accel/hvf/hvf-accel-ops.c | 2 +-
target/arm/hvf/hvf.c | 2 +-
target/i386/hvf/hvf.c | 2 +-
4 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index a3b06a3e75b..32b32e1d024 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -73,12 +73,14 @@ int hvf_arch_init(void);
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
int hvf_arch_init_vcpu(CPUState *cpu);
void hvf_arch_vcpu_destroy(CPUState *cpu);
-int hvf_vcpu_exec(CPUState *);
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
int hvf_put_registers(CPUState *);
int hvf_get_registers(CPUState *);
void hvf_kick_vcpu_thread(CPUState *cpu);
+/* Must be called by the owning thread */
+int hvf_arch_vcpu_exec(CPUState *);
+
struct hvf_sw_breakpoint {
vaddr pc;
vaddr saved_insn;
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index 8b794c2d418..005e2bd891a 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -194,7 +194,7 @@ static void *hvf_cpu_thread_fn(void *arg)
do {
qemu_process_cpu_events(cpu);
if (cpu_can_run(cpu)) {
- r = hvf_vcpu_exec(cpu);
+ r = hvf_arch_vcpu_exec(cpu);
if (r == EXCP_DEBUG) {
cpu_handle_guest_debug(cpu);
}
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index bbe0b24b821..9111c1d717b 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1788,7 +1788,7 @@ static void hvf_sync_vtimer(CPUState *cpu)
}
}
-int hvf_vcpu_exec(CPUState *cpu)
+int hvf_arch_vcpu_exec(CPUState *cpu)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 33f723a76a7..b2bf59cb483 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -721,7 +721,7 @@ void hvf_simulate_wrmsr(CPUState *cs)
printf("write msr %llx\n", RCX(cs));*/
}
-int hvf_vcpu_exec(CPUState *cpu)
+int hvf_arch_vcpu_exec(CPUState *cpu)
{
X86CPU *x86_cpu = X86_CPU(cpu);
CPUX86State *env = &x86_cpu->env;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 06/59] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 05/59] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec() Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 07/59] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread Philippe Mathieu-Daudé
` (53 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hvf_put_registers() and hvf_get_registers() are implemented per
target, rename them using the 'hvf_arch_' prefix following the
per target pattern.
Since they call hv_vcpu_set_reg() / hv_vcpu_get_reg(), mention
they must be called on the vCPU.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
include/system/hvf_int.h | 6 ++++--
accel/hvf/hvf-accel-ops.c | 2 +-
target/arm/hvf/hvf.c | 8 +++++---
target/i386/hvf/hvf.c | 2 +-
target/i386/hvf/x86hvf.c | 4 ++--
5 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 32b32e1d024..8fce627b08c 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -74,12 +74,14 @@ hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
int hvf_arch_init_vcpu(CPUState *cpu);
void hvf_arch_vcpu_destroy(CPUState *cpu);
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
-int hvf_put_registers(CPUState *);
-int hvf_get_registers(CPUState *);
void hvf_kick_vcpu_thread(CPUState *cpu);
/* Must be called by the owning thread */
int hvf_arch_vcpu_exec(CPUState *);
+/* Must be called by the owning thread */
+int hvf_arch_put_registers(CPUState *);
+/* Must be called by the owning thread */
+int hvf_arch_get_registers(CPUState *);
struct hvf_sw_breakpoint {
vaddr pc;
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index 005e2bd891a..3e5feecd8a7 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -81,7 +81,7 @@ hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size)
static void do_hvf_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
{
if (!cpu->vcpu_dirty) {
- hvf_get_registers(cpu);
+ hvf_arch_get_registers(cpu);
cpu->vcpu_dirty = true;
}
}
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 9111c1d717b..f0a0e5d1a75 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -424,7 +424,7 @@ static const hv_sys_reg_t hvf_sreg_list[] = {
#undef DEF_SYSREG
-int hvf_get_registers(CPUState *cpu)
+int hvf_arch_get_registers(CPUState *cpu)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
@@ -564,7 +564,7 @@ int hvf_get_registers(CPUState *cpu)
return 0;
}
-int hvf_put_registers(CPUState *cpu)
+int hvf_arch_put_registers(CPUState *cpu)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
@@ -692,11 +692,12 @@ int hvf_put_registers(CPUState *cpu)
static void flush_cpu_state(CPUState *cpu)
{
if (cpu->vcpu_dirty) {
- hvf_put_registers(cpu);
+ hvf_arch_put_registers(cpu);
cpu->vcpu_dirty = false;
}
}
+/* Must be called by the owning thread */
static void hvf_set_reg(CPUState *cpu, int rt, uint64_t val)
{
hv_return_t r;
@@ -709,6 +710,7 @@ static void hvf_set_reg(CPUState *cpu, int rt, uint64_t val)
}
}
+/* Must be called by the owning thread */
static uint64_t hvf_get_reg(CPUState *cpu, int rt)
{
uint64_t val = 0;
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index b2bf59cb483..76a58cb0350 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -734,7 +734,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
do {
if (cpu->vcpu_dirty) {
- hvf_put_registers(cpu);
+ hvf_arch_put_registers(cpu);
cpu->vcpu_dirty = false;
}
diff --git a/target/i386/hvf/x86hvf.c b/target/i386/hvf/x86hvf.c
index a502437c303..afcf737759b 100644
--- a/target/i386/hvf/x86hvf.c
+++ b/target/i386/hvf/x86hvf.c
@@ -236,7 +236,7 @@ void hvf_get_msrs(CPUState *cs)
env->tsc = rdtscp() + rvmcs(cs->accel->fd, VMCS_TSC_OFFSET);
}
-int hvf_put_registers(CPUState *cs)
+int hvf_arch_put_registers(CPUState *cs)
{
X86CPU *x86cpu = X86_CPU(cs);
CPUX86State *env = &x86cpu->env;
@@ -280,7 +280,7 @@ int hvf_put_registers(CPUState *cs)
return 0;
}
-int hvf_get_registers(CPUState *cs)
+int hvf_arch_get_registers(CPUState *cs)
{
X86CPU *x86cpu = X86_CPU(cs);
CPUX86State *env = &x86cpu->env;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 07/59] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 06/59] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 08/59] accel/hvf: Mention hvf_arch_init_vcpu() " Philippe Mathieu-Daudé
` (52 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Since flush_cpu_state() calls hvf_arch_put_registers(),
which must run on a vCPU, it also must. Mention it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index f0a0e5d1a75..fdf8df09d4b 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -689,6 +689,7 @@ int hvf_arch_put_registers(CPUState *cpu)
return 0;
}
+/* Must be called by the owning thread */
static void flush_cpu_state(CPUState *cpu)
{
if (cpu->vcpu_dirty) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 08/59] accel/hvf: Mention hvf_arch_init_vcpu() must run on vCPU thread
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (6 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 07/59] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 09/59] target/arm/hvf: Mention hvf_sync_vtimer() " Philippe Mathieu-Daudé
` (51 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hvf_arch_init_vcpu(), along with hvf_put_guest_debug_registers()
and hvf_put_gdbstub_debug_registers(), calls hv_vcpu_set_sys_reg(),
which must run on a vCPU. Mention they also must.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
include/system/hvf_int.h | 3 ++-
target/arm/hvf/hvf.c | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 8fce627b08c..0c335facc3b 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -71,11 +71,12 @@ void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
const char *hvf_return_string(hv_return_t ret);
int hvf_arch_init(void);
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
-int hvf_arch_init_vcpu(CPUState *cpu);
void hvf_arch_vcpu_destroy(CPUState *cpu);
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
void hvf_kick_vcpu_thread(CPUState *cpu);
+/* Must be called by the owning thread */
+int hvf_arch_init_vcpu(CPUState *cpu);
/* Must be called by the owning thread */
int hvf_arch_vcpu_exec(CPUState *);
/* Must be called by the owning thread */
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index fdf8df09d4b..8095cb0805a 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2119,6 +2119,7 @@ void hvf_arch_remove_all_hw_breakpoints(void)
* Update the vCPU with the gdbstub's view of debug registers. This view
* consists of all hardware breakpoints and watchpoints inserted so far while
* debugging the guest.
+ * Must be called by the owning thread.
*/
static void hvf_put_gdbstub_debug_registers(CPUState *cpu)
{
@@ -2157,6 +2158,7 @@ static void hvf_put_gdbstub_debug_registers(CPUState *cpu)
/*
* Update the vCPU with the guest's view of debug registers. This view is kept
* in the environment at all times.
+ * Must be called by the owning thread.
*/
static void hvf_put_guest_debug_registers(CPUState *cpu)
{
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 09/59] target/arm/hvf: Mention hvf_sync_vtimer() must run on vCPU thread
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (7 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 08/59] accel/hvf: Mention hvf_arch_init_vcpu() " Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 10/59] target/arm/hvf: Mention hvf_arch_set_traps() " Philippe Mathieu-Daudé
` (50 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Since hvf_sync_vtimer() calls hv_vcpu_get_sys_reg(),
which must run on a vCPU, it also must. Mention it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 8095cb0805a..bfccf5e9a2a 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1764,6 +1764,7 @@ static void hvf_wfi(CPUState *cpu)
hvf_wait_for_ipi(cpu, &ts);
}
+/* Must be called by the owning thread */
static void hvf_sync_vtimer(CPUState *cpu)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 10/59] target/arm/hvf: Mention hvf_arch_set_traps() must run on vCPU thread
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (8 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 09/59] target/arm/hvf: Mention hvf_sync_vtimer() " Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 11/59] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU Philippe Mathieu-Daudé
` (49 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Since hvf_arch_set_traps() calls hv_vcpu_set_trap_debug_exceptions()
and hv_vcpu_set_trap_debug_reg_accesses(), which must run on a vCPU,
it also must. Mention it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index bfccf5e9a2a..ee04943b0f8 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2192,6 +2192,7 @@ static inline bool hvf_arm_hw_debug_active(CPUState *cpu)
return ((cur_hw_wps > 0) || (cur_hw_bps > 0));
}
+/* Must be called by the owning thread */
static void hvf_arch_set_traps(CPUState *cpu)
{
bool should_enable_traps = false;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 11/59] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (9 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 10/59] target/arm/hvf: Mention hvf_arch_set_traps() " Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 12/59] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread Philippe Mathieu-Daudé
` (48 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Since hvf_arch_update_guest_debug() calls hvf_arch_set_traps()
and hvf_arch_update_guest_debug(), which must run on a vCPU, it
also must. Mention it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
include/system/hvf_int.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 0c335facc3b..241c668795e 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -83,6 +83,8 @@ int hvf_arch_vcpu_exec(CPUState *);
int hvf_arch_put_registers(CPUState *);
/* Must be called by the owning thread */
int hvf_arch_get_registers(CPUState *);
+/* Must be called by the owning thread */
+void hvf_arch_update_guest_debug(CPUState *cpu);
struct hvf_sw_breakpoint {
vaddr pc;
@@ -109,7 +111,6 @@ void hvf_arch_remove_all_hw_breakpoints(void);
* handled by calling down to hvf_arch_update_guest_debug.
*/
int hvf_update_guest_debug(CPUState *cpu);
-void hvf_arch_update_guest_debug(CPUState *cpu);
/*
* Return whether the guest supports debugging.
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 12/59] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (10 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 11/59] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 13/59] accel/hvf: Implement hvf_arch_vcpu_destroy() Philippe Mathieu-Daudé
` (47 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Since hvf_inject_interrupts() calls hv_vcpu_set_pending_interrupt(),
which must run on a vCPU, it also must. Mention it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index ee04943b0f8..0d8ff49ae15 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1664,6 +1664,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
return 1;
}
+/* Must be called by the owning thread */
static int hvf_inject_interrupts(CPUState *cpu)
{
if (cpu_test_interrupt(cpu, CPU_INTERRUPT_FIQ)) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 13/59] accel/hvf: Implement hvf_arch_vcpu_destroy()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (11 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 12/59] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 14/59] target/arm/hvf: Hardcode Apple MIDR Philippe Mathieu-Daudé
` (46 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Call hv_vcpu_destroy() to destroy our vCPU context.
As hv_vcpu_destroy() must be called by the owning thread,
document hvf_arch_vcpu_destroy() also does.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
include/system/hvf_int.h | 3 ++-
target/arm/hvf/hvf.c | 4 ++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 241c668795e..195d64dcf18 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -71,13 +71,14 @@ void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
const char *hvf_return_string(hv_return_t ret);
int hvf_arch_init(void);
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
-void hvf_arch_vcpu_destroy(CPUState *cpu);
hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
void hvf_kick_vcpu_thread(CPUState *cpu);
/* Must be called by the owning thread */
int hvf_arch_init_vcpu(CPUState *cpu);
/* Must be called by the owning thread */
+void hvf_arch_vcpu_destroy(CPUState *cpu);
+/* Must be called by the owning thread */
int hvf_arch_vcpu_exec(CPUState *);
/* Must be called by the owning thread */
int hvf_arch_put_registers(CPUState *);
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 0d8ff49ae15..d13ccf5508c 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -868,6 +868,10 @@ void hvf_arm_set_cpu_features_from_host(ARMCPU *cpu)
void hvf_arch_vcpu_destroy(CPUState *cpu)
{
+ hv_return_t ret;
+
+ ret = hv_vcpu_destroy(cpu->accel->fd);
+ assert_hvf_ok(ret);
}
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range)
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 14/59] target/arm/hvf: Hardcode Apple MIDR
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (12 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 13/59] accel/hvf: Implement hvf_arch_vcpu_destroy() Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
` (45 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Mohamed Mediouni <mohamed@unpredictable.fr>
Hardcode MIDR because Apple deliberately doesn't expose
a divergent MIDR across systems.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index d13ccf5508c..890e9266f93 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -763,6 +763,7 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
hv_vcpu_t fd;
hv_return_t r = HV_SUCCESS;
hv_vcpu_exit_t *exit;
+ uint64_t t;
int i;
ahcf->dtb_compatible = "arm,armv8";
@@ -781,9 +782,19 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
for (i = 0; i < ARRAY_SIZE(regs); i++) {
r |= hv_vcpu_get_sys_reg(fd, regs[i].reg, regs[i].val);
}
- r |= hv_vcpu_get_sys_reg(fd, HV_SYS_REG_MIDR_EL1, &ahcf->midr);
r |= hv_vcpu_destroy(fd);
+ /*
+ * Hardcode MIDR because Apple deliberately doesn't expose a divergent
+ * MIDR across systems.
+ */
+ t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0x61); /* Apple */
+ t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf); /* v7 or later */
+ t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 0);
+ t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0);
+ t = FIELD_DP64(t, MIDR_EL1, REVISION, 0);
+ ahcf->midr = t;
+
clamp_id_aa64mmfr0_parange_to_ipa_size(&host_isar);
/*
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (13 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 14/59] target/arm/hvf: Hardcode Apple MIDR Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 11:16 ` Peter Maydell
2025-10-28 11:33 ` Richard Henderson
2025-10-28 5:41 ` [PATCH v3 16/59] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU Philippe Mathieu-Daudé
` (44 subsequent siblings)
59 siblings, 2 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Use index in the structure, dereference &host_isar.idregs[] once.
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 890e9266f93..dea1cb37d1f 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -743,21 +743,21 @@ static void clamp_id_aa64mmfr0_parange_to_ipa_size(ARMISARegisters *isar)
static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
{
ARMISARegisters host_isar = {};
- const struct isar_regs {
+ static const struct isar_regs {
int reg;
- uint64_t *val;
+ ARMIDRegisterIdx index;
} regs[] = {
- { HV_SYS_REG_ID_AA64PFR0_EL1, &host_isar.idregs[ID_AA64PFR0_EL1_IDX] },
- { HV_SYS_REG_ID_AA64PFR1_EL1, &host_isar.idregs[ID_AA64PFR1_EL1_IDX] },
+ { HV_SYS_REG_ID_AA64PFR0_EL1, ID_AA64PFR0_EL1_IDX },
+ { HV_SYS_REG_ID_AA64PFR1_EL1, ID_AA64PFR1_EL1_IDX },
/* Add ID_AA64PFR2_EL1 here when HVF supports it */
- { HV_SYS_REG_ID_AA64DFR0_EL1, &host_isar.idregs[ID_AA64DFR0_EL1_IDX] },
- { HV_SYS_REG_ID_AA64DFR1_EL1, &host_isar.idregs[ID_AA64DFR1_EL1_IDX] },
- { HV_SYS_REG_ID_AA64ISAR0_EL1, &host_isar.idregs[ID_AA64ISAR0_EL1_IDX] },
- { HV_SYS_REG_ID_AA64ISAR1_EL1, &host_isar.idregs[ID_AA64ISAR1_EL1_IDX] },
+ { HV_SYS_REG_ID_AA64DFR0_EL1, ID_AA64DFR0_EL1_IDX },
+ { HV_SYS_REG_ID_AA64DFR1_EL1, ID_AA64DFR1_EL1_IDX },
+ { HV_SYS_REG_ID_AA64ISAR0_EL1, ID_AA64ISAR0_EL1_IDX },
+ { HV_SYS_REG_ID_AA64ISAR1_EL1, ID_AA64ISAR1_EL1_IDX },
/* Add ID_AA64ISAR2_EL1 here when HVF supports it */
- { HV_SYS_REG_ID_AA64MMFR0_EL1, &host_isar.idregs[ID_AA64MMFR0_EL1_IDX] },
- { HV_SYS_REG_ID_AA64MMFR1_EL1, &host_isar.idregs[ID_AA64MMFR1_EL1_IDX] },
- { HV_SYS_REG_ID_AA64MMFR2_EL1, &host_isar.idregs[ID_AA64MMFR2_EL1_IDX] },
+ { HV_SYS_REG_ID_AA64MMFR0_EL1, ID_AA64MMFR0_EL1_IDX },
+ { HV_SYS_REG_ID_AA64MMFR1_EL1, ID_AA64MMFR1_EL1_IDX },
+ { HV_SYS_REG_ID_AA64MMFR2_EL1, ID_AA64MMFR2_EL1_IDX },
/* Add ID_AA64MMFR3_EL1 here when HVF supports it */
};
hv_vcpu_t fd;
@@ -780,7 +780,8 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
}
for (i = 0; i < ARRAY_SIZE(regs); i++) {
- r |= hv_vcpu_get_sys_reg(fd, regs[i].reg, regs[i].val);
+ r |= hv_vcpu_get_sys_reg(fd, regs[i].reg,
+ &host_isar.idregs[regs[i].index]);
}
r |= hv_vcpu_destroy(fd);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features()
2025-10-28 5:41 ` [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
@ 2025-10-28 11:16 ` Peter Maydell
2025-10-28 11:33 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:16 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 05:53, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> Use index in the structure, dereference &host_isar.idregs[] once.
>
> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features()
2025-10-28 5:41 ` [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
2025-10-28 11:16 ` Peter Maydell
@ 2025-10-28 11:33 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 11:33 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:41, Philippe Mathieu-Daudé wrote:
> Use index in the structure, dereference &host_isar.idregs[] once.
>
> Suggested-by: Richard Henderson<richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
> target/arm/hvf/hvf.c | 25 +++++++++++++------------
> 1 file changed, 13 insertions(+), 12 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 16/59] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (14 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 15/59] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 17/59] target/arm/hvf: Factor hvf_handle_exception() out Philippe Mathieu-Daudé
` (43 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Mohamed Mediouni <mohamed@unpredictable.fr>
Creating a vCPU locks out APIs such as hv_gic_create().
As a result, switch to using the hv_vcpu_config_get_feature_reg interface.
Besides, all the following methods must be run on a vCPU thread:
- hv_vcpu_create()
- hv_vcpu_get_sys_reg()
- hv_vcpu_destroy()
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
Message-ID: <20250808070137.48716-3-mohamed@unpredictable.fr>
[PMD: Release config calling os_release()]
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 35 ++++++++++++++---------------------
1 file changed, 14 insertions(+), 21 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index dea1cb37d1f..fcb6950692b 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -744,25 +744,24 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
{
ARMISARegisters host_isar = {};
static const struct isar_regs {
- int reg;
+ hv_feature_reg_t reg;
ARMIDRegisterIdx index;
} regs[] = {
- { HV_SYS_REG_ID_AA64PFR0_EL1, ID_AA64PFR0_EL1_IDX },
- { HV_SYS_REG_ID_AA64PFR1_EL1, ID_AA64PFR1_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64PFR0_EL1, ID_AA64PFR0_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64PFR1_EL1, ID_AA64PFR1_EL1_IDX },
/* Add ID_AA64PFR2_EL1 here when HVF supports it */
- { HV_SYS_REG_ID_AA64DFR0_EL1, ID_AA64DFR0_EL1_IDX },
- { HV_SYS_REG_ID_AA64DFR1_EL1, ID_AA64DFR1_EL1_IDX },
- { HV_SYS_REG_ID_AA64ISAR0_EL1, ID_AA64ISAR0_EL1_IDX },
- { HV_SYS_REG_ID_AA64ISAR1_EL1, ID_AA64ISAR1_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64DFR0_EL1, ID_AA64DFR0_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64DFR1_EL1, ID_AA64DFR1_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64ISAR0_EL1, ID_AA64ISAR0_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64ISAR1_EL1, ID_AA64ISAR1_EL1_IDX },
/* Add ID_AA64ISAR2_EL1 here when HVF supports it */
- { HV_SYS_REG_ID_AA64MMFR0_EL1, ID_AA64MMFR0_EL1_IDX },
- { HV_SYS_REG_ID_AA64MMFR1_EL1, ID_AA64MMFR1_EL1_IDX },
- { HV_SYS_REG_ID_AA64MMFR2_EL1, ID_AA64MMFR2_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64MMFR0_EL1, ID_AA64MMFR0_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64MMFR1_EL1, ID_AA64MMFR1_EL1_IDX },
+ { HV_FEATURE_REG_ID_AA64MMFR2_EL1, ID_AA64MMFR2_EL1_IDX },
/* Add ID_AA64MMFR3_EL1 here when HVF supports it */
};
- hv_vcpu_t fd;
hv_return_t r = HV_SUCCESS;
- hv_vcpu_exit_t *exit;
+ hv_vcpu_config_t config = hv_vcpu_config_create();
uint64_t t;
int i;
@@ -773,17 +772,11 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
(1ULL << ARM_FEATURE_PMU) |
(1ULL << ARM_FEATURE_GENERIC_TIMER);
- /* We set up a small vcpu to extract host registers */
-
- if (hv_vcpu_create(&fd, &exit, NULL) != HV_SUCCESS) {
- return false;
- }
-
for (i = 0; i < ARRAY_SIZE(regs); i++) {
- r |= hv_vcpu_get_sys_reg(fd, regs[i].reg,
- &host_isar.idregs[regs[i].index]);
+ r |= hv_vcpu_config_get_feature_reg(config, regs[i].reg,
+ &host_isar.idregs[regs[i].index]);
}
- r |= hv_vcpu_destroy(fd);
+ os_release(config);
/*
* Hardcode MIDR because Apple deliberately doesn't expose a divergent
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 17/59] target/arm/hvf: Factor hvf_handle_exception() out
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (15 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 16/59] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 18/59] target/i386/hvf: Factor hvf_handle_vmexit() out Philippe Mathieu-Daudé
` (42 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Factor hvf_handle_exception() out of hvf_vcpu_exec().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 123 +++++++++++++++++++++++--------------------
1 file changed, 65 insertions(+), 58 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index fcb6950692b..8553ce6adc2 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1802,61 +1802,15 @@ static void hvf_sync_vtimer(CPUState *cpu)
}
}
-int hvf_arch_vcpu_exec(CPUState *cpu)
+static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
{
- ARMCPU *arm_cpu = ARM_CPU(cpu);
- CPUARMState *env = &arm_cpu->env;
- int ret;
- hv_vcpu_exit_t *hvf_exit = cpu->accel->exit;
- hv_return_t r;
- bool advance_pc = false;
-
- if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
- hvf_inject_interrupts(cpu)) {
- return EXCP_INTERRUPT;
- }
-
- if (cpu->halted) {
- return EXCP_HLT;
- }
-
- flush_cpu_state(cpu);
-
- bql_unlock();
- r = hv_vcpu_run(cpu->accel->fd);
- bql_lock();
- switch (r) {
- case HV_SUCCESS:
- break;
- case HV_ILLEGAL_GUEST_STATE:
- trace_hvf_illegal_guest_state();
- /* fall through */
- default:
- g_assert_not_reached();
- }
-
- /* handle VMEXIT */
- uint64_t exit_reason = hvf_exit->reason;
- uint64_t syndrome = hvf_exit->exception.syndrome;
+ CPUARMState *env = cpu_env(cpu);
+ ARMCPU *arm_cpu = env_archcpu(env);
+ uint64_t syndrome = excp->syndrome;
uint32_t ec = syn_get_ec(syndrome);
-
- ret = 0;
- switch (exit_reason) {
- case HV_EXIT_REASON_EXCEPTION:
- /* This is the main one, handle below. */
- break;
- case HV_EXIT_REASON_VTIMER_ACTIVATED:
- qemu_set_irq(arm_cpu->gt_timer_outputs[GTIMER_VIRT], 1);
- cpu->accel->vtimer_masked = true;
- return 0;
- case HV_EXIT_REASON_CANCELED:
- /* we got kicked, no exit to process */
- return 0;
- default:
- g_assert_not_reached();
- }
-
- hvf_sync_vtimer(cpu);
+ bool advance_pc = false;
+ hv_return_t r;
+ int ret = 0;
switch (ec) {
case EC_SOFTWARESTEP: {
@@ -1895,7 +1849,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
cpu_synchronize_state(cpu);
CPUWatchpoint *wp =
- find_hw_watchpoint(cpu, hvf_exit->exception.virtual_address);
+ find_hw_watchpoint(cpu, excp->virtual_address);
if (!wp) {
error_report("EXCP_DEBUG but unknown hw watchpoint");
}
@@ -1913,8 +1867,8 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
uint32_t cm = (syndrome >> 8) & 0x1;
uint64_t val = 0;
- trace_hvf_data_abort(hvf_exit->exception.virtual_address,
- hvf_exit->exception.physical_address, isv,
+ trace_hvf_data_abort(excp->virtual_address,
+ excp->physical_address, isv,
iswrite, s1ptw, len, srt);
if (cm) {
@@ -1928,11 +1882,11 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
if (iswrite) {
val = hvf_get_reg(cpu, srt);
address_space_write(&address_space_memory,
- hvf_exit->exception.physical_address,
+ excp->physical_address,
MEMTXATTRS_UNSPECIFIED, &val, len);
} else {
address_space_read(&address_space_memory,
- hvf_exit->exception.physical_address,
+ excp->physical_address,
MEMTXATTRS_UNSPECIFIED, &val, len);
if (sse) {
val = sextract64(val, 0, len * 8);
@@ -2030,6 +1984,59 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
return ret;
}
+int hvf_arch_vcpu_exec(CPUState *cpu)
+{
+ ARMCPU *arm_cpu = ARM_CPU(cpu);
+ hv_vcpu_exit_t *hvf_exit = cpu->accel->exit;
+ hv_return_t r;
+
+ if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
+ hvf_inject_interrupts(cpu)) {
+ return EXCP_INTERRUPT;
+ }
+
+ if (cpu->halted) {
+ return EXCP_HLT;
+ }
+
+ flush_cpu_state(cpu);
+
+ bql_unlock();
+ r = hv_vcpu_run(cpu->accel->fd);
+ bql_lock();
+ switch (r) {
+ case HV_SUCCESS:
+ break;
+ case HV_ILLEGAL_GUEST_STATE:
+ trace_hvf_illegal_guest_state();
+ /* fall through */
+ default:
+ g_assert_not_reached();
+ }
+
+ /* handle VMEXIT */
+ uint64_t exit_reason = hvf_exit->reason;
+
+ switch (exit_reason) {
+ case HV_EXIT_REASON_EXCEPTION:
+ /* This is the main one, handle below. */
+ break;
+ case HV_EXIT_REASON_VTIMER_ACTIVATED:
+ qemu_set_irq(arm_cpu->gt_timer_outputs[GTIMER_VIRT], 1);
+ cpu->accel->vtimer_masked = true;
+ return 0;
+ case HV_EXIT_REASON_CANCELED:
+ /* we got kicked, no exit to process */
+ return 0;
+ default:
+ g_assert_not_reached();
+ }
+
+ hvf_sync_vtimer(cpu);
+
+ return hvf_handle_exception(cpu, &hvf_exit->exception);
+}
+
static const VMStateDescription vmstate_hvf_vtimer = {
.name = "hvf-vtimer",
.version_id = 1,
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 18/59] target/i386/hvf: Factor hvf_handle_vmexit() out
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (16 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 17/59] target/arm/hvf: Factor hvf_handle_exception() out Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 11:18 ` Peter Maydell
2025-10-28 5:41 ` [PATCH v3 19/59] target/arm/hvf: " Philippe Mathieu-Daudé
` (41 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Factor hvf_handle_vmexit() out of hvf_arch_vcpu_exec().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/i386/hvf/hvf.c | 478 +++++++++++++++++++++---------------------
1 file changed, 244 insertions(+), 234 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 76a58cb0350..28d98659ec2 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -721,6 +721,249 @@ void hvf_simulate_wrmsr(CPUState *cs)
printf("write msr %llx\n", RCX(cs));*/
}
+static int hvf_handle_vmexit(CPUState *cpu)
+{
+ X86CPU *x86_cpu = env_archcpu(cpu_env(cpu));
+ uint64_t exit_reason = rvmcs(cpu->accel->fd, VMCS_EXIT_REASON);
+ uint64_t exit_qual = rvmcs(cpu->accel->fd, VMCS_EXIT_QUALIFICATION);
+ uint32_t ins_len = (uint32_t)rvmcs(cpu->accel->fd,
+ VMCS_EXIT_INSTRUCTION_LENGTH);
+
+ uint64_t idtvec_info = rvmcs(cpu->accel->fd, VMCS_IDT_VECTORING_INFO);
+ int ret = 0;
+
+ hvf_store_events(cpu, ins_len, idtvec_info);
+ rip = rreg(cpu->accel->fd, HV_X86_RIP);
+ env->eflags = rreg(cpu->accel->fd, HV_X86_RFLAGS);
+
+ bql_lock();
+
+ update_apic_tpr(cpu);
+ current_cpu = cpu;
+
+ switch (exit_reason) {
+ case EXIT_REASON_HLT: {
+ macvm_set_rip(cpu, rip + ins_len);
+ if (!(cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD)
+ && (env->eflags & IF_MASK))
+ && !cpu_test_interrupt(cpu, CPU_INTERRUPT_NMI)
+ && !(idtvec_info & VMCS_IDT_VEC_VALID)) {
+ cpu->halted = 1;
+ ret = EXCP_HLT;
+ break;
+ }
+ ret = EXCP_INTERRUPT;
+ break;
+ }
+ case EXIT_REASON_MWAIT: {
+ ret = EXCP_INTERRUPT;
+ break;
+ }
+ /* Need to check if MMIO or unmapped fault */
+ case EXIT_REASON_EPT_FAULT:
+ {
+ hvf_slot *slot;
+ uint64_t gpa = rvmcs(cpu->accel->fd, VMCS_GUEST_PHYSICAL_ADDRESS);
+
+ if (((idtvec_info & VMCS_IDT_VEC_VALID) == 0) &&
+ ((exit_qual & EXIT_QUAL_NMIUDTI) != 0)) {
+ vmx_set_nmi_blocking(cpu);
+ }
+
+ slot = hvf_find_overlap_slot(gpa, 1);
+ /* mmio */
+ if (ept_emulation_fault(slot, gpa, exit_qual)) {
+ struct x86_decode decode;
+
+ hvf_load_regs(cpu);
+ decode_instruction(env, &decode);
+ exec_instruction(env, &decode);
+ hvf_store_regs(cpu);
+ break;
+ }
+ break;
+ }
+ case EXIT_REASON_INOUT:
+ {
+ uint32_t in = (exit_qual & 8) != 0;
+ uint32_t size = (exit_qual & 7) + 1;
+ uint32_t string = (exit_qual & 16) != 0;
+ uint32_t port = exit_qual >> 16;
+ /*uint32_t rep = (exit_qual & 0x20) != 0;*/
+ struct x86_decode decode;
+
+ if (!string && in) {
+ uint64_t val = 0;
+
+ hvf_load_regs(cpu);
+ hvf_handle_io(env_cpu(env), port, &val, 0, size, 1);
+ if (size == 1) {
+ AL(env) = val;
+ } else if (size == 2) {
+ AX(env) = val;
+ } else if (size == 4) {
+ RAX(env) = (uint32_t)val;
+ } else {
+ RAX(env) = (uint64_t)val;
+ }
+ env->eip += ins_len;
+ hvf_store_regs(cpu);
+ break;
+ } else if (!string && !in) {
+ RAX(env) = rreg(cpu->accel->fd, HV_X86_RAX);
+ hvf_handle_io(env_cpu(env), port, &RAX(env), 1, size, 1);
+ macvm_set_rip(cpu, rip + ins_len);
+ break;
+ }
+
+ hvf_load_regs(cpu);
+ decode_instruction(env, &decode);
+ assert(ins_len == decode.len);
+ exec_instruction(env, &decode);
+ hvf_store_regs(cpu);
+
+ break;
+ }
+ case EXIT_REASON_CPUID: {
+ uint32_t rax = (uint32_t)rreg(cpu->accel->fd, HV_X86_RAX);
+ uint32_t rbx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RBX);
+ uint32_t rcx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RCX);
+ uint32_t rdx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RDX);
+
+ if (rax == 1) {
+ /* CPUID1.ecx.OSXSAVE needs to know CR4 */
+ env->cr[4] = rvmcs(cpu->accel->fd, VMCS_GUEST_CR4);
+ }
+ hvf_cpu_x86_cpuid(env, rax, rcx, &rax, &rbx, &rcx, &rdx);
+
+ wreg(cpu->accel->fd, HV_X86_RAX, rax);
+ wreg(cpu->accel->fd, HV_X86_RBX, rbx);
+ wreg(cpu->accel->fd, HV_X86_RCX, rcx);
+ wreg(cpu->accel->fd, HV_X86_RDX, rdx);
+
+ macvm_set_rip(cpu, rip + ins_len);
+ break;
+ }
+ case EXIT_REASON_XSETBV: {
+ uint32_t eax = (uint32_t)rreg(cpu->accel->fd, HV_X86_RAX);
+ uint32_t ecx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RCX);
+ uint32_t edx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RDX);
+
+ if (ecx) {
+ macvm_set_rip(cpu, rip + ins_len);
+ break;
+ }
+ env->xcr0 = ((uint64_t)edx << 32) | eax;
+ wreg(cpu->accel->fd, HV_X86_XCR0, env->xcr0 | 1);
+ macvm_set_rip(cpu, rip + ins_len);
+ break;
+ }
+ case EXIT_REASON_INTR_WINDOW:
+ vmx_clear_int_window_exiting(cpu);
+ ret = EXCP_INTERRUPT;
+ break;
+ case EXIT_REASON_NMI_WINDOW:
+ vmx_clear_nmi_window_exiting(cpu);
+ ret = EXCP_INTERRUPT;
+ break;
+ case EXIT_REASON_EXT_INTR:
+ /* force exit and allow io handling */
+ ret = EXCP_INTERRUPT;
+ break;
+ case EXIT_REASON_RDMSR:
+ case EXIT_REASON_WRMSR:
+ {
+ hvf_load_regs(cpu);
+ if (exit_reason == EXIT_REASON_RDMSR) {
+ hvf_simulate_rdmsr(cpu);
+ } else {
+ hvf_simulate_wrmsr(cpu);
+ }
+ env->eip += ins_len;
+ hvf_store_regs(cpu);
+ break;
+ }
+ case EXIT_REASON_CR_ACCESS: {
+ int cr;
+ int reg;
+
+ hvf_load_regs(cpu);
+ cr = exit_qual & 15;
+ reg = (exit_qual >> 8) & 15;
+
+ switch (cr) {
+ case 0x0: {
+ macvm_set_cr0(cpu->accel->fd, RRX(env, reg));
+ break;
+ }
+ case 4: {
+ macvm_set_cr4(cpu->accel->fd, RRX(env, reg));
+ break;
+ }
+ case 8: {
+ if (exit_qual & 0x10) {
+ RRX(env, reg) = cpu_get_apic_tpr(x86_cpu->apic_state);
+ } else {
+ int tpr = RRX(env, reg);
+ cpu_set_apic_tpr(x86_cpu->apic_state, tpr);
+ ret = EXCP_INTERRUPT;
+ }
+ break;
+ }
+ default:
+ error_report("Unrecognized CR %d", cr);
+ abort();
+ }
+ env->eip += ins_len;
+ hvf_store_regs(cpu);
+ break;
+ }
+ case EXIT_REASON_APIC_ACCESS: { /* TODO */
+ struct x86_decode decode;
+
+ hvf_load_regs(cpu);
+ decode_instruction(env, &decode);
+ exec_instruction(env, &decode);
+ hvf_store_regs(cpu);
+ break;
+ }
+ case EXIT_REASON_TPR: {
+ ret = 1;
+ break;
+ }
+ case EXIT_REASON_TASK_SWITCH: {
+ uint64_t vinfo = rvmcs(cpu->accel->fd, VMCS_IDT_VECTORING_INFO);
+ x86_segment_selector sel = {.sel = exit_qual & 0xffff};
+
+ vmx_handle_task_switch(cpu, sel, (exit_qual >> 30) & 0x3,
+ vinfo & VMCS_INTR_VALID,
+ vinfo & VECTORING_INFO_VECTOR_MASK,
+ vinfo & VMCS_INTR_T_MASK);
+ break;
+ }
+ case EXIT_REASON_TRIPLE_FAULT: {
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
+ ret = EXCP_INTERRUPT;
+ break;
+ }
+ case EXIT_REASON_RDPMC:
+ wreg(cpu->accel->fd, HV_X86_RAX, 0);
+ wreg(cpu->accel->fd, HV_X86_RDX, 0);
+ macvm_set_rip(cpu, rip + ins_len);
+ break;
+ case VMX_REASON_VMCALL:
+ env->exception_nr = EXCP0D_GPF;
+ env->exception_injected = 1;
+ env->has_error_code = true;
+ env->error_code = 0;
+ break;
+ default:
+ error_report("%llx: unhandled exit %llx", rip, exit_reason);
+ }
+
+ return ret;
+}
+
int hvf_arch_vcpu_exec(CPUState *cpu)
{
X86CPU *x86_cpu = X86_CPU(cpu);
@@ -752,240 +995,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
hv_return_t r = hv_vcpu_run_until(cpu->accel->fd, HV_DEADLINE_FOREVER);
assert_hvf_ok(r);
- /* handle VMEXIT */
- uint64_t exit_reason = rvmcs(cpu->accel->fd, VMCS_EXIT_REASON);
- uint64_t exit_qual = rvmcs(cpu->accel->fd, VMCS_EXIT_QUALIFICATION);
- uint32_t ins_len = (uint32_t)rvmcs(cpu->accel->fd,
- VMCS_EXIT_INSTRUCTION_LENGTH);
-
- uint64_t idtvec_info = rvmcs(cpu->accel->fd, VMCS_IDT_VECTORING_INFO);
-
- hvf_store_events(cpu, ins_len, idtvec_info);
- rip = rreg(cpu->accel->fd, HV_X86_RIP);
- env->eflags = rreg(cpu->accel->fd, HV_X86_RFLAGS);
-
- bql_lock();
-
- update_apic_tpr(cpu);
- current_cpu = cpu;
-
- ret = 0;
- switch (exit_reason) {
- case EXIT_REASON_HLT: {
- macvm_set_rip(cpu, rip + ins_len);
- if (!(cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD) &&
- (env->eflags & IF_MASK))
- && !cpu_test_interrupt(cpu, CPU_INTERRUPT_NMI) &&
- !(idtvec_info & VMCS_IDT_VEC_VALID)) {
- cpu->halted = 1;
- ret = EXCP_HLT;
- break;
- }
- ret = EXCP_INTERRUPT;
- break;
- }
- case EXIT_REASON_MWAIT: {
- ret = EXCP_INTERRUPT;
- break;
- }
- /* Need to check if MMIO or unmapped fault */
- case EXIT_REASON_EPT_FAULT:
- {
- hvf_slot *slot;
- uint64_t gpa = rvmcs(cpu->accel->fd, VMCS_GUEST_PHYSICAL_ADDRESS);
-
- if (((idtvec_info & VMCS_IDT_VEC_VALID) == 0) &&
- ((exit_qual & EXIT_QUAL_NMIUDTI) != 0)) {
- vmx_set_nmi_blocking(cpu);
- }
-
- slot = hvf_find_overlap_slot(gpa, 1);
- /* mmio */
- if (ept_emulation_fault(slot, gpa, exit_qual)) {
- struct x86_decode decode;
-
- hvf_load_regs(cpu);
- decode_instruction(env, &decode);
- exec_instruction(env, &decode);
- hvf_store_regs(cpu);
- break;
- }
- break;
- }
- case EXIT_REASON_INOUT:
- {
- uint32_t in = (exit_qual & 8) != 0;
- uint32_t size = (exit_qual & 7) + 1;
- uint32_t string = (exit_qual & 16) != 0;
- uint32_t port = exit_qual >> 16;
- /*uint32_t rep = (exit_qual & 0x20) != 0;*/
-
- if (!string && in) {
- uint64_t val = 0;
- hvf_load_regs(cpu);
- hvf_handle_io(env_cpu(env), port, &val, 0, size, 1);
- if (size == 1) {
- AL(env) = val;
- } else if (size == 2) {
- AX(env) = val;
- } else if (size == 4) {
- RAX(env) = (uint32_t)val;
- } else {
- RAX(env) = (uint64_t)val;
- }
- env->eip += ins_len;
- hvf_store_regs(cpu);
- break;
- } else if (!string && !in) {
- RAX(env) = rreg(cpu->accel->fd, HV_X86_RAX);
- hvf_handle_io(env_cpu(env), port, &RAX(env), 1, size, 1);
- macvm_set_rip(cpu, rip + ins_len);
- break;
- }
- struct x86_decode decode;
-
- hvf_load_regs(cpu);
- decode_instruction(env, &decode);
- assert(ins_len == decode.len);
- exec_instruction(env, &decode);
- hvf_store_regs(cpu);
-
- break;
- }
- case EXIT_REASON_CPUID: {
- uint32_t rax = (uint32_t)rreg(cpu->accel->fd, HV_X86_RAX);
- uint32_t rbx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RBX);
- uint32_t rcx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RCX);
- uint32_t rdx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RDX);
-
- if (rax == 1) {
- /* CPUID1.ecx.OSXSAVE needs to know CR4 */
- env->cr[4] = rvmcs(cpu->accel->fd, VMCS_GUEST_CR4);
- }
- hvf_cpu_x86_cpuid(env, rax, rcx, &rax, &rbx, &rcx, &rdx);
-
- wreg(cpu->accel->fd, HV_X86_RAX, rax);
- wreg(cpu->accel->fd, HV_X86_RBX, rbx);
- wreg(cpu->accel->fd, HV_X86_RCX, rcx);
- wreg(cpu->accel->fd, HV_X86_RDX, rdx);
-
- macvm_set_rip(cpu, rip + ins_len);
- break;
- }
- case EXIT_REASON_XSETBV: {
- uint32_t eax = (uint32_t)rreg(cpu->accel->fd, HV_X86_RAX);
- uint32_t ecx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RCX);
- uint32_t edx = (uint32_t)rreg(cpu->accel->fd, HV_X86_RDX);
-
- if (ecx) {
- macvm_set_rip(cpu, rip + ins_len);
- break;
- }
- env->xcr0 = ((uint64_t)edx << 32) | eax;
- wreg(cpu->accel->fd, HV_X86_XCR0, env->xcr0 | 1);
- macvm_set_rip(cpu, rip + ins_len);
- break;
- }
- case EXIT_REASON_INTR_WINDOW:
- vmx_clear_int_window_exiting(cpu);
- ret = EXCP_INTERRUPT;
- break;
- case EXIT_REASON_NMI_WINDOW:
- vmx_clear_nmi_window_exiting(cpu);
- ret = EXCP_INTERRUPT;
- break;
- case EXIT_REASON_EXT_INTR:
- /* force exit and allow io handling */
- ret = EXCP_INTERRUPT;
- break;
- case EXIT_REASON_RDMSR:
- case EXIT_REASON_WRMSR:
- {
- hvf_load_regs(cpu);
- if (exit_reason == EXIT_REASON_RDMSR) {
- hvf_simulate_rdmsr(cpu);
- } else {
- hvf_simulate_wrmsr(cpu);
- }
- env->eip += ins_len;
- hvf_store_regs(cpu);
- break;
- }
- case EXIT_REASON_CR_ACCESS: {
- int cr;
- int reg;
-
- hvf_load_regs(cpu);
- cr = exit_qual & 15;
- reg = (exit_qual >> 8) & 15;
-
- switch (cr) {
- case 0x0: {
- macvm_set_cr0(cpu->accel->fd, RRX(env, reg));
- break;
- }
- case 4: {
- macvm_set_cr4(cpu->accel->fd, RRX(env, reg));
- break;
- }
- case 8: {
- if (exit_qual & 0x10) {
- RRX(env, reg) = cpu_get_apic_tpr(x86_cpu->apic_state);
- } else {
- int tpr = RRX(env, reg);
- cpu_set_apic_tpr(x86_cpu->apic_state, tpr);
- ret = EXCP_INTERRUPT;
- }
- break;
- }
- default:
- error_report("Unrecognized CR %d", cr);
- abort();
- }
- env->eip += ins_len;
- hvf_store_regs(cpu);
- break;
- }
- case EXIT_REASON_APIC_ACCESS: { /* TODO */
- struct x86_decode decode;
-
- hvf_load_regs(cpu);
- decode_instruction(env, &decode);
- exec_instruction(env, &decode);
- hvf_store_regs(cpu);
- break;
- }
- case EXIT_REASON_TPR: {
- ret = 1;
- break;
- }
- case EXIT_REASON_TASK_SWITCH: {
- uint64_t vinfo = rvmcs(cpu->accel->fd, VMCS_IDT_VECTORING_INFO);
- x86_segment_selector sel = {.sel = exit_qual & 0xffff};
- vmx_handle_task_switch(cpu, sel, (exit_qual >> 30) & 0x3,
- vinfo & VMCS_INTR_VALID, vinfo & VECTORING_INFO_VECTOR_MASK, vinfo
- & VMCS_INTR_T_MASK);
- break;
- }
- case EXIT_REASON_TRIPLE_FAULT: {
- qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
- ret = EXCP_INTERRUPT;
- break;
- }
- case EXIT_REASON_RDPMC:
- wreg(cpu->accel->fd, HV_X86_RAX, 0);
- wreg(cpu->accel->fd, HV_X86_RDX, 0);
- macvm_set_rip(cpu, rip + ins_len);
- break;
- case VMX_REASON_VMCALL:
- env->exception_nr = EXCP0D_GPF;
- env->exception_injected = 1;
- env->has_error_code = true;
- env->error_code = 0;
- break;
- default:
- error_report("%llx: unhandled exit %llx", rip, exit_reason);
- }
+ ret = hvf_handle_vmexit(cpu);
} while (ret == 0);
return ret;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 18/59] target/i386/hvf: Factor hvf_handle_vmexit() out
2025-10-28 5:41 ` [PATCH v3 18/59] target/i386/hvf: Factor hvf_handle_vmexit() out Philippe Mathieu-Daudé
@ 2025-10-28 11:18 ` Peter Maydell
0 siblings, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:18 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 05:55, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> Factor hvf_handle_vmexit() out of hvf_arch_vcpu_exec().
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> target/i386/hvf/hvf.c | 478 +++++++++++++++++++++---------------------
> 1 file changed, 244 insertions(+), 234 deletions(-)
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 19/59] target/arm/hvf: Factor hvf_handle_vmexit() out
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (17 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 18/59] target/i386/hvf: Factor hvf_handle_vmexit() out Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 20/59] target/arm/hvf: Keep calling hv_vcpu_run() in loop Philippe Mathieu-Daudé
` (40 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Factor hvf_handle_vmexit() out of hvf_vcpu_exec().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 50 ++++++++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 23 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 8553ce6adc2..27c600148f9 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1984,10 +1984,33 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
return ret;
}
+static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_exit_t *exit)
+{
+ ARMCPU *arm_cpu = env_archcpu(cpu_env(cpu));
+ int ret = 0;
+
+ switch (exit->reason) {
+ case HV_EXIT_REASON_EXCEPTION:
+ hvf_sync_vtimer(cpu);
+ ret = hvf_handle_exception(cpu, &exit->exception);
+ break;
+ case HV_EXIT_REASON_VTIMER_ACTIVATED:
+ qemu_set_irq(arm_cpu->gt_timer_outputs[GTIMER_VIRT], 1);
+ cpu->accel->vtimer_masked = true;
+ break;
+ case HV_EXIT_REASON_CANCELED:
+ /* we got kicked, no exit to process */
+ break;
+ default:
+ g_assert_not_reached();
+ }
+
+ return ret;
+}
+
int hvf_arch_vcpu_exec(CPUState *cpu)
{
- ARMCPU *arm_cpu = ARM_CPU(cpu);
- hv_vcpu_exit_t *hvf_exit = cpu->accel->exit;
+ int ret;
hv_return_t r;
if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
@@ -2006,6 +2029,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
bql_lock();
switch (r) {
case HV_SUCCESS:
+ ret = hvf_handle_vmexit(cpu, cpu->accel->exit);
break;
case HV_ILLEGAL_GUEST_STATE:
trace_hvf_illegal_guest_state();
@@ -2014,27 +2038,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
g_assert_not_reached();
}
- /* handle VMEXIT */
- uint64_t exit_reason = hvf_exit->reason;
-
- switch (exit_reason) {
- case HV_EXIT_REASON_EXCEPTION:
- /* This is the main one, handle below. */
- break;
- case HV_EXIT_REASON_VTIMER_ACTIVATED:
- qemu_set_irq(arm_cpu->gt_timer_outputs[GTIMER_VIRT], 1);
- cpu->accel->vtimer_masked = true;
- return 0;
- case HV_EXIT_REASON_CANCELED:
- /* we got kicked, no exit to process */
- return 0;
- default:
- g_assert_not_reached();
- }
-
- hvf_sync_vtimer(cpu);
-
- return hvf_handle_exception(cpu, &hvf_exit->exception);
+ return ret;
}
static const VMStateDescription vmstate_hvf_vtimer = {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 20/59] target/arm/hvf: Keep calling hv_vcpu_run() in loop
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (18 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 19/59] target/arm/hvf: " Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 21/59] cpus: Trace cpu_exec_start() and cpu_exec_end() calls Philippe Mathieu-Daudé
` (39 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Mads Ynddal <mads@ynddal.dk>
---
target/arm/hvf/hvf.c | 38 ++++++++++++++++++++------------------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 27c600148f9..79861dcacf9 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2013,30 +2013,32 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
int ret;
hv_return_t r;
- if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
- hvf_inject_interrupts(cpu)) {
- return EXCP_INTERRUPT;
- }
-
if (cpu->halted) {
return EXCP_HLT;
}
flush_cpu_state(cpu);
- bql_unlock();
- r = hv_vcpu_run(cpu->accel->fd);
- bql_lock();
- switch (r) {
- case HV_SUCCESS:
- ret = hvf_handle_vmexit(cpu, cpu->accel->exit);
- break;
- case HV_ILLEGAL_GUEST_STATE:
- trace_hvf_illegal_guest_state();
- /* fall through */
- default:
- g_assert_not_reached();
- }
+ do {
+ if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
+ hvf_inject_interrupts(cpu)) {
+ return EXCP_INTERRUPT;
+ }
+
+ bql_unlock();
+ r = hv_vcpu_run(cpu->accel->fd);
+ bql_lock();
+ switch (r) {
+ case HV_SUCCESS:
+ ret = hvf_handle_vmexit(cpu, cpu->accel->exit);
+ break;
+ case HV_ILLEGAL_GUEST_STATE:
+ trace_hvf_illegal_guest_state();
+ /* fall through */
+ default:
+ g_assert_not_reached();
+ }
+ } while (ret == 0);
return ret;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 21/59] cpus: Trace cpu_exec_start() and cpu_exec_end() calls
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (19 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 20/59] target/arm/hvf: Keep calling hv_vcpu_run() in loop Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 22/59] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls Philippe Mathieu-Daudé
` (38 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé, Paolo Bonzini,
Stefan Hajnoczi
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
cpu-common.c | 3 +++
trace-events | 2 ++
2 files changed, 5 insertions(+)
diff --git a/cpu-common.c b/cpu-common.c
index 0eb5c7b8f24..988d057d844 100644
--- a/cpu-common.c
+++ b/cpu-common.c
@@ -249,6 +249,8 @@ void end_exclusive(void)
/* Wait for exclusive ops to finish, and begin cpu execution. */
void cpu_exec_start(CPUState *cpu)
{
+ trace_cpu_exec_start(cpu->cpu_index);
+
qatomic_set(&cpu->running, true);
/* Write cpu->running before reading pending_cpus. */
@@ -319,6 +321,7 @@ void cpu_exec_end(CPUState *cpu)
}
}
}
+ trace_cpu_exec_end(cpu->cpu_index);
}
void async_safe_run_on_cpu(CPUState *cpu, run_on_cpu_func func,
diff --git a/trace-events b/trace-events
index 3ec8a6c7202..faeba6242fa 100644
--- a/trace-events
+++ b/trace-events
@@ -29,6 +29,8 @@
breakpoint_insert(int cpu_index, uint64_t pc, int flags) "cpu=%d pc=0x%" PRIx64 " flags=0x%x"
breakpoint_remove(int cpu_index, uint64_t pc, int flags) "cpu=%d pc=0x%" PRIx64 " flags=0x%x"
breakpoint_singlestep(int cpu_index, int enabled) "cpu=%d enable=%d"
+cpu_exec_start(int cpu_index) "cpu=%d"
+cpu_exec_end(int cpu_index) "cpu=%d"
# job.c
job_state_transition(void *job, int ret, const char *legal, const char *s0, const char *s1) "job %p (ret: %d) attempting %s transition (%s-->%s)"
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 22/59] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (20 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 21/59] cpus: Trace cpu_exec_start() and cpu_exec_end() calls Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:41 ` [PATCH v3 23/59] target/arm: Call aarch64_add_pauth_properties() once in host_initfn() Philippe Mathieu-Daudé
` (37 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Similarly to 1d78a3c3ab8 for KVM, wrap hv_vcpu_run() with
cpu_exec_start/end(), so that the accelerator can perform
pending operations while all vCPUs are quiescent. See also
explanation in commit c265e976f46 ("cpus-common: lock-free
fast path for cpu_exec_start/end").
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 2 ++
target/i386/hvf/hvf.c | 4 ++++
2 files changed, 6 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 79861dcacf9..c882f4c89cf 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2026,7 +2026,9 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
}
bql_unlock();
+ cpu_exec_start(cpu);
r = hv_vcpu_run(cpu->accel->fd);
+ cpu_exec_end(cpu);
bql_lock();
switch (r) {
case HV_SUCCESS:
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 28d98659ec2..16febbac48f 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -992,9 +992,13 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
return EXCP_HLT;
}
+ cpu_exec_start(cpu);
+
hv_return_t r = hv_vcpu_run_until(cpu->accel->fd, HV_DEADLINE_FOREVER);
assert_hvf_ok(r);
+ cpu_exec_end(cpu);
+
ret = hvf_handle_vmexit(cpu);
} while (ret == 0);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 23/59] target/arm: Call aarch64_add_pauth_properties() once in host_initfn()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (21 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 22/59] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls Philippe Mathieu-Daudé
@ 2025-10-28 5:41 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 24/59] accel/hvf: Restrict ARM specific fields of AccelCPUState Philippe Mathieu-Daudé
` (36 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:41 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/cpu64.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 26cf7e6dfa2..f81cfd0113c 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -762,20 +762,20 @@ static void aarch64_a53_initfn(Object *obj)
static void aarch64_host_initfn(Object *obj)
{
-#if defined(CONFIG_KVM)
ARMCPU *cpu = ARM_CPU(obj);
+#if defined(CONFIG_KVM)
kvm_arm_set_cpu_features_from_host(cpu);
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
aarch64_add_sve_properties(obj);
- aarch64_add_pauth_properties(obj);
}
#elif defined(CONFIG_HVF)
- ARMCPU *cpu = ARM_CPU(obj);
hvf_arm_set_cpu_features_from_host(cpu);
- aarch64_add_pauth_properties(obj);
#else
g_assert_not_reached();
#endif
+ if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
+ aarch64_add_pauth_properties(obj);
+ }
}
static void aarch64_max_initfn(Object *obj)
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 24/59] accel/hvf: Restrict ARM specific fields of AccelCPUState
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (22 preceding siblings ...)
2025-10-28 5:41 ` [PATCH v3 23/59] target/arm: Call aarch64_add_pauth_properties() once in host_initfn() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 25/59] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list() Philippe Mathieu-Daudé
` (35 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Do not expose ARM specific fields to X86 implementation,
allowing to use the proper 'hv_vcpu_exit_t' type.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
include/system/hvf_int.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 195d64dcf18..3d2be4092ef 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -59,10 +59,12 @@ extern HVFState *hvf_state;
struct AccelCPUState {
hvf_vcpuid fd;
- void *exit;
+#ifdef __aarch64__
+ hv_vcpu_exit_t *exit;
bool vtimer_masked;
sigset_t unblock_ipi_mask;
bool guest_debug_enabled;
+#endif
};
void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 25/59] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (23 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 24/59] accel/hvf: Restrict ARM specific fields of AccelCPUState Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 26/59] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events Philippe Mathieu-Daudé
` (34 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Prefix init_cpreg_list() with 'arm_'.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/internals.h | 2 +-
target/arm/cpu.c | 2 +-
target/arm/helper.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/target/arm/internals.h b/target/arm/internals.h
index f86f421a3db..773c08d4f7c 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -376,7 +376,7 @@ static inline int r14_bank_number(int mode)
void arm_cpu_register(const ARMCPUInfo *info);
void register_cp_regs_for_features(ARMCPU *cpu);
-void init_cpreg_list(ARMCPU *cpu);
+void arm_init_cpreg_list(ARMCPU *cpu);
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu);
void arm_translate_init(void);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index d2fc17eab63..39292fb9bc1 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2141,7 +2141,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
arm_cpu_register_gdb_regs_for_features(cpu);
arm_cpu_register_gdb_commands(cpu);
- init_cpreg_list(cpu);
+ arm_init_cpreg_list(cpu);
#ifndef CONFIG_USER_ONLY
MachineState *ms = MACHINE(qdev_get_machine());
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 2ef9c178147..31bb3ce5172 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -252,7 +252,7 @@ static void count_cpreg(gpointer key, gpointer value, gpointer opaque)
}
}
-void init_cpreg_list(ARMCPU *cpu)
+void arm_init_cpreg_list(ARMCPU *cpu)
{
/*
* Initialise the cpreg_tuples[] array based on the cp_regs hash.
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 26/59] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (24 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 25/59] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:23 ` Peter Maydell
2025-10-28 5:42 ` [PATCH v3 27/59] target/arm: Re-use arm_is_psci_call() in HVF Philippe Mathieu-Daudé
` (33 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
In order to extend the trace events to other registers,
rename and pass the register group as argument.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 14 ++++++++------
target/arm/hvf/trace-events | 4 ++--
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index c882f4c89cf..26bafee259e 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1149,7 +1149,8 @@ static uint32_t hvf_reg2cp_reg(uint32_t reg)
(reg >> SYSREG_OP2_SHIFT) & SYSREG_OP2_MASK);
}
-static bool hvf_sysreg_read_cp(CPUState *cpu, uint32_t reg, uint64_t *val)
+static bool hvf_sysreg_read_cp(CPUState *cpu, const char *cpname,
+ uint32_t reg, uint64_t *val)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
@@ -1172,7 +1173,7 @@ static bool hvf_sysreg_read_cp(CPUState *cpu, uint32_t reg, uint64_t *val)
} else {
*val = raw_read(env, ri);
}
- trace_hvf_vgic_read(ri->name, *val);
+ trace_hvf_emu_reginfo_read(cpname, ri->name, *val);
return true;
}
@@ -1261,7 +1262,7 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val)
case SYSREG_ICC_SRE_EL1:
case SYSREG_ICC_CTLR_EL1:
/* Call the TCG sysreg handler. This is only safe for GICv3 regs. */
- if (hvf_sysreg_read_cp(cpu, reg, val)) {
+ if (hvf_sysreg_read_cp(cpu, "GICv3", reg, val)) {
return 0;
}
break;
@@ -1432,7 +1433,8 @@ static void pmswinc_write(CPUARMState *env, uint64_t value)
}
}
-static bool hvf_sysreg_write_cp(CPUState *cpu, uint32_t reg, uint64_t val)
+static bool hvf_sysreg_write_cp(CPUState *cpu, const char *cpname,
+ uint32_t reg, uint64_t val)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
@@ -1455,7 +1457,7 @@ static bool hvf_sysreg_write_cp(CPUState *cpu, uint32_t reg, uint64_t val)
raw_write(env, ri, val);
}
- trace_hvf_vgic_write(ri->name, val);
+ trace_hvf_emu_reginfo_write(cpname, ri->name, val);
return true;
}
@@ -1581,7 +1583,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
case SYSREG_ICC_SGI1R_EL1:
case SYSREG_ICC_SRE_EL1:
/* Call the TCG sysreg handler. This is only safe for GICv3 regs. */
- if (hvf_sysreg_write_cp(cpu, reg, val)) {
+ if (hvf_sysreg_write_cp(cpu, "GICv3", reg, val)) {
return 0;
}
break;
diff --git a/target/arm/hvf/trace-events b/target/arm/hvf/trace-events
index 538af6e0707..29387780e3f 100644
--- a/target/arm/hvf/trace-events
+++ b/target/arm/hvf/trace-events
@@ -9,7 +9,7 @@ hvf_unknown_hvc(uint64_t pc, uint64_t x0) "pc=0x%"PRIx64" unknown HVC! 0x%016"PR
hvf_unknown_smc(uint64_t x0) "unknown SMC! 0x%016"PRIx64
hvf_exit(uint64_t syndrome, uint32_t ec, uint64_t pc) "exit: 0x%"PRIx64" [ec=0x%x pc=0x%"PRIx64"]"
hvf_psci_call(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, uint32_t cpuid) "PSCI Call x0=0x%016"PRIx64" x1=0x%016"PRIx64" x2=0x%016"PRIx64" x3=0x%016"PRIx64" cpuid=0x%x"
-hvf_vgic_write(const char *name, uint64_t val) "vgic write to %s [val=0x%016"PRIx64"]"
-hvf_vgic_read(const char *name, uint64_t val) "vgic read from %s [val=0x%016"PRIx64"]"
+hvf_emu_reginfo_write(const char *cpname, const char *regname, uint64_t val) "[%s] write to %s [val=0x%016"PRIx64"]"
+hvf_emu_reginfo_read(const char *cpname, const char *regname, uint64_t val) "[%s] read from %s [val=0x%016"PRIx64"]"
hvf_illegal_guest_state(void) "HV_ILLEGAL_GUEST_STATE"
hvf_kick_vcpu_thread(unsigned cpuidx, bool stop) "cpu:%u stop:%u"
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 26/59] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events
2025-10-28 5:42 ` [PATCH v3 26/59] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events Philippe Mathieu-Daudé
@ 2025-10-28 11:23 ` Peter Maydell
0 siblings, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:23 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 06:01, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> In order to extend the trace events to other registers,
> rename and pass the register group as argument.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 27/59] target/arm: Re-use arm_is_psci_call() in HVF
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (25 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 26/59] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 28/59] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF Philippe Mathieu-Daudé
` (32 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Re-use arm_is_psci_call() instead of open-coding it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 26bafee259e..a3bb71e63b9 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1934,7 +1934,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
break;
case EC_AA64_HVC:
cpu_synchronize_state(cpu);
- if (arm_cpu->psci_conduit == QEMU_PSCI_CONDUIT_HVC) {
+ if (arm_is_psci_call(arm_cpu, EXCP_HVC)) {
if (!hvf_handle_psci_call(cpu)) {
trace_hvf_unknown_hvc(env->pc, env->xregs[0]);
/* SMCCC 1.3 section 5.2 says every unknown SMCCC call returns -1 */
@@ -1947,7 +1947,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
break;
case EC_AA64_SMC:
cpu_synchronize_state(cpu);
- if (arm_cpu->psci_conduit == QEMU_PSCI_CONDUIT_SMC) {
+ if (arm_is_psci_call(arm_cpu, EXCP_SMC)) {
advance_pc = true;
if (!hvf_handle_psci_call(cpu)) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 28/59] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (26 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 27/59] target/arm: Re-use arm_is_psci_call() in HVF Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 29/59] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC Philippe Mathieu-Daudé
` (31 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
It is useful to compare PSCI calls of the same guest running
under TCG or HVF.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 3 ++-
target/arm/tcg/psci.c | 3 +++
target/arm/trace-events | 3 +++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index a3bb71e63b9..f31b6e54ee7 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -34,6 +34,7 @@
#include "target/arm/internals.h"
#include "target/arm/multiprocessing.h"
#include "target/arm/gtimer.h"
+#include "target/arm/trace.h"
#include "trace.h"
#include "migration/vmstate.h"
@@ -1025,7 +1026,7 @@ static bool hvf_handle_psci_call(CPUState *cpu)
int target_el = 1;
int32_t ret = 0;
- trace_hvf_psci_call(param[0], param[1], param[2], param[3],
+ trace_arm_psci_call(param[0], param[1], param[2], param[3],
arm_cpu_mp_affinity(arm_cpu));
switch (param[0]) {
diff --git a/target/arm/tcg/psci.c b/target/arm/tcg/psci.c
index cabed43e8a8..2d409301578 100644
--- a/target/arm/tcg/psci.c
+++ b/target/arm/tcg/psci.c
@@ -25,6 +25,7 @@
#include "internals.h"
#include "arm-powerctl.h"
#include "target/arm/multiprocessing.h"
+#include "target/arm/trace.h"
bool arm_is_psci_call(ARMCPU *cpu, int excp_type)
{
@@ -79,6 +80,8 @@ void arm_handle_psci_call(ARMCPU *cpu)
*/
param[i] = is_a64(env) ? env->xregs[i] : env->regs[i];
}
+ trace_arm_psci_call(param[0], param[1], param[2], param[3],
+ arm_cpu_mp_affinity(cpu));
if ((param[0] & QEMU_PSCI_0_2_64BIT) && !is_a64(env)) {
ret = QEMU_PSCI_RET_NOT_SUPPORTED;
diff --git a/target/arm/trace-events b/target/arm/trace-events
index 72a2c7d0969..676d29fe516 100644
--- a/target/arm/trace-events
+++ b/target/arm/trace-events
@@ -23,3 +23,6 @@ arm_powerctl_set_cpu_on(uint64_t mp_aff, unsigned target_el, const char *mode, u
arm_powerctl_set_cpu_on_and_reset(uint64_t mp_aff) "cpu %" PRIu64
arm_powerctl_set_cpu_off(uint64_t mp_aff) "cpu %" PRIu64
arm_powerctl_reset_cpu(uint64_t mp_aff) "cpu %" PRIu64
+
+# tcg/psci.c and hvf/hvf.c
+arm_psci_call(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3, uint32_t cpuid) "PSCI Call x0=0x%016"PRIx64" x1=0x%016"PRIx64" x2=0x%016"PRIx64" x3=0x%016"PRIx64" cpuid=0x%x"
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 29/59] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (27 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 28/59] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 30/59] accel/hvf: Trace prefetch abort Philippe Mathieu-Daudé
` (30 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index f31b6e54ee7..805fe75e6b1 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1936,6 +1936,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
case EC_AA64_HVC:
cpu_synchronize_state(cpu);
if (arm_is_psci_call(arm_cpu, EXCP_HVC)) {
+ /* Do NOT advance $pc for HVC */
if (!hvf_handle_psci_call(cpu)) {
trace_hvf_unknown_hvc(env->pc, env->xregs[0]);
/* SMCCC 1.3 section 5.2 says every unknown SMCCC call returns -1 */
@@ -1949,6 +1950,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
case EC_AA64_SMC:
cpu_synchronize_state(cpu);
if (arm_is_psci_call(arm_cpu, EXCP_SMC)) {
+ /* Secure Monitor Call exception, we need to advance $pc */
advance_pc = true;
if (!hvf_handle_psci_call(cpu)) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 30/59] accel/hvf: Trace prefetch abort
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (28 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 29/59] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 31/59] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range Philippe Mathieu-Daudé
` (29 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 11 +++++++++++
target/arm/hvf/trace-events | 1 +
2 files changed, 12 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 805fe75e6b1..de1e8fb8a05 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1963,6 +1963,17 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized(), 1);
}
break;
+ case EC_INSNABORT: {
+ uint32_t set = (syndrome >> 12) & 3;
+ bool fnv = (syndrome >> 10) & 1;
+ bool ea = (syndrome >> 9) & 1;
+ bool s1ptw = (syndrome >> 7) & 1;
+ uint32_t ifsc = (syndrome >> 0) & 0x3f;
+
+ trace_hvf_insn_abort(env->pc, set, fnv, ea, s1ptw, ifsc);
+
+ /* fall through */
+ }
default:
cpu_synchronize_state(cpu);
trace_hvf_exit(syndrome, ec, env->pc);
diff --git a/target/arm/hvf/trace-events b/target/arm/hvf/trace-events
index 29387780e3f..b0d3d7bd322 100644
--- a/target/arm/hvf/trace-events
+++ b/target/arm/hvf/trace-events
@@ -3,6 +3,7 @@ hvf_unhandled_sysreg_write(uint64_t pc, uint32_t reg, uint32_t op0, uint32_t op1
hvf_inject_fiq(void) "injecting FIQ"
hvf_inject_irq(void) "injecting IRQ"
hvf_data_abort(uint64_t va, uint64_t pa, bool isv, bool iswrite, bool s1ptw, uint32_t len, uint32_t srt) "data abort: [va=0x%016"PRIx64" pa=0x%016"PRIx64" isv=%d iswrite=%d s1ptw=%d len=%d srt=%d]"
+hvf_insn_abort(uint64_t pc, uint32_t set, bool fnv, bool ea, bool s1ptw, uint32_t ifsc) "insn abort: [pc=0x%"PRIx64" set=%d fnv=%d ea=%d s1ptw=%d ifsc=%d]"
hvf_sysreg_read(uint32_t reg, uint32_t op0, uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2, uint64_t val) "sysreg read 0x%08x (op0=%d op1=%d crn=%d crm=%d op2=%d) = 0x%016"PRIx64
hvf_sysreg_write(uint32_t reg, uint32_t op0, uint32_t op1, uint32_t crn, uint32_t crm, uint32_t op2, uint64_t val) "sysreg write 0x%08x (op0=%d op1=%d crn=%d crm=%d op2=%d, val=0x%016"PRIx64")"
hvf_unknown_hvc(uint64_t pc, uint64_t x0) "pc=0x%"PRIx64" unknown HVC! 0x%016"PRIx64
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 31/59] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (29 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 30/59] accel/hvf: Trace prefetch abort Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect() Philippe Mathieu-Daudé
` (28 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 3 +++
accel/hvf/hvf-all.c | 25 +++++++++++++++++++++++++
accel/hvf/trace-events | 1 +
3 files changed, 29 insertions(+)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 3d2be4092ef..5a57691885f 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -89,6 +89,9 @@ int hvf_arch_get_registers(CPUState *);
/* Must be called by the owning thread */
void hvf_arch_update_guest_debug(CPUState *cpu);
+void hvf_protect_clean_range(hwaddr addr, size_t size);
+void hvf_unprotect_dirty_range(hwaddr addr, size_t size);
+
struct hvf_sw_breakpoint {
vaddr pc;
vaddr saved_insn;
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 0a4b498e836..e13abddbd9c 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -58,6 +58,31 @@ void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
abort();
}
+static void do_hv_vm_protect(hwaddr start, size_t size,
+ hv_memory_flags_t flags)
+{
+ hv_return_t ret;
+
+ trace_hvf_vm_protect(start, size, flags,
+ flags & HV_MEMORY_READ ? 'R' : '-',
+ flags & HV_MEMORY_WRITE ? 'W' : '-',
+ flags & HV_MEMORY_EXEC ? 'X' : '-');
+
+ ret = hv_vm_protect(start, size, flags);
+ assert_hvf_ok(ret);
+}
+
+void hvf_protect_clean_range(hwaddr addr, size_t size)
+{
+ do_hv_vm_protect(addr, size, HV_MEMORY_READ | HV_MEMORY_EXEC);
+}
+
+void hvf_unprotect_dirty_range(hwaddr addr, size_t size)
+{
+ do_hv_vm_protect(addr, size,
+ HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
+}
+
static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags)
{
struct mac_slot *macslot;
diff --git a/accel/hvf/trace-events b/accel/hvf/trace-events
index 2fd3e127c74..f989da59492 100644
--- a/accel/hvf/trace-events
+++ b/accel/hvf/trace-events
@@ -5,3 +5,4 @@
# hvf-accel-ops.c
hvf_vm_map(uint64_t paddr, uint64_t size, void *vaddr, uint8_t flags, const char r, const char w, const char e) "paddr:0x%016"PRIx64" size:0x%08"PRIx64" vaddr:%p flags:0x%02x/%c%c%c"
hvf_vm_unmap(uint64_t paddr, uint64_t size) "paddr:0x%016"PRIx64" size:0x%08"PRIx64
+hvf_vm_protect(uint64_t paddr, size_t size, uint8_t flags, const char r, const char w, const char e) "paddr:0x%016"PRIx64" size:0x%08zx flags:0x%02x/%c%c%c"
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (30 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 31/59] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:26 ` Peter Maydell
2025-10-28 11:44 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault() Philippe Mathieu-Daudé
` (27 subsequent siblings)
59 siblings, 2 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
hv_vm_protect() arguments must be aligned to host page.
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
accel/hvf/hvf-all.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index e13abddbd9c..2efecdc9f40 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -11,6 +11,7 @@
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "accel/accel-ops.h"
+#include "exec/cpu-common.h"
#include "system/address-spaces.h"
#include "system/memory.h"
#include "system/hvf.h"
@@ -67,6 +68,8 @@ static void do_hv_vm_protect(hwaddr start, size_t size,
flags & HV_MEMORY_READ ? 'R' : '-',
flags & HV_MEMORY_WRITE ? 'W' : '-',
flags & HV_MEMORY_EXEC ? 'X' : '-');
+ g_assert(!((uintptr_t)start & ~qemu_real_host_page_mask()));
+ g_assert(!(size & ~qemu_real_host_page_mask()));
ret = hv_vm_protect(start, size, flags);
assert_hvf_ok(ret);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect()
2025-10-28 5:42 ` [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect() Philippe Mathieu-Daudé
@ 2025-10-28 11:26 ` Peter Maydell
2025-10-28 11:44 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:26 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 06:05, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> hv_vm_protect() arguments must be aligned to host page.
>
> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> accel/hvf/hvf-all.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
> index e13abddbd9c..2efecdc9f40 100644
> --- a/accel/hvf/hvf-all.c
> +++ b/accel/hvf/hvf-all.c
> @@ -11,6 +11,7 @@
> #include "qemu/osdep.h"
> #include "qemu/error-report.h"
> #include "accel/accel-ops.h"
> +#include "exec/cpu-common.h"
> #include "system/address-spaces.h"
> #include "system/memory.h"
> #include "system/hvf.h"
> @@ -67,6 +68,8 @@ static void do_hv_vm_protect(hwaddr start, size_t size,
> flags & HV_MEMORY_READ ? 'R' : '-',
> flags & HV_MEMORY_WRITE ? 'W' : '-',
> flags & HV_MEMORY_EXEC ? 'X' : '-');
> + g_assert(!((uintptr_t)start & ~qemu_real_host_page_mask()));
> + g_assert(!(size & ~qemu_real_host_page_mask()));
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect()
2025-10-28 5:42 ` [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect() Philippe Mathieu-Daudé
2025-10-28 11:26 ` Peter Maydell
@ 2025-10-28 11:44 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 11:44 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> hv_vm_protect() arguments must be aligned to host page.
>
> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> accel/hvf/hvf-all.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
> index e13abddbd9c..2efecdc9f40 100644
> --- a/accel/hvf/hvf-all.c
> +++ b/accel/hvf/hvf-all.c
> @@ -11,6 +11,7 @@
> #include "qemu/osdep.h"
> #include "qemu/error-report.h"
> #include "accel/accel-ops.h"
> +#include "exec/cpu-common.h"
> #include "system/address-spaces.h"
> #include "system/memory.h"
> #include "system/hvf.h"
> @@ -67,6 +68,8 @@ static void do_hv_vm_protect(hwaddr start, size_t size,
> flags & HV_MEMORY_READ ? 'R' : '-',
> flags & HV_MEMORY_WRITE ? 'W' : '-',
> flags & HV_MEMORY_EXEC ? 'X' : '-');
> + g_assert(!((uintptr_t)start & ~qemu_real_host_page_mask()));
> + g_assert(!(size & ~qemu_real_host_page_mask()));
>
> ret = hv_vm_protect(start, size, flags);
> assert_hvf_ok(ret);
You should call qemu_real_host_page_mask only once.
Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (31 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 32/59] accel/hvf: Enforce host alignment in hv_vm_protect() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:28 ` Peter Maydell
2025-10-28 11:47 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 34/59] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
` (26 subsequent siblings)
59 siblings, 2 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/i386/hvf/hvf.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 16febbac48f..c0b2352b988 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -76,7 +76,7 @@
#include "qemu/main-loop.h"
#include "qemu/accel.h"
#include "target/i386/cpu.h"
-#include "exec/target_page.h"
+#include "exec/cpu-common.h"
static Error *invtsc_mig_blocker;
@@ -137,9 +137,9 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
if (write && slot) {
if (slot->flags & HVF_SLOT_LOG) {
- uint64_t dirty_page_start = gpa & ~(TARGET_PAGE_SIZE - 1u);
+ uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
memory_region_set_dirty(slot->region, gpa - slot->start, 1);
- hv_vm_protect(dirty_page_start, TARGET_PAGE_SIZE,
+ hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
}
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault()
2025-10-28 5:42 ` [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault() Philippe Mathieu-Daudé
@ 2025-10-28 11:28 ` Peter Maydell
2025-11-03 10:00 ` Philippe Mathieu-Daudé
2025-10-28 11:47 ` Richard Henderson
1 sibling, 1 reply; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:28 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 06:06, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> target/i386/hvf/hvf.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
> index 16febbac48f..c0b2352b988 100644
> --- a/target/i386/hvf/hvf.c
> +++ b/target/i386/hvf/hvf.c
> @@ -76,7 +76,7 @@
> #include "qemu/main-loop.h"
> #include "qemu/accel.h"
> #include "target/i386/cpu.h"
> -#include "exec/target_page.h"
> +#include "exec/cpu-common.h"
>
> static Error *invtsc_mig_blocker;
>
> @@ -137,9 +137,9 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
>
> if (write && slot) {
> if (slot->flags & HVF_SLOT_LOG) {
> - uint64_t dirty_page_start = gpa & ~(TARGET_PAGE_SIZE - 1u);
> + uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
> memory_region_set_dirty(slot->region, gpa - slot->start, 1);
> - hv_vm_protect(dirty_page_start, TARGET_PAGE_SIZE,
> + hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
> HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
> }
> }
I guess we're guaranteed that the host page and TARGET_PAGE_SIZE
are the same thing here (so it doesn't matter that we put
the assert in first and then fix this) ?
On that assumption
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread* Re: [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault()
2025-10-28 11:28 ` Peter Maydell
@ 2025-11-03 10:00 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-11-03 10:00 UTC (permalink / raw)
To: Peter Maydell
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On 28/10/25 12:28, Peter Maydell wrote:
> On Tue, 28 Oct 2025 at 06:06, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> target/i386/hvf/hvf.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
>> index 16febbac48f..c0b2352b988 100644
>> --- a/target/i386/hvf/hvf.c
>> +++ b/target/i386/hvf/hvf.c
>> @@ -76,7 +76,7 @@
>> #include "qemu/main-loop.h"
>> #include "qemu/accel.h"
>> #include "target/i386/cpu.h"
>> -#include "exec/target_page.h"
>> +#include "exec/cpu-common.h"
>>
>> static Error *invtsc_mig_blocker;
>>
>> @@ -137,9 +137,9 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
>>
>> if (write && slot) {
>> if (slot->flags & HVF_SLOT_LOG) {
>> - uint64_t dirty_page_start = gpa & ~(TARGET_PAGE_SIZE - 1u);
>> + uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
>> memory_region_set_dirty(slot->region, gpa - slot->start, 1);
>> - hv_vm_protect(dirty_page_start, TARGET_PAGE_SIZE,
>> + hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
>> HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
>> }
>> }
>
> I guess we're guaranteed that the host page and TARGET_PAGE_SIZE
> are the same thing here (so it doesn't matter that we put
> the assert in first and then fix this) ?
Yes, but clearer to re-order before previous patch to avoid
any doubt.
>
> On that assumption
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Thanks!
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault()
2025-10-28 5:42 ` [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault() Philippe Mathieu-Daudé
2025-10-28 11:28 ` Peter Maydell
@ 2025-10-28 11:47 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 11:47 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> target/i386/hvf/hvf.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
> index 16febbac48f..c0b2352b988 100644
> --- a/target/i386/hvf/hvf.c
> +++ b/target/i386/hvf/hvf.c
> @@ -76,7 +76,7 @@
> #include "qemu/main-loop.h"
> #include "qemu/accel.h"
> #include "target/i386/cpu.h"
> -#include "exec/target_page.h"
> +#include "exec/cpu-common.h"
>
> static Error *invtsc_mig_blocker;
>
> @@ -137,9 +137,9 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
>
> if (write && slot) {
> if (slot->flags & HVF_SLOT_LOG) {
> - uint64_t dirty_page_start = gpa & ~(TARGET_PAGE_SIZE - 1u);
> + uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
> memory_region_set_dirty(slot->region, gpa - slot->start, 1);
> - hv_vm_protect(dirty_page_start, TARGET_PAGE_SIZE,
> + hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
> HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
> }
> }
Call qemu_real_host_page_size once -- page_mask is -size.
We could get away with TARGET_PAGE_SIZE here, due to x86 and it's fixed 4k page size. But
it's better for consistency.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 34/59] target/i386/hvf: Use hvf_unprotect_page
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (32 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 33/59] target/i386/hvf: Use host page alignment in ept_emulation_fault() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:29 ` Peter Maydell
2025-10-28 5:42 ` [PATCH v3 35/59] target/i386/hvf: Use address_space_translate in ept_emulation_fault Philippe Mathieu-Daudé
` (25 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/i386/hvf/hvf.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index c0b2352b988..1e92e9b707b 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -139,8 +139,8 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
if (slot->flags & HVF_SLOT_LOG) {
uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
memory_region_set_dirty(slot->region, gpa - slot->start, 1);
- hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
- HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
+ hvf_unprotect_dirty_range(dirty_page_start,
+ qemu_real_host_page_size());
}
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 34/59] target/i386/hvf: Use hvf_unprotect_page
2025-10-28 5:42 ` [PATCH v3 34/59] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
@ 2025-10-28 11:29 ` Peter Maydell
0 siblings, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 11:29 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 06:06, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> From: Richard Henderson <richard.henderson@linaro.org>
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> target/i386/hvf/hvf.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
> index c0b2352b988..1e92e9b707b 100644
> --- a/target/i386/hvf/hvf.c
> +++ b/target/i386/hvf/hvf.c
> @@ -139,8 +139,8 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
> if (slot->flags & HVF_SLOT_LOG) {
> uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
> memory_region_set_dirty(slot->region, gpa - slot->start, 1);
> - hv_vm_protect(dirty_page_start, qemu_real_host_page_size(),
> - HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
> + hvf_unprotect_dirty_range(dirty_page_start,
> + qemu_real_host_page_size());
> }
> }
Subject says hvf_unprotect_page, code uses hvf_unprotect_dirty_range.
I assume we can just fix the Subject.
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 35/59] target/i386/hvf: Use address_space_translate in ept_emulation_fault
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (33 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 34/59] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 36/59] accel/hvf: Simplify hvf_log_* Philippe Mathieu-Daudé
` (24 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
The hvf_slot structure is a poor replacement for properly
looking up a memory region in the address space.
Use memory_region_get_dirty_log_mask instead of HVF_SLOT_LOG.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/i386/hvf/hvf.c | 37 +++++++++++++++++++------------------
1 file changed, 19 insertions(+), 18 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 1e92e9b707b..b0c3fb97864 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -119,9 +119,12 @@ void hvf_handle_io(CPUState *env, uint16_t port, void *buffer,
}
}
-static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
+static bool ept_emulation_fault(CPUState *cs, uint64_t gpa, uint64_t ept_qual)
{
- int read, write;
+ bool read, write;
+ MemoryRegion *mr;
+ hwaddr gpa_page = gpa & qemu_real_host_page_mask();
+ hwaddr xlat;
/* EPT fault on an instruction fetch doesn't make sense here */
if (ept_qual & EPT_VIOLATION_INST_FETCH) {
@@ -129,19 +132,22 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
}
/* EPT fault must be a read fault or a write fault */
- read = ept_qual & EPT_VIOLATION_DATA_READ ? 1 : 0;
- write = ept_qual & EPT_VIOLATION_DATA_WRITE ? 1 : 0;
- if ((read | write) == 0) {
+ read = ept_qual & EPT_VIOLATION_DATA_READ;
+ write = ept_qual & EPT_VIOLATION_DATA_WRITE;
+ if (!read && !write) {
return false;
}
- if (write && slot) {
- if (slot->flags & HVF_SLOT_LOG) {
- uint64_t dirty_page_start = gpa & qemu_real_host_page_mask();
- memory_region_set_dirty(slot->region, gpa - slot->start, 1);
- hvf_unprotect_dirty_range(dirty_page_start,
- qemu_real_host_page_size());
- }
+ mr = address_space_translate(cpu_get_address_space(cs, X86ASIdx_MEM),
+ gpa_page, &xlat, NULL, write,
+ MEMTXATTRS_UNSPECIFIED);
+
+ /* Handle dirty page logging for ram. */
+ if (write && memory_region_get_dirty_log_mask(mr)) {
+ size_t page_size = qemu_real_host_page_size();
+
+ memory_region_set_dirty(mr, gpa_page + xlat, page_size);
+ hvf_unprotect_dirty_range(gpa_page, page_size);
}
/*
@@ -154,9 +160,6 @@ static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept_qual)
return false;
}
- if (!slot) {
- return true;
- }
if (!memory_region_is_ram(slot->region) &&
!(read && memory_region_is_romd(slot->region))) {
return true;
@@ -762,7 +765,6 @@ static int hvf_handle_vmexit(CPUState *cpu)
/* Need to check if MMIO or unmapped fault */
case EXIT_REASON_EPT_FAULT:
{
- hvf_slot *slot;
uint64_t gpa = rvmcs(cpu->accel->fd, VMCS_GUEST_PHYSICAL_ADDRESS);
if (((idtvec_info & VMCS_IDT_VEC_VALID) == 0) &&
@@ -770,9 +772,8 @@ static int hvf_handle_vmexit(CPUState *cpu)
vmx_set_nmi_blocking(cpu);
}
- slot = hvf_find_overlap_slot(gpa, 1);
/* mmio */
- if (ept_emulation_fault(slot, gpa, exit_qual)) {
+ if (ept_emulation_fault(cpu, gpa, exit_qual)) {
struct x86_decode decode;
hvf_load_regs(cpu);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 36/59] accel/hvf: Simplify hvf_log_*
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (34 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 35/59] target/i386/hvf: Use address_space_translate in ept_emulation_fault Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 37/59] accel/hvf: Move hvf_log_sync to hvf_log_clear Philippe Mathieu-Daudé
` (23 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
Rely on the AddressSpace and MemoryRegion structures
rather than hvf_slot.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 3 ---
accel/hvf/hvf-all.c | 40 ++++++++++------------------------------
2 files changed, 10 insertions(+), 33 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 5a57691885f..ee7ab689f45 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -24,9 +24,6 @@ typedef hv_vcpu_t hvf_vcpuid;
typedef hv_vcpuid_t hvf_vcpuid;
#endif
-/* hvf_slot flags */
-#define HVF_SLOT_LOG (1 << 0)
-
typedef struct hvf_slot {
uint64_t start;
uint64_t size;
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 2efecdc9f40..361d658a186 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -203,45 +203,24 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
}
}
-static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on)
-{
- hvf_slot *slot;
-
- slot = hvf_find_overlap_slot(
- section->offset_within_address_space,
- int128_get64(section->size));
-
- /* protect region against writes; begin tracking it */
- if (on) {
- slot->flags |= HVF_SLOT_LOG;
- hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size,
- HV_MEMORY_READ | HV_MEMORY_EXEC);
- /* stop tracking region*/
- } else {
- slot->flags &= ~HVF_SLOT_LOG;
- hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size,
- HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
- }
-}
-
static void hvf_log_start(MemoryListener *listener,
MemoryRegionSection *section, int old, int new)
{
- if (old != 0) {
- return;
+ assert(new != 0);
+ if (old == 0) {
+ hvf_protect_clean_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
-
- hvf_set_dirty_tracking(section, 1);
}
static void hvf_log_stop(MemoryListener *listener,
MemoryRegionSection *section, int old, int new)
{
- if (new != 0) {
- return;
+ assert(old != 0);
+ if (new == 0) {
+ hvf_unprotect_dirty_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
-
- hvf_set_dirty_tracking(section, 0);
}
static void hvf_log_sync(MemoryListener *listener,
@@ -251,7 +230,8 @@ static void hvf_log_sync(MemoryListener *listener,
* sync of dirty pages is handled elsewhere; just make sure we keep
* tracking the region.
*/
- hvf_set_dirty_tracking(section, 1);
+ hvf_protect_clean_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
static void hvf_region_add(MemoryListener *listener,
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 37/59] accel/hvf: Move hvf_log_sync to hvf_log_clear
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (35 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 36/59] accel/hvf: Simplify hvf_log_* Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 38/59] accel/hvf: Simplify hvf_set_phys_mem Philippe Mathieu-Daudé
` (22 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
Right idea, wrong hook. log_sync is called before using
dirty bit data (which for hvf is already up-to-date),
whereas log_clear is called before cleaning the range.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
accel/hvf/hvf-all.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 361d658a186..4b0a1af9fdc 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -223,12 +223,13 @@ static void hvf_log_stop(MemoryListener *listener,
}
}
-static void hvf_log_sync(MemoryListener *listener,
- MemoryRegionSection *section)
+static void hvf_log_clear(MemoryListener *listener,
+ MemoryRegionSection *section)
{
/*
- * sync of dirty pages is handled elsewhere; just make sure we keep
- * tracking the region.
+ * The dirty page bits within section are being cleared.
+ * Some number of those pages may have been dirtied and
+ * the write permission enabled. Reset the range read-only.
*/
hvf_protect_clean_range(section->offset_within_address_space,
int128_get64(section->size));
@@ -253,7 +254,7 @@ static MemoryListener hvf_memory_listener = {
.region_del = hvf_region_del,
.log_start = hvf_log_start,
.log_stop = hvf_log_stop,
- .log_sync = hvf_log_sync,
+ .log_clear = hvf_log_clear,
};
static int hvf_accel_init(AccelState *as, MachineState *ms)
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 38/59] accel/hvf: Simplify hvf_set_phys_mem
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (36 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 37/59] accel/hvf: Move hvf_log_sync to hvf_log_clear Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 39/59] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot Philippe Mathieu-Daudé
` (21 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
All of the complicated parts of updating the address space
are handled by address_space_update_topology_pass.
Do not create or use hvf_slot structures.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
accel/hvf/hvf-all.c | 111 +++++++-------------------------------------
1 file changed, 17 insertions(+), 94 deletions(-)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 4b0a1af9fdc..97b367bd788 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -86,45 +86,16 @@ void hvf_unprotect_dirty_range(hwaddr addr, size_t size)
HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
}
-static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags)
-{
- struct mac_slot *macslot;
- hv_return_t ret;
-
- macslot = &mac_slots[slot->slot_id];
-
- if (macslot->present) {
- if (macslot->size != slot->size) {
- macslot->present = 0;
- trace_hvf_vm_unmap(macslot->gpa_start, macslot->size);
- ret = hv_vm_unmap(macslot->gpa_start, macslot->size);
- assert_hvf_ok(ret);
- }
- }
-
- if (!slot->size) {
- return 0;
- }
-
- macslot->present = 1;
- macslot->gpa_start = slot->start;
- macslot->size = slot->size;
- trace_hvf_vm_map(slot->start, slot->size, slot->mem, flags,
- flags & HV_MEMORY_READ ? 'R' : '-',
- flags & HV_MEMORY_WRITE ? 'W' : '-',
- flags & HV_MEMORY_EXEC ? 'X' : '-');
- ret = hv_vm_map(slot->mem, slot->start, slot->size, flags);
- assert_hvf_ok(ret);
- return 0;
-}
-
static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
{
- hvf_slot *mem;
MemoryRegion *area = section->mr;
bool writable = !area->readonly && !area->rom_device;
hv_memory_flags_t flags;
uint64_t page_size = qemu_real_host_page_size();
+ uint64_t gva = section->offset_within_address_space;
+ uint64_t size = int128_get64(section->size);
+ hv_return_t ret;
+ void *mem;
if (!memory_region_is_ram(area)) {
if (writable) {
@@ -138,69 +109,28 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
}
}
- if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) ||
- !QEMU_IS_ALIGNED(section->offset_within_address_space, page_size)) {
+ if (!QEMU_IS_ALIGNED(size, page_size) ||
+ !QEMU_IS_ALIGNED(gva, page_size)) {
/* Not page aligned, so we can not map as RAM */
add = false;
}
- mem = hvf_find_overlap_slot(
- section->offset_within_address_space,
- int128_get64(section->size));
-
- if (mem && add) {
- if (mem->size == int128_get64(section->size) &&
- mem->start == section->offset_within_address_space &&
- mem->mem == (memory_region_get_ram_ptr(area) +
- section->offset_within_region)) {
- return; /* Same region was attempted to register, go away. */
- }
- }
-
- /* Region needs to be reset. set the size to 0 and remap it. */
- if (mem) {
- mem->size = 0;
- if (do_hvf_set_memory(mem, 0)) {
- error_report("Failed to reset overlapping slot");
- abort();
- }
- }
-
if (!add) {
+ trace_hvf_vm_unmap(gva, size);
+ ret = hv_vm_unmap(gva, size);
+ assert_hvf_ok(ret);
return;
}
- if (area->readonly ||
- (!memory_region_is_ram(area) && memory_region_is_romd(area))) {
- flags = HV_MEMORY_READ | HV_MEMORY_EXEC;
- } else {
- flags = HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC;
- }
+ flags = HV_MEMORY_READ | HV_MEMORY_EXEC | (writable ? HV_MEMORY_WRITE : 0);
+ mem = memory_region_get_ram_ptr(area) + section->offset_within_region;
- /* Now make a new slot. */
- int x;
-
- for (x = 0; x < hvf_state->num_slots; ++x) {
- mem = &hvf_state->slots[x];
- if (!mem->size) {
- break;
- }
- }
-
- if (x == hvf_state->num_slots) {
- error_report("No free slots");
- abort();
- }
-
- mem->size = int128_get64(section->size);
- mem->mem = memory_region_get_ram_ptr(area) + section->offset_within_region;
- mem->start = section->offset_within_address_space;
- mem->region = area;
-
- if (do_hvf_set_memory(mem, flags)) {
- error_report("Error registering new memory slot");
- abort();
- }
+ trace_hvf_vm_map(gva, size, mem, flags,
+ flags & HV_MEMORY_READ ? 'R' : '-',
+ flags & HV_MEMORY_WRITE ? 'W' : '-',
+ flags & HV_MEMORY_EXEC ? 'X' : '-');
+ ret = hv_vm_map(mem, gva, size, flags);
+ assert_hvf_ok(ret);
}
static void hvf_log_start(MemoryListener *listener,
@@ -259,7 +189,6 @@ static MemoryListener hvf_memory_listener = {
static int hvf_accel_init(AccelState *as, MachineState *ms)
{
- int x;
hv_return_t ret;
HVFState *s = HVF_STATE(as);
int pa_range = 36;
@@ -280,12 +209,6 @@ static int hvf_accel_init(AccelState *as, MachineState *ms)
}
assert_hvf_ok(ret);
- s->num_slots = ARRAY_SIZE(s->slots);
- for (x = 0; x < s->num_slots; ++x) {
- s->slots[x].size = 0;
- s->slots[x].slot_id = x;
- }
-
QTAILQ_INIT(&s->hvf_sw_breakpoints);
hvf_state = s;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 39/59] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (37 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 38/59] accel/hvf: Simplify hvf_set_phys_mem Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 40/59] accel/hvf: Remove mac_slots Philippe Mathieu-Daudé
` (20 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
These are now unused.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 13 -------------
accel/hvf/hvf-accel-ops.c | 14 --------------
2 files changed, 27 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index ee7ab689f45..d842d4b2b99 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -24,15 +24,6 @@ typedef hv_vcpu_t hvf_vcpuid;
typedef hv_vcpuid_t hvf_vcpuid;
#endif
-typedef struct hvf_slot {
- uint64_t start;
- uint64_t size;
- uint8_t *mem;
- int slot_id;
- uint32_t flags;
- MemoryRegion *region;
-} hvf_slot;
-
typedef struct hvf_vcpu_caps {
uint64_t vmx_cap_pinbased;
uint64_t vmx_cap_procbased;
@@ -45,9 +36,6 @@ typedef struct hvf_vcpu_caps {
struct HVFState {
AccelState parent_obj;
- hvf_slot slots[32];
- int num_slots;
-
hvf_vcpu_caps *hvf_caps;
uint64_t vtimer_offset;
QTAILQ_HEAD(, hvf_sw_breakpoint) hvf_sw_breakpoints;
@@ -70,7 +58,6 @@ void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
const char *hvf_return_string(hv_return_t ret);
int hvf_arch_init(void);
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
-hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t);
void hvf_kick_vcpu_thread(CPUState *cpu);
/* Must be called by the owning thread */
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index 3e5feecd8a7..bbb0b385fe9 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -64,20 +64,6 @@ HVFState *hvf_state;
/* Memory slots */
-hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size)
-{
- hvf_slot *slot;
- int x;
- for (x = 0; x < hvf_state->num_slots; ++x) {
- slot = &hvf_state->slots[x];
- if (slot->size && start < (slot->start + slot->size) &&
- (start + size) > slot->start) {
- return slot;
- }
- }
- return NULL;
-}
-
static void do_hvf_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
{
if (!cpu->vcpu_dirty) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 40/59] accel/hvf: Remove mac_slots
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (38 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 39/59] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 41/59] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
` (19 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
This data structure is no longer used.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
accel/hvf/hvf-all.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 97b367bd788..53efd54b97a 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -22,15 +22,6 @@
bool hvf_allowed;
-struct mac_slot {
- int present;
- uint64_t size;
- uint64_t gpa_start;
- uint64_t gva;
-};
-
-struct mac_slot mac_slots[32];
-
const char *hvf_return_string(hv_return_t ret)
{
switch (ret) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 41/59] target/arm/hvf: Implement dirty page tracking
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (39 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 40/59] accel/hvf: Remove mac_slots Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:58 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do Philippe Mathieu-Daudé
` (18 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
From: Richard Henderson <richard.henderson@linaro.org>
Notice writes to pages which are being monitored. Mark the page dirty,
re-enable writes, and retry the instruction without emulation.
Assert the fault is not from a stage1 page table walk.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
v3: TARGET_PAGE_SIZE/MASK -> host page size/mask (rth)
---
target/arm/hvf/hvf.c | 52 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 43 insertions(+), 9 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index de1e8fb8a05..da2f4cf2e9c 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1869,9 +1869,10 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
uint32_t srt = (syndrome >> 16) & 0x1f;
uint32_t cm = (syndrome >> 8) & 0x1;
uint64_t val = 0;
+ uint64_t ipa = excp->physical_address;
+ AddressSpace *as = cpu_get_address_space(cpu, ARMASIdx_NS);
- trace_hvf_data_abort(excp->virtual_address,
- excp->physical_address, isv,
+ trace_hvf_data_abort(excp->virtual_address, ipa, isv,
iswrite, s1ptw, len, srt);
if (cm) {
@@ -1880,23 +1881,56 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
break;
}
+ /* Handle dirty page logging for ram. */
+ if (iswrite) {
+ hwaddr xlat;
+ MemoryRegion *mr = address_space_translate(as, ipa, &xlat,
+ NULL, true,
+ MEMTXATTRS_UNSPECIFIED);
+ if (memory_region_is_ram(mr)) {
+ uint64_t ipa_page = ipa & qemu_real_host_page_mask();
+
+ /* TODO: Inject exception to the guest. */
+ assert(!mr->readonly);
+
+ if (memory_region_get_dirty_log_mask(mr)) {
+ size_t page_size = qemu_real_host_page_size();
+
+ memory_region_set_dirty(mr, ipa_page + xlat, page_size);
+ hvf_unprotect_dirty_range(ipa_page, page_size);
+ }
+
+ /* Retry with page writes enabled. */
+ break;
+ }
+ }
+
+ /*
+ * TODO: If s1ptw, this is an error in the guest os page tables.
+ * Inject the exception into the guest.
+ */
+ assert(!s1ptw);
+
+ /*
+ * TODO: ISV will be 0 for SIMD or SVE accesses.
+ * Inject the exception into the guest.
+ */
assert(isv);
+ /*
+ * Emulate MMIO.
+ * TODO: Inject faults for errors.
+ */
if (iswrite) {
val = hvf_get_reg(cpu, srt);
- address_space_write(&address_space_memory,
- excp->physical_address,
- MEMTXATTRS_UNSPECIFIED, &val, len);
+ address_space_write(as, ipa, MEMTXATTRS_UNSPECIFIED, &val, len);
} else {
- address_space_read(&address_space_memory,
- excp->physical_address,
- MEMTXATTRS_UNSPECIFIED, &val, len);
+ address_space_read(as, ipa, MEMTXATTRS_UNSPECIFIED, &val, len);
if (sse) {
val = sextract64(val, 0, len * 8);
}
hvf_set_reg(cpu, srt, val);
}
-
advance_pc = true;
break;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 41/59] target/arm/hvf: Implement dirty page tracking
2025-10-28 5:42 ` [PATCH v3 41/59] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
@ 2025-10-28 11:58 ` Richard Henderson
0 siblings, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 11:58 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> + if (memory_region_is_ram(mr)) {
> + uint64_t ipa_page = ipa & qemu_real_host_page_mask();
> +
> + /* TODO: Inject exception to the guest. */
> + assert(!mr->readonly);
> +
> + if (memory_region_get_dirty_log_mask(mr)) {
> + size_t page_size = qemu_real_host_page_size();
> +
Call qemu_real_host_page_size once; mask = -size.
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (40 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 41/59] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 11:51 ` Alex Bennée
2025-10-28 11:59 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect() Philippe Mathieu-Daudé
` (17 subsequent siblings)
59 siblings, 2 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Avoid sleeping vCPU thread for any pending work, not just IRQs.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index da2f4cf2e9c..1abb4a7d7a9 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1737,8 +1737,11 @@ static void hvf_wfi(CPUState *cpu)
uint64_t nanos;
uint32_t cntfrq;
- if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIQ)) {
- /* Interrupt pending, no need to wait */
+ if (cpu_has_work(cpu)) {
+ /*
+ * Don't bother to go into our "low power state" if
+ * we would just wake up immediately.
+ */
return;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do
2025-10-28 5:42 ` [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do Philippe Mathieu-Daudé
@ 2025-10-28 11:51 ` Alex Bennée
2025-10-28 11:59 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Alex Bennée @ 2025-10-28 11:51 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Peter Maydell,
Alexander Graf, Richard Henderson
Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> Avoid sleeping vCPU thread for any pending work, not just IRQs.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do
2025-10-28 5:42 ` [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do Philippe Mathieu-Daudé
2025-10-28 11:51 ` Alex Bennée
@ 2025-10-28 11:59 ` Richard Henderson
1 sibling, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 11:59 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Avoid sleeping vCPU thread for any pending work, not just IRQs.
>
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
> target/arm/hvf/hvf.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (41 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 42/59] accel/hvf: Skip WFI if CPU has work to do Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:01 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 44/59] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU Philippe Mathieu-Daudé
` (16 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Return to the main loop where we'll be waken again.
This avoid a tricky race with signals introduced in
commit 219c101fa7f ("Add HVF WFI handler").
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 1 -
accel/hvf/hvf-accel-ops.c | 5 +--
target/arm/hvf/hvf.c | 74 +++------------------------------------
3 files changed, 8 insertions(+), 72 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index d842d4b2b99..c8e407a1463 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -47,7 +47,6 @@ struct AccelCPUState {
#ifdef __aarch64__
hv_vcpu_exit_t *exit;
bool vtimer_masked;
- sigset_t unblock_ipi_mask;
bool guest_debug_enabled;
#endif
};
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index bbb0b385fe9..e9dd2d24745 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -128,14 +128,15 @@ static int hvf_init_vcpu(CPUState *cpu)
cpu->accel = g_new0(AccelCPUState, 1);
/* init cpu signals */
+ sigset_t unblock_ipi_mask;
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigact.sa_handler = dummy_signal;
sigaction(SIG_IPI, &sigact, NULL);
- pthread_sigmask(SIG_BLOCK, NULL, &cpu->accel->unblock_ipi_mask);
- sigdelset(&cpu->accel->unblock_ipi_mask, SIG_IPI);
+ pthread_sigmask(SIG_BLOCK, NULL, &unblock_ipi_mask);
+ sigdelset(&unblock_ipi_mask, SIG_IPI);
#ifdef __aarch64__
r = hv_vcpu_create(&cpu->accel->fd,
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 1abb4a7d7a9..5fc9b217a11 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -301,7 +301,7 @@ void hvf_arm_init_debug(void)
#define TMR_CTL_IMASK (1 << 1)
#define TMR_CTL_ISTATUS (1 << 2)
-static void hvf_wfi(CPUState *cpu);
+static int hvf_wfi(CPUState *cpu);
static uint32_t chosen_ipa_bit_size;
@@ -1703,81 +1703,17 @@ static uint64_t hvf_vtimer_val_raw(void)
return mach_absolute_time() - hvf_state->vtimer_offset;
}
-static uint64_t hvf_vtimer_val(void)
+static int hvf_wfi(CPUState *cpu)
{
- if (!runstate_is_running()) {
- /* VM is paused, the vtimer value is in vtimer.vtimer_val */
- return vtimer.vtimer_val;
- }
-
- return hvf_vtimer_val_raw();
-}
-
-static void hvf_wait_for_ipi(CPUState *cpu, struct timespec *ts)
-{
- /*
- * Use pselect to sleep so that other threads can IPI us while we're
- * sleeping.
- */
- qatomic_set_mb(&cpu->thread_kicked, false);
- bql_unlock();
- pselect(0, 0, 0, 0, ts, &cpu->accel->unblock_ipi_mask);
- bql_lock();
-}
-
-static void hvf_wfi(CPUState *cpu)
-{
- ARMCPU *arm_cpu = ARM_CPU(cpu);
- struct timespec ts;
- hv_return_t r;
- uint64_t ctl;
- uint64_t cval;
- int64_t ticks_to_sleep;
- uint64_t seconds;
- uint64_t nanos;
- uint32_t cntfrq;
-
if (cpu_has_work(cpu)) {
/*
* Don't bother to go into our "low power state" if
* we would just wake up immediately.
*/
- return;
+ return 0;
}
- r = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CTL_EL0, &ctl);
- assert_hvf_ok(r);
-
- if (!(ctl & 1) || (ctl & 2)) {
- /* Timer disabled or masked, just wait for an IPI. */
- hvf_wait_for_ipi(cpu, NULL);
- return;
- }
-
- r = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CVAL_EL0, &cval);
- assert_hvf_ok(r);
-
- ticks_to_sleep = cval - hvf_vtimer_val();
- if (ticks_to_sleep < 0) {
- return;
- }
-
- cntfrq = gt_cntfrq_period_ns(arm_cpu);
- seconds = muldiv64(ticks_to_sleep, cntfrq, NANOSECONDS_PER_SECOND);
- ticks_to_sleep -= muldiv64(seconds, NANOSECONDS_PER_SECOND, cntfrq);
- nanos = ticks_to_sleep * cntfrq;
-
- /*
- * Don't sleep for less than the time a context switch would take,
- * so that we can satisfy fast timer requests on the same CPU.
- * Measurements on M1 show the sweet spot to be ~2ms.
- */
- if (!seconds && nanos < (2 * SCALE_MS)) {
- return;
- }
-
- ts = (struct timespec) { seconds, nanos };
- hvf_wait_for_ipi(cpu, &ts);
+ return EXCP_HLT;
}
/* Must be called by the owning thread */
@@ -1967,7 +1903,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
case EC_WFX_TRAP:
advance_pc = true;
if (!(syndrome & WFX_IS_WFE)) {
- hvf_wfi(cpu);
+ ret = hvf_wfi(cpu);
}
break;
case EC_AA64_HVC:
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect()
2025-10-28 5:42 ` [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect() Philippe Mathieu-Daudé
@ 2025-10-28 12:01 ` Richard Henderson
2025-11-03 10:01 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:01 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> --- a/accel/hvf/hvf-accel-ops.c
> +++ b/accel/hvf/hvf-accel-ops.c
> @@ -128,14 +128,15 @@ static int hvf_init_vcpu(CPUState *cpu)
> cpu->accel = g_new0(AccelCPUState, 1);
>
> /* init cpu signals */
> + sigset_t unblock_ipi_mask;
Why introduce this? Surely it's unused...
> struct sigaction sigact;
>
> memset(&sigact, 0, sizeof(sigact));
> sigact.sa_handler = dummy_signal;
> sigaction(SIG_IPI, &sigact, NULL);
>
> - pthread_sigmask(SIG_BLOCK, NULL, &cpu->accel->unblock_ipi_mask);
> - sigdelset(&cpu->accel->unblock_ipi_mask, SIG_IPI);
> + pthread_sigmask(SIG_BLOCK, NULL, &unblock_ipi_mask);
> + sigdelset(&unblock_ipi_mask, SIG_IPI);
... apart from mere initialization.
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect()
2025-10-28 12:01 ` Richard Henderson
@ 2025-11-03 10:01 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-11-03 10:01 UTC (permalink / raw)
To: Richard Henderson, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 28/10/25 13:01, Richard Henderson wrote:
> On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
>> --- a/accel/hvf/hvf-accel-ops.c
>> +++ b/accel/hvf/hvf-accel-ops.c
>> @@ -128,14 +128,15 @@ static int hvf_init_vcpu(CPUState *cpu)
>> cpu->accel = g_new0(AccelCPUState, 1);
>> /* init cpu signals */
>> + sigset_t unblock_ipi_mask;
>
> Why introduce this? Surely it's unused...
>
>> struct sigaction sigact;
>> memset(&sigact, 0, sizeof(sigact));
>> sigact.sa_handler = dummy_signal;
>> sigaction(SIG_IPI, &sigact, NULL);
>> - pthread_sigmask(SIG_BLOCK, NULL, &cpu->accel->unblock_ipi_mask);
>> - sigdelset(&cpu->accel->unblock_ipi_mask, SIG_IPI);
>> + pthread_sigmask(SIG_BLOCK, NULL, &unblock_ipi_mask);
>> + sigdelset(&unblock_ipi_mask, SIG_IPI);
>
> ... apart from mere initialization.
Leftover (now removed).
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 44/59] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (42 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 43/59] accel/hvf: Implement WFI without using pselect() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 45/59] accel: Introduce AccelOpsClass::cpu_target_realize() hook Philippe Mathieu-Daudé
` (15 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Return EXCP_HLT to the main loop.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 5fc9b217a11..f9d983fa123 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -301,8 +301,6 @@ void hvf_arm_init_debug(void)
#define TMR_CTL_IMASK (1 << 1)
#define TMR_CTL_ISTATUS (1 << 2)
-static int hvf_wfi(CPUState *cpu);
-
static uint32_t chosen_ipa_bit_size;
typedef struct HVFVTimer {
@@ -1008,7 +1006,7 @@ static void hvf_psci_cpu_off(ARMCPU *arm_cpu)
* Returns 0 on success
* -1 when the PSCI call is unknown,
*/
-static bool hvf_handle_psci_call(CPUState *cpu)
+static bool hvf_handle_psci_call(CPUState *cpu, int *excp_ret)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
CPUARMState *env = &arm_cpu->env;
@@ -1091,9 +1089,8 @@ static bool hvf_handle_psci_call(CPUState *cpu)
ret = QEMU_PSCI_RET_INVALID_PARAMS;
break;
}
- /* Powerdown is not supported, we always go into WFI */
env->xregs[0] = 0;
- hvf_wfi(cpu);
+ *excp_ret = EXCP_HLT;
break;
case QEMU_PSCI_0_1_FN_MIGRATE:
case QEMU_PSCI_0_2_FN_MIGRATE:
@@ -1910,7 +1907,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
cpu_synchronize_state(cpu);
if (arm_is_psci_call(arm_cpu, EXCP_HVC)) {
/* Do NOT advance $pc for HVC */
- if (!hvf_handle_psci_call(cpu)) {
+ if (!hvf_handle_psci_call(cpu, &ret)) {
trace_hvf_unknown_hvc(env->pc, env->xregs[0]);
/* SMCCC 1.3 section 5.2 says every unknown SMCCC call returns -1 */
env->xregs[0] = -1;
@@ -1926,7 +1923,7 @@ static int hvf_handle_exception(CPUState *cpu, hv_vcpu_exit_exception_t *excp)
/* Secure Monitor Call exception, we need to advance $pc */
advance_pc = true;
- if (!hvf_handle_psci_call(cpu)) {
+ if (!hvf_handle_psci_call(cpu, &ret)) {
trace_hvf_unknown_smc(env->xregs[0]);
/* SMCCC 1.3 section 5.2 says every unknown SMCCC call returns -1 */
env->xregs[0] = -1;
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 45/59] accel: Introduce AccelOpsClass::cpu_target_realize() hook
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (43 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 44/59] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 46/59] accel/hvf: Add hvf_arch_cpu_realize() stubs Philippe Mathieu-Daudé
` (14 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé, Paolo Bonzini
Allow accelerators to set vCPU properties before its realization.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
include/accel/accel-cpu-ops.h | 1 +
accel/accel-common.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/accel/accel-cpu-ops.h b/include/accel/accel-cpu-ops.h
index 0674764914f..9c07a903ea0 100644
--- a/include/accel/accel-cpu-ops.h
+++ b/include/accel/accel-cpu-ops.h
@@ -34,6 +34,7 @@ struct AccelOpsClass {
/* initialization function called when accel is chosen */
void (*ops_init)(AccelClass *ac);
+ bool (*cpu_target_realize)(CPUState *cpu, Error **errp);
bool (*cpus_are_resettable)(void);
void (*cpu_reset_hold)(CPUState *cpu);
diff --git a/accel/accel-common.c b/accel/accel-common.c
index 850c5ab4b8e..eecb2a292af 100644
--- a/accel/accel-common.c
+++ b/accel/accel-common.c
@@ -106,6 +106,11 @@ bool accel_cpu_common_realize(CPUState *cpu, Error **errp)
if (acc->cpu_common_realize && !acc->cpu_common_realize(cpu, errp)) {
return false;
}
+ if (acc->ops
+ && acc->ops->cpu_target_realize
+ && !acc->ops->cpu_target_realize(cpu, errp)) {
+ return false;
+ }
return true;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 46/59] accel/hvf: Add hvf_arch_cpu_realize() stubs
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (44 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 45/59] accel: Introduce AccelOpsClass::cpu_target_realize() hook Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 47/59] target/arm: Create GTimers *after* features finalized / accel realized Philippe Mathieu-Daudé
` (13 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Implement HVF AccelOpsClass::cpu_target_realize() hook as
empty stubs. Target implementations will come separately.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
include/system/hvf_int.h | 2 ++
accel/hvf/hvf-accel-ops.c | 2 ++
target/arm/hvf/hvf.c | 5 +++++
target/i386/hvf/hvf.c | 5 +++++
4 files changed, 14 insertions(+)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index c8e407a1463..96790b49386 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -106,4 +106,6 @@ int hvf_update_guest_debug(CPUState *cpu);
*/
bool hvf_arch_supports_guest_debug(void);
+bool hvf_arch_cpu_realize(CPUState *cpu, Error **errp);
+
#endif
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index e9dd2d24745..28d50e23017 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -360,6 +360,8 @@ static void hvf_accel_ops_class_init(ObjectClass *oc, const void *data)
{
AccelOpsClass *ops = ACCEL_OPS_CLASS(oc);
+ ops->cpu_target_realize = hvf_arch_cpu_realize;
+
ops->create_vcpu_thread = hvf_start_vcpu_thread;
ops->kick_vcpu_thread = hvf_kick_vcpu_thread;
ops->handle_interrupt = generic_handle_interrupt;
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index f9d983fa123..b053bdd7cf2 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -972,6 +972,11 @@ int hvf_arch_init_vcpu(CPUState *cpu)
return 0;
}
+bool hvf_arch_cpu_realize(CPUState *cs, Error **errp)
+{
+ return true;
+}
+
void hvf_kick_vcpu_thread(CPUState *cpu)
{
hv_return_t ret;
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index b0c3fb97864..49f26169632 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -370,6 +370,11 @@ int hvf_arch_init_vcpu(CPUState *cpu)
return 0;
}
+bool hvf_arch_cpu_realize(CPUState *cs, Error **errp)
+{
+ return true;
+}
+
static void hvf_store_events(CPUState *cpu, uint32_t ins_len, uint64_t idtvec_info)
{
X86CPU *x86_cpu = X86_CPU(cpu);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 47/59] target/arm: Create GTimers *after* features finalized / accel realized
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (45 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 46/59] accel/hvf: Add hvf_arch_cpu_realize() stubs Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 48/59] target/arm/hvf: Really set Generic Timer counter frequency Philippe Mathieu-Daudé
` (12 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Call generic (including accelerator) cpu_realize() handlers
*before* setting @gt_cntfrq_hz default
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/cpu.c | 65 ++++++++++++++++++++++++------------------------
1 file changed, 33 insertions(+), 32 deletions(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 39292fb9bc1..b392374df98 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1636,26 +1636,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
return;
}
- if (!cpu->gt_cntfrq_hz) {
- /*
- * 0 means "the board didn't set a value, use the default". (We also
- * get here for the CONFIG_USER_ONLY case.)
- * ARMv8.6 and later CPUs architecturally must use a 1GHz timer; before
- * that it was an IMPDEF choice, and QEMU initially picked 62.5MHz,
- * which gives a 16ns tick period.
- *
- * We will use the back-compat value:
- * - for QEMU CPU types added before we standardized on 1GHz
- * - for versioned machine types with a version of 9.0 or earlier
- */
- if (arm_feature(env, ARM_FEATURE_BACKCOMPAT_CNTFRQ) ||
- cpu->backcompat_cntfrq) {
- cpu->gt_cntfrq_hz = GTIMER_BACKCOMPAT_HZ;
- } else {
- cpu->gt_cntfrq_hz = GTIMER_DEFAULT_HZ;
- }
- }
-
#ifndef CONFIG_USER_ONLY
/* The NVIC and M-profile CPU are two halves of a single piece of
* hardware; trying to use one without the other is a command line
@@ -1702,7 +1682,40 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
return;
}
}
+#endif
+ cpu_exec_realizefn(cs, &local_err);
+ if (local_err != NULL) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ arm_cpu_finalize_features(cpu, &local_err);
+ if (local_err != NULL) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ if (!cpu->gt_cntfrq_hz) {
+ /*
+ * 0 means "the board didn't set a value, use the default". (We also
+ * get here for the CONFIG_USER_ONLY case.)
+ * ARMv8.6 and later CPUs architecturally must use a 1GHz timer; before
+ * that it was an IMPDEF choice, and QEMU initially picked 62.5MHz,
+ * which gives a 16ns tick period.
+ *
+ * We will use the back-compat value:
+ * - for QEMU CPU types added before we standardized on 1GHz
+ * - for versioned machine types with a version of 9.0 or earlier
+ */
+ if (arm_feature(env, ARM_FEATURE_BACKCOMPAT_CNTFRQ) ||
+ cpu->backcompat_cntfrq) {
+ cpu->gt_cntfrq_hz = GTIMER_BACKCOMPAT_HZ;
+ } else {
+ cpu->gt_cntfrq_hz = GTIMER_DEFAULT_HZ;
+ }
+ }
+#ifndef CONFIG_USER_ONLY
{
uint64_t scale = gt_cntfrq_period_ns(cpu);
@@ -1723,18 +1736,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
}
#endif
- cpu_exec_realizefn(cs, &local_err);
- if (local_err != NULL) {
- error_propagate(errp, local_err);
- return;
- }
-
- arm_cpu_finalize_features(cpu, &local_err);
- if (local_err != NULL) {
- error_propagate(errp, local_err);
- return;
- }
-
#ifdef CONFIG_USER_ONLY
/*
* User mode relies on IC IVAU instructions to catch modification of
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 48/59] target/arm/hvf: Really set Generic Timer counter frequency
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (46 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 47/59] target/arm: Create GTimers *after* features finalized / accel realized Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 49/59] target/arm: Only allow disabling NEON when using TCG Philippe Mathieu-Daudé
` (11 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Setting ARMCPU::gt_cntfrq_hz in hvf_arch_init_vcpu() is
not correct because the timers have already be initialized
with the default frequency.
Set it earlier in the AccelOpsClass::cpu_target_realize()
handler instead, and assert the value is correct when
reaching hvf_arch_init_vcpu().
Fixes: a1477da3dde ("hvf: Add Apple Silicon support")
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/hvf/hvf.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index b053bdd7cf2..0788b20cc05 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -897,6 +897,13 @@ cleanup:
return ret;
}
+static uint64_t get_cntfrq_el0(void)
+{
+ uint64_t freq_hz = 0;
+ asm volatile("mrs %0, cntfrq_el0" : "=r"(freq_hz));
+ return freq_hz;
+}
+
int hvf_arch_init_vcpu(CPUState *cpu)
{
ARMCPU *arm_cpu = ARM_CPU(cpu);
@@ -908,7 +915,9 @@ int hvf_arch_init_vcpu(CPUState *cpu)
int i;
env->aarch64 = true;
- asm volatile("mrs %0, cntfrq_el0" : "=r"(arm_cpu->gt_cntfrq_hz));
+
+ /* system count frequency sanity check */
+ assert(arm_cpu->gt_cntfrq_hz == get_cntfrq_el0());
/* Allocate enough space for our sysreg sync */
arm_cpu->cpreg_indexes = g_renew(uint64_t, arm_cpu->cpreg_indexes,
@@ -974,6 +983,15 @@ int hvf_arch_init_vcpu(CPUState *cpu)
bool hvf_arch_cpu_realize(CPUState *cs, Error **errp)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+
+ /*
+ * We must set the counter frequency HVF will be using
+ * early, before arm_cpu_realizefn initializes the timers
+ * with it.
+ */
+ cpu->gt_cntfrq_hz = get_cntfrq_el0();
+
return true;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 49/59] target/arm: Only allow disabling NEON when using TCG
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (47 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 48/59] target/arm/hvf: Really set Generic Timer counter frequency Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size() Philippe Mathieu-Daudé
` (10 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Only allow disabling NEON when using TCG.
This avoids confusing user experience:
$ qemu-system-aarch64 -M virt -accel hvf \
-cpu host,neon=off,vfp=off,vfp-d32=off
qemu-system-aarch64: AArch64 CPUs must have both VFP and Neon or neither
$ qemu-system-aarch64 -M virt -accel hvf \
-cpu host,neon=off,vfp=off,vfp-d32=off
qemu-system-aarch64: ARM CPUs must have both VFP-D32 and Neon or neither
$ qemu-system-aarch64 -M virt -accel hvf \
-cpu host,neon=off,vfp=off,vfp-d32=off
qemu-system-aarch64: can't apply global host-arm-cpu.vfp-d32=off: Property 'host-arm-cpu.vfp-d32' not found
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/cpu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index b392374df98..eaf76532eca 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1460,7 +1460,7 @@ static void arm_cpu_post_init(Object *obj)
if (arm_feature(&cpu->env, ARM_FEATURE_NEON)) {
cpu->has_neon = true;
- if (!kvm_enabled()) {
+ if (tcg_enabled() || qtest_enabled()) {
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_neon_property);
}
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size()
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (48 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 49/59] target/arm: Only allow disabling NEON when using TCG Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:06 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length Philippe Mathieu-Daudé
` (9 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Do not abort in hvf_arm_get_default_ipa_bit_size()
and hvf_arm_get_max_ipa_bit_size() when the IPA can
not be fetched. Return 0 (and document it).
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf_arm.h | 11 +++++++++++
target/arm/hvf/hvf.c | 8 ++------
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/target/arm/hvf_arm.h b/target/arm/hvf_arm.h
index ea82f2691df..21a69e7d105 100644
--- a/target/arm/hvf_arm.h
+++ b/target/arm/hvf_arm.h
@@ -22,7 +22,18 @@ void hvf_arm_init_debug(void);
void hvf_arm_set_cpu_features_from_host(ARMCPU *cpu);
+/**
+ * hvf_arm_get_default_ipa_bit_size:
+ *
+ * Returns the default intermediate physical address bit length or 0 on error.
+ */
uint32_t hvf_arm_get_default_ipa_bit_size(void);
+
+/**
+ * hvf_arm_get_max_ipa_bit_size:
+ *
+ * Returns the maximum intermediate physical address bit length or 0 on error.
+ */
uint32_t hvf_arm_get_max_ipa_bit_size(void);
#endif
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 0788b20cc05..5b077744720 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -829,24 +829,20 @@ uint32_t hvf_arm_get_default_ipa_bit_size(void)
{
uint32_t default_ipa_size;
hv_return_t ret = hv_vm_config_get_default_ipa_size(&default_ipa_size);
- assert_hvf_ok(ret);
-
- return default_ipa_size;
+ return ret == HV_SUCCESS ? default_ipa_size : 0;
}
uint32_t hvf_arm_get_max_ipa_bit_size(void)
{
uint32_t max_ipa_size;
hv_return_t ret = hv_vm_config_get_max_ipa_size(&max_ipa_size);
- assert_hvf_ok(ret);
-
/*
* We clamp any IPA size we want to back the VM with to a valid PARange
* value so the guest doesn't try and map memory outside of the valid range.
* This logic just clamps the passed in IPA bit size to the first valid
* PARange value <= to it.
*/
- return round_down_to_parange_bit_size(max_ipa_size);
+ return ret == HV_SUCCESS ? round_down_to_parange_bit_size(max_ipa_size) : 0;
}
void hvf_arm_set_cpu_features_from_host(ARMCPU *cpu)
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size()
2025-10-28 5:42 ` [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size() Philippe Mathieu-Daudé
@ 2025-10-28 12:06 ` Richard Henderson
2026-01-18 22:03 ` Philippe Mathieu-Daudé
2026-01-20 7:10 ` Mohamed Mediouni
0 siblings, 2 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:06 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Do not abort in hvf_arm_get_default_ipa_bit_size()
> and hvf_arm_get_max_ipa_bit_size() when the IPA can
> not be fetched. Return 0 (and document it).
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> target/arm/hvf_arm.h | 11 +++++++++++
> target/arm/hvf/hvf.c | 8 ++------
> 2 files changed, 13 insertions(+), 6 deletions(-)
Doesn't this just lead to a nonsensical error_report, e.g.
-m and ,maxmem option values require an IPA range (XX bits) larger than the one supported
by the host (0 bits)
?
Is there a reasonable way to populate an Error return?
I guess this only happens with older versions of Darwin, because surely we can always
probe the supported IPA size...
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size()
2025-10-28 12:06 ` Richard Henderson
@ 2026-01-18 22:03 ` Philippe Mathieu-Daudé
2026-01-20 7:10 ` Mohamed Mediouni
1 sibling, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-01-18 22:03 UTC (permalink / raw)
To: Richard Henderson, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 28/10/25 13:06, Richard Henderson wrote:
> On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
>> Do not abort in hvf_arm_get_default_ipa_bit_size()
>> and hvf_arm_get_max_ipa_bit_size() when the IPA can
>> not be fetched. Return 0 (and document it).
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> target/arm/hvf_arm.h | 11 +++++++++++
>> target/arm/hvf/hvf.c | 8 ++------
>> 2 files changed, 13 insertions(+), 6 deletions(-)
>
> Doesn't this just lead to a nonsensical error_report, e.g.
>
> -m and ,maxmem option values require an IPA range (XX bits) larger than
> the one supported by the host (0 bits)
>
> ?
>
> Is there a reasonable way to populate an Error return?
> I guess this only happens with older versions of Darwin, because surely
> we can always probe the supported IPA size...
I suppose (it came from
https://gitlab.com/qemu-project/qemu/-/issues/2981). Let's drop this for
now.
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size()
2025-10-28 12:06 ` Richard Henderson
2026-01-18 22:03 ` Philippe Mathieu-Daudé
@ 2026-01-20 7:10 ` Mohamed Mediouni
1 sibling, 0 replies; 88+ messages in thread
From: Mohamed Mediouni @ 2026-01-20 7:10 UTC (permalink / raw)
To: Richard Henderson
Cc: Philippe Mathieu-Daudé, qemu-devel, Mads Ynddal,
Cameron Esfahani, qemu-arm, Roman Bolshakov, Akihiko Odaki,
Phil Dennis-Jordan, Peter Collingbourne, Peter Maydell,
Alexander Graf
[-- Attachment #1: Type: text/plain, Size: 383 bytes --]
> On 28. Oct 2025, at 13:06, Richard Henderson <richard.henderson@linaro.org> wrote:
>
> because surely we can always probe the supported IPA size.
APIs for that were added on macOS 13.
Prior to that release, the only safe thing to do was to assume 36-bit.
But since then, there has been macOS 14, 15 and 26, so the support policy might still allow dropping this...
[-- Attachment #2: Type: text/html, Size: 1213 bytes --]
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (49 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 50/59] target/arm/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size() Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:07 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 52/59] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks Philippe Mathieu-Daudé
` (8 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Emit a warning when HVF doesn't return the IPA bit length
and return -1 as "this accelerator is not usable", allowing
QEMU to try with the next one (when using '-accel hvf:tcg').
Reported-by: Ivan Krasilnikov
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2981
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/arm/virt.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 175023897a7..1d65fa471dc 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -3225,8 +3225,12 @@ static int virt_hvf_get_physical_address_range(MachineState *ms)
{
VirtMachineState *vms = VIRT_MACHINE(ms);
- int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
- int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
+ uint32_t default_ipa_size = hvf_arm_get_default_ipa_bit_size();
+ uint32_t max_ipa_size = hvf_arm_get_max_ipa_bit_size();
+ if (!default_ipa_size || !max_ipa_size) {
+ warn_report("HVF didn't report IPA bit length");
+ return -1;
+ }
/* We freeze the memory map to compute the highest gpa */
virt_set_memmap(vms, max_ipa_size);
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length
2025-10-28 5:42 ` [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length Philippe Mathieu-Daudé
@ 2025-10-28 12:07 ` Richard Henderson
2026-01-18 22:03 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:07 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Emit a warning when HVF doesn't return the IPA bit length
> and return -1 as "this accelerator is not usable", allowing
> QEMU to try with the next one (when using '-accel hvf:tcg').
>
> Reported-by: Ivan Krasilnikov
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2981
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> hw/arm/virt.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 175023897a7..1d65fa471dc 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -3225,8 +3225,12 @@ static int virt_hvf_get_physical_address_range(MachineState *ms)
> {
> VirtMachineState *vms = VIRT_MACHINE(ms);
>
> - int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
> - int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
> + uint32_t default_ipa_size = hvf_arm_get_default_ipa_bit_size();
> + uint32_t max_ipa_size = hvf_arm_get_max_ipa_bit_size();
> + if (!default_ipa_size || !max_ipa_size) {
> + warn_report("HVF didn't report IPA bit length");
> + return -1;
> + }
I suppose this goes back to the previous patch.
It might have been slightly less confusing to merge them, but the underlying questions
about when and how this can fail remain.
r~
^ permalink raw reply [flat|nested] 88+ messages in thread* Re: [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length
2025-10-28 12:07 ` Richard Henderson
@ 2026-01-18 22:03 ` Philippe Mathieu-Daudé
2026-01-19 12:13 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-01-18 22:03 UTC (permalink / raw)
To: Richard Henderson, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 28/10/25 13:07, Richard Henderson wrote:
> On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
>> Emit a warning when HVF doesn't return the IPA bit length
>> and return -1 as "this accelerator is not usable", allowing
>> QEMU to try with the next one (when using '-accel hvf:tcg').
>>
>> Reported-by: Ivan Krasilnikov
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2981
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> hw/arm/virt.c | 8 ++++++--
>> 1 file changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>> index 175023897a7..1d65fa471dc 100644
>> --- a/hw/arm/virt.c
>> +++ b/hw/arm/virt.c
>> @@ -3225,8 +3225,12 @@ static int
>> virt_hvf_get_physical_address_range(MachineState *ms)
>> {
>> VirtMachineState *vms = VIRT_MACHINE(ms);
>> - int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
>> - int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
>> + uint32_t default_ipa_size = hvf_arm_get_default_ipa_bit_size();
>> + uint32_t max_ipa_size = hvf_arm_get_max_ipa_bit_size();
>> + if (!default_ipa_size || !max_ipa_size) {
>> + warn_report("HVF didn't report IPA bit length");
>> + return -1;
>> + }
>
> I suppose this goes back to the previous patch.
> It might have been slightly less confusing to merge them, but the
> underlying questions about when and how this can fail remain.
Right. I'm dropping this patch.
^ permalink raw reply [flat|nested] 88+ messages in thread* Re: [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length
2026-01-18 22:03 ` Philippe Mathieu-Daudé
@ 2026-01-19 12:13 ` Philippe Mathieu-Daudé
2026-01-19 13:00 ` Peter Maydell
0 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-01-19 12:13 UTC (permalink / raw)
To: Richard Henderson, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Joelle van Dyne
On 18/1/26 23:03, Philippe Mathieu-Daudé wrote:
> On 28/10/25 13:07, Richard Henderson wrote:
>> On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
>>> Emit a warning when HVF doesn't return the IPA bit length
>>> and return -1 as "this accelerator is not usable", allowing
>>> QEMU to try with the next one (when using '-accel hvf:tcg').
>>>
>>> Reported-by: Ivan Krasilnikov
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2981
>>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>>> ---
>>> hw/arm/virt.c | 8 ++++++--
>>> 1 file changed, 6 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>>> index 175023897a7..1d65fa471dc 100644
>>> --- a/hw/arm/virt.c
>>> +++ b/hw/arm/virt.c
>>> @@ -3225,8 +3225,12 @@ static int
>>> virt_hvf_get_physical_address_range(MachineState *ms)
>>> {
>>> VirtMachineState *vms = VIRT_MACHINE(ms);
>>> - int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
>>> - int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
>>> + uint32_t default_ipa_size = hvf_arm_get_default_ipa_bit_size();
>>> + uint32_t max_ipa_size = hvf_arm_get_max_ipa_bit_size();
>>> + if (!default_ipa_size || !max_ipa_size) {
>>> + warn_report("HVF didn't report IPA bit length");
>>> + return -1;
>>> + }
>>
>> I suppose this goes back to the previous patch.
>> It might have been slightly less confusing to merge them, but the
>> underlying questions about when and how this can fail remain.
>
> Right. I'm dropping this patch.
BTW I was looking at the extra-commits in GetUTM and noticed one
related to this:
commit c387fd021064cfb7b895877d0a04660a795887ee
Author: Joelle van Dyne <j@getutm.app>
Date: Mon Dec 23 00:15:08 2024 -0800
hw/arm/virt: handle hvf with unknown max IPA size
When it is not possible to determine the max IPA bit size, the helper
function will return 0. We do not try to set up the memmap in this case
and instead fall back to the default in machvirt_init().
Signed-off-by: Joelle van Dyne <j@getutm.app>
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 5b1e375726d..251fc58b42c 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -3047,6 +3047,11 @@ static int
virt_hvf_get_physical_address_range(MachineState *ms)
int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
+ /* Unknown max ipa size, we'll let the caller figure it out */
+ if (max_ipa_size == 0) {
+ return 0;
+ }
+
/* We freeze the memory map to compute the highest gpa */
virt_set_memmap(vms, max_ipa_size);
(https://github.com/utmapp/qemu/commit/c387fd021064cfb7b895877d0a04660a795887ee)
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length
2026-01-19 12:13 ` Philippe Mathieu-Daudé
@ 2026-01-19 13:00 ` Peter Maydell
0 siblings, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2026-01-19 13:00 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Richard Henderson, qemu-devel, Mads Ynddal, Cameron Esfahani,
qemu-arm, Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Joelle van Dyne
On Mon, 19 Jan 2026 at 12:13, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> On 18/1/26 23:03, Philippe Mathieu-Daudé wrote:
> > On 28/10/25 13:07, Richard Henderson wrote:
> >> On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> >>> Emit a warning when HVF doesn't return the IPA bit length
> >>> and return -1 as "this accelerator is not usable", allowing
> >>> QEMU to try with the next one (when using '-accel hvf:tcg').
> >>>
> >>> Reported-by: Ivan Krasilnikov
> >>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2981
> >>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> >>> ---
> >>> hw/arm/virt.c | 8 ++++++--
> >>> 1 file changed, 6 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> >>> index 175023897a7..1d65fa471dc 100644
> >>> --- a/hw/arm/virt.c
> >>> +++ b/hw/arm/virt.c
> >>> @@ -3225,8 +3225,12 @@ static int
> >>> virt_hvf_get_physical_address_range(MachineState *ms)
> >>> {
> >>> VirtMachineState *vms = VIRT_MACHINE(ms);
> >>> - int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
> >>> - int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
> >>> + uint32_t default_ipa_size = hvf_arm_get_default_ipa_bit_size();
> >>> + uint32_t max_ipa_size = hvf_arm_get_max_ipa_bit_size();
> >>> + if (!default_ipa_size || !max_ipa_size) {
> >>> + warn_report("HVF didn't report IPA bit length");
> >>> + return -1;
> >>> + }
> >>
> >> I suppose this goes back to the previous patch.
> >> It might have been slightly less confusing to merge them, but the
> >> underlying questions about when and how this can fail remain.
> >
> > Right. I'm dropping this patch.
>
> BTW I was looking at the extra-commits in GetUTM and noticed one
> related to this:
IIRC, the failure in the associated gitlab issue is because
in hvf_accel_init() the very first thing we try to do with HVF
is "find out the IPA range", so we can create the VM.
So any kind of "HVF doesn't exist/is not usable" problem manifests
as "this call to try to get the IPA bit size returned an error".
So we either need to have hvf_accel_init() determine "HVF
is basically working" as the first thing it does so that we
can know that failures in this function really are specific
to the IPA range check, or else have the error be propagated
back from getting the IPA range so we can do something sensible
in hvf_accel_init().
(I haven't looked at the rest of this series, so maybe it
already does something like that.)
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 52/59] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (50 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 51/59] hw/arm/virt: Warn when HVF doesn't report IPA bit length Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:08 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 53/59] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop Philippe Mathieu-Daudé
` (7 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 4 ++++
accel/hvf/hvf-accel-ops.c | 3 +++
target/arm/hvf/hvf.c | 8 ++++++++
target/i386/hvf/hvf.c | 8 ++++++++
4 files changed, 23 insertions(+)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 96790b49386..3120a4593a4 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -71,6 +71,10 @@ int hvf_arch_put_registers(CPUState *);
int hvf_arch_get_registers(CPUState *);
/* Must be called by the owning thread */
void hvf_arch_update_guest_debug(CPUState *cpu);
+/* Must be called by the owning thread */
+void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu);
+/* Must be called by the owning thread */
+void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu);
void hvf_protect_clean_range(hwaddr addr, size_t size);
void hvf_unprotect_dirty_range(hwaddr addr, size_t size);
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
index 28d50e23017..6fb1fda424c 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -181,10 +181,13 @@ static void *hvf_cpu_thread_fn(void *arg)
do {
qemu_process_cpu_events(cpu);
if (cpu_can_run(cpu)) {
+
+ hvf_arch_cpu_synchronize_pre_exec(cpu);
r = hvf_arch_vcpu_exec(cpu);
if (r == EXCP_DEBUG) {
cpu_handle_guest_debug(cpu);
}
+ hvf_arch_cpu_synchronize_post_exec(cpu);
}
} while (!cpu->unplug || cpu_can_run(cpu));
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 5b077744720..f5bab7e7213 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2013,6 +2013,14 @@ static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_exit_t *exit)
return ret;
}
+void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu)
+{
+}
+
+void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu)
+{
+}
+
int hvf_arch_vcpu_exec(CPUState *cpu)
{
int ret;
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 49f26169632..5711ed6f1d3 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -729,6 +729,14 @@ void hvf_simulate_wrmsr(CPUState *cs)
printf("write msr %llx\n", RCX(cs));*/
}
+void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu)
+{
+}
+
+void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu)
+{
+}
+
static int hvf_handle_vmexit(CPUState *cpu)
{
X86CPU *x86_cpu = env_archcpu(cpu_env(cpu));
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 52/59] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks
2025-10-28 5:42 ` [PATCH v3 52/59] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks Philippe Mathieu-Daudé
@ 2025-10-28 12:08 ` Richard Henderson
0 siblings, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:08 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> include/system/hvf_int.h | 4 ++++
> accel/hvf/hvf-accel-ops.c | 3 +++
> target/arm/hvf/hvf.c | 8 ++++++++
> target/i386/hvf/hvf.c | 8 ++++++++
> 4 files changed, 23 insertions(+)
>
> diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
> index 96790b49386..3120a4593a4 100644
> --- a/include/system/hvf_int.h
> +++ b/include/system/hvf_int.h
> @@ -71,6 +71,10 @@ int hvf_arch_put_registers(CPUState *);
> int hvf_arch_get_registers(CPUState *);
> /* Must be called by the owning thread */
> void hvf_arch_update_guest_debug(CPUState *cpu);
> +/* Must be called by the owning thread */
> +void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu);
> +/* Must be called by the owning thread */
> +void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu);
>
> void hvf_protect_clean_range(hwaddr addr, size_t size);
> void hvf_unprotect_dirty_range(hwaddr addr, size_t size);
> diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c
> index 28d50e23017..6fb1fda424c 100644
> --- a/accel/hvf/hvf-accel-ops.c
> +++ b/accel/hvf/hvf-accel-ops.c
> @@ -181,10 +181,13 @@ static void *hvf_cpu_thread_fn(void *arg)
> do {
> qemu_process_cpu_events(cpu);
> if (cpu_can_run(cpu)) {
> +
> + hvf_arch_cpu_synchronize_pre_exec(cpu);
Funny extra line. Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 53/59] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (51 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 52/59] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:09 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 54/59] target/arm/hvf: " Philippe Mathieu-Daudé
` (6 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/i386/hvf/hvf.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 5711ed6f1d3..8df1196a55e 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -731,6 +731,10 @@ void hvf_simulate_wrmsr(CPUState *cs)
void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu)
{
+ if (cpu->vcpu_dirty) {
+ hvf_arch_put_registers(cpu);
+ cpu->vcpu_dirty = false;
+ }
}
void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu)
@@ -990,11 +994,6 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
}
do {
- if (cpu->vcpu_dirty) {
- hvf_arch_put_registers(cpu);
- cpu->vcpu_dirty = false;
- }
-
if (hvf_inject_interrupts(cpu)) {
return EXCP_INTERRUPT;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 53/59] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop
2025-10-28 5:42 ` [PATCH v3 53/59] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop Philippe Mathieu-Daudé
@ 2025-10-28 12:09 ` Richard Henderson
0 siblings, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:09 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
> target/i386/hvf/hvf.c | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 54/59] target/arm/hvf: Flush vCPU registers once before vcpu_exec() loop
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (52 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 53/59] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 55/59] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0 Philippe Mathieu-Daudé
` (5 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index f5bab7e7213..cc02df2e907 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2015,6 +2015,7 @@ static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_exit_t *exit)
void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu)
{
+ flush_cpu_state(cpu);
}
void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu)
@@ -2030,8 +2031,6 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
return EXCP_HLT;
}
- flush_cpu_state(cpu);
-
do {
if (!(cpu->singlestep_enabled & SSTEP_NOIRQ) &&
hvf_inject_interrupts(cpu)) {
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 55/59] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (53 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 54/59] target/arm/hvf: " Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 56/59] target/arm: Better describe PMU depends on TCG or HVF Philippe Mathieu-Daudé
` (4 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/hvf/hvf.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index cc02df2e907..22b7e34db0e 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -200,6 +200,9 @@ void hvf_arm_init_debug(void)
#define SYSREG_PMCEID0_EL0 SYSREG(3, 3, 9, 12, 6)
#define SYSREG_PMCEID1_EL0 SYSREG(3, 3, 9, 12, 7)
#define SYSREG_PMCCNTR_EL0 SYSREG(3, 3, 9, 13, 0)
+
+#define SYSREG_CNTV_CTL_EL0 SYSREG(3, 3, 14, 3, 1)
+#define SYSREG_CNTV_CVAL_EL0 SYSREG(3, 3, 14, 3, 2)
#define SYSREG_PMCCFILTR_EL0 SYSREG(3, 3, 14, 15, 7)
#define SYSREG_ICC_AP0R0_EL1 SYSREG(3, 0, 12, 8, 4)
@@ -2013,13 +2016,49 @@ static int hvf_handle_vmexit(CPUState *cpu, hv_vcpu_exit_t *exit)
return ret;
}
+static void hvf_sync_vtimer_pre_exec(CPUState *cpu)
+{
+ hv_return_t r;
+ uint64_t val;
+ bool b;
+
+ b = hvf_sysreg_read_cp(cpu, "VTimer", SYSREG_CNTV_CVAL_EL0, &val);
+ assert(b);
+ r = hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CVAL_EL0, val);
+ assert_hvf_ok(r);
+
+ b = hvf_sysreg_read_cp(cpu, "VTimer", SYSREG_CNTV_CTL_EL0, &val);
+ assert(b);
+ r = hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CTL_EL0, val);
+ assert_hvf_ok(r);
+}
+
+static void hvf_sync_vtimer_post_exec(CPUState *cpu)
+{
+ hv_return_t r;
+ uint64_t val;
+ bool b;
+
+ r = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CVAL_EL0, &val);
+ assert_hvf_ok(r);
+ b = hvf_sysreg_write_cp(cpu, "VTimer", SYSREG_CNTV_CVAL_EL0, val);
+ assert(b);
+
+ r = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CTL_EL0, &val);
+ assert_hvf_ok(r);
+ b = hvf_sysreg_write_cp(cpu, "VTimer", SYSREG_CNTV_CTL_EL0, val);
+ assert(b);
+}
+
void hvf_arch_cpu_synchronize_pre_exec(CPUState *cpu)
{
+ hvf_sync_vtimer_pre_exec(cpu);
flush_cpu_state(cpu);
}
void hvf_arch_cpu_synchronize_post_exec(CPUState *cpu)
{
+ hvf_sync_vtimer_post_exec(cpu);
}
int hvf_arch_vcpu_exec(CPUState *cpu)
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 56/59] target/arm: Better describe PMU depends on TCG or HVF
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (54 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 55/59] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0 Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 12:29 ` Richard Henderson
2025-10-28 5:42 ` [PATCH v3 57/59] target/arm/hvf: Emulate PMU registers Philippe Mathieu-Daudé
` (3 subsequent siblings)
59 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Simplify PMU logic by rewriting '!KVM' as 'TCG || HVF'
(ignoring QTest, because vCPUs are not available there).
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
target/arm/cpu.c | 2 +-
target/arm/machine.c | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index eaf76532eca..5a5a9994af0 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1979,7 +1979,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
if (arm_feature(env, ARM_FEATURE_PMU)) {
pmu_init(cpu);
- if (!kvm_enabled()) {
+ if (tcg_enabled() || hvf_enabled()) {
arm_register_pre_el_change_hook(cpu, &pmu_pre_el_change, 0);
arm_register_el_change_hook(cpu, &pmu_post_el_change, 0);
}
diff --git a/target/arm/machine.c b/target/arm/machine.c
index 44a0cf844b0..80aa2e34b4b 100644
--- a/target/arm/machine.c
+++ b/target/arm/machine.c
@@ -1,7 +1,7 @@
#include "qemu/osdep.h"
#include "cpu.h"
#include "qemu/error-report.h"
-#include "system/kvm.h"
+#include "system/hvf.h"
#include "system/tcg.h"
#include "kvm_arm.h"
#include "internals.h"
@@ -943,7 +943,7 @@ static int cpu_pre_save(void *opaque)
{
ARMCPU *cpu = opaque;
- if (!kvm_enabled()) {
+ if (tcg_enabled() || hvf_enabled()) {
pmu_op_start(&cpu->env);
}
@@ -978,7 +978,7 @@ static int cpu_post_save(void *opaque)
{
ARMCPU *cpu = opaque;
- if (!kvm_enabled()) {
+ if (tcg_enabled() || hvf_enabled()) {
pmu_op_finish(&cpu->env);
}
@@ -1011,7 +1011,7 @@ static int cpu_pre_load(void *opaque)
*/
env->irq_line_state = UINT32_MAX;
- if (!kvm_enabled()) {
+ if (tcg_enabled() || hvf_enabled()) {
pmu_op_start(env);
}
@@ -1103,7 +1103,7 @@ static int cpu_post_load(void *opaque, int version_id)
}
}
- if (!kvm_enabled()) {
+ if (tcg_enabled() || hvf_enabled()) {
pmu_op_finish(env);
}
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 56/59] target/arm: Better describe PMU depends on TCG or HVF
2025-10-28 5:42 ` [PATCH v3 56/59] target/arm: Better describe PMU depends on TCG or HVF Philippe Mathieu-Daudé
@ 2025-10-28 12:29 ` Richard Henderson
0 siblings, 0 replies; 88+ messages in thread
From: Richard Henderson @ 2025-10-28 12:29 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf
On 10/28/25 06:42, Philippe Mathieu-Daudé wrote:
> Simplify PMU logic by rewriting '!KVM' as 'TCG || HVF'
> (ignoring QTest, because vCPUs are not available there).
>
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
> target/arm/cpu.c | 2 +-
> target/arm/machine.c | 10 +++++-----
> 2 files changed, 6 insertions(+), 6 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 88+ messages in thread
* [PATCH v3 57/59] target/arm/hvf: Emulate PMU registers
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (55 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 56/59] target/arm: Better describe PMU depends on TCG or HVF Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 58/59] target/arm/hvf: Emulate Monitor Debug registers Philippe Mathieu-Daudé
` (2 subsequent siblings)
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
TODO: audit it is safe
---
target/arm/hvf/hvf.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 22b7e34db0e..639eef3b800 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1234,6 +1234,10 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val)
*val = env->cp15.c9_pmcnten;
return 0;
case SYSREG_PMUSERENR_EL0:
+ /* Call the TCG sysreg handler. This is only safe for PMU regs. */
+ if (hvf_sysreg_read_cp(cpu, "PMU", reg, val)) {
+ return 0;
+ }
*val = env->cp15.c9_pmuserenr;
return 0;
case SYSREG_PMCEID0_EL0:
@@ -1525,6 +1529,10 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
pmu_op_finish(env);
return 0;
case SYSREG_PMUSERENR_EL0:
+ /* Call the TCG sysreg handler. This is only safe for PMU regs. */
+ if (hvf_sysreg_write_cp(cpu, "PMU", reg, val)) {
+ return 0;
+ }
env->cp15.c9_pmuserenr = val & 0xf;
return 0;
case SYSREG_PMCNTENSET_EL0:
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 58/59] target/arm/hvf: Emulate Monitor Debug registers
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (56 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 57/59] target/arm/hvf: Emulate PMU registers Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 5:42 ` [PATCH v3 59/59] target/arm/hvf: Emulate PhysTimer registers Philippe Mathieu-Daudé
2025-10-28 13:10 ` [PATCH v3 00/59] target/arm/hvf: Consolidate Peter Maydell
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
TODO: audit it is safe
---
target/arm/hvf/hvf.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 639eef3b800..113f1415011 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1616,6 +1616,9 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
}
break;
case SYSREG_MDSCR_EL1:
+ if (hvf_sysreg_write_cp(cpu, "Monitor Debug", reg, val)) {
+ return 0;
+ }
env->cp15.mdscr_el1 = val;
return 0;
case SYSREG_DBGBVR0_EL1:
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* [PATCH v3 59/59] target/arm/hvf: Emulate PhysTimer registers
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (57 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 58/59] target/arm/hvf: Emulate Monitor Debug registers Philippe Mathieu-Daudé
@ 2025-10-28 5:42 ` Philippe Mathieu-Daudé
2025-10-28 13:10 ` [PATCH v3 00/59] target/arm/hvf: Consolidate Peter Maydell
59 siblings, 0 replies; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 5:42 UTC (permalink / raw)
To: qemu-devel
Cc: Mads Ynddal, Cameron Esfahani, qemu-arm, Roman Bolshakov,
Akihiko Odaki, Phil Dennis-Jordan, Mohamed Mediouni,
Peter Collingbourne, Peter Maydell, Alexander Graf,
Richard Henderson, Philippe Mathieu-Daudé
Emulate PhysTimer dispatching to TCG, like we do with GIC registers.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
TODO: audit it is safe
---
target/arm/hvf/hvf.c | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 113f1415011..a7b5e4711b0 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -189,6 +189,7 @@ void hvf_arm_init_debug(void)
#define SYSREG_LORC_EL1 SYSREG(3, 0, 10, 4, 3)
#define SYSREG_CNTPCT_EL0 SYSREG(3, 3, 14, 0, 1)
#define SYSREG_CNTP_CTL_EL0 SYSREG(3, 3, 14, 2, 1)
+#define SYSREG_CNTP_CVAL_EL0 SYSREG(3, 3, 14, 2, 2)
#define SYSREG_PMCR_EL0 SYSREG(3, 3, 9, 12, 0)
#define SYSREG_PMUSERENR_EL0 SYSREG(3, 3, 9, 14, 0)
#define SYSREG_PMCNTENSET_EL0 SYSREG(3, 3, 9, 12, 1)
@@ -201,6 +202,8 @@ void hvf_arm_init_debug(void)
#define SYSREG_PMCEID1_EL0 SYSREG(3, 3, 9, 12, 7)
#define SYSREG_PMCCNTR_EL0 SYSREG(3, 3, 9, 13, 0)
+#define SYSREG_CNTP_TVAL_EL0 SYSREG(3, 3, 14, 2, 0)
+#define SYSREG_CNTP_CVAL_EL0 SYSREG(3, 3, 14, 2, 2)
#define SYSREG_CNTV_CTL_EL0 SYSREG(3, 3, 14, 3, 1)
#define SYSREG_CNTV_CVAL_EL0 SYSREG(3, 3, 14, 3, 2)
#define SYSREG_PMCCFILTR_EL0 SYSREG(3, 3, 14, 15, 7)
@@ -1249,16 +1252,20 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val)
}
switch (reg) {
- case SYSREG_CNTPCT_EL0:
- *val = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) /
- gt_cntfrq_period_ns(arm_cpu);
- return 0;
case SYSREG_OSLSR_EL1:
*val = env->cp15.oslsr_el1;
return 0;
case SYSREG_OSDLR_EL1:
/* Dummy register */
return 0;
+ case SYSREG_CNTP_CTL_EL0:
+ case SYSREG_CNTP_TVAL_EL0:
+ case SYSREG_CNTPCT_EL0:
+ /* Call the TCG sysreg handler. This is only safe for VTimer regs. */
+ if (hvf_sysreg_read_cp(cpu, "VTimer", reg, val)) {
+ return 0;
+ }
+ break;
case SYSREG_ICC_AP0R0_EL1:
case SYSREG_ICC_AP0R1_EL1:
case SYSREG_ICC_AP0R2_EL1:
@@ -1571,19 +1578,20 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
case SYSREG_OSLAR_EL1:
env->cp15.oslsr_el1 = val & 1;
return 0;
- case SYSREG_CNTP_CTL_EL0:
- /*
- * Guests should not rely on the physical counter, but macOS emits
- * disable writes to it. Let it do so, but ignore the requests.
- */
- qemu_log_mask(LOG_UNIMP, "Unsupported write to CNTP_CTL_EL0\n");
- return 0;
case SYSREG_OSDLR_EL1:
/* Dummy register */
return 0;
case SYSREG_LORC_EL1:
/* Dummy register */
return 0;
+ case SYSREG_CNTP_CTL_EL0:
+ case SYSREG_CNTP_CVAL_EL0:
+ case SYSREG_CNTP_TVAL_EL0:
+ /* Call the TCG sysreg handler. This is only safe for VTimer regs. */
+ if (hvf_sysreg_write_cp(cpu, "VTimer", reg, val)) {
+ return 0;
+ }
+ break;
case SYSREG_ICC_AP0R0_EL1:
case SYSREG_ICC_AP0R1_EL1:
case SYSREG_ICC_AP0R2_EL1:
--
2.51.0
^ permalink raw reply related [flat|nested] 88+ messages in thread* Re: [PATCH v3 00/59] target/arm/hvf: Consolidate
2025-10-28 5:41 [PATCH v3 00/59] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
` (58 preceding siblings ...)
2025-10-28 5:42 ` [PATCH v3 59/59] target/arm/hvf: Emulate PhysTimer registers Philippe Mathieu-Daudé
@ 2025-10-28 13:10 ` Peter Maydell
2025-10-28 15:41 ` Philippe Mathieu-Daudé
59 siblings, 1 reply; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 13:10 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 05:42, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> Missing review: 15, 18, 26, 32, 33, 38 (up to #41 could be merged)
> 42, 43 (up to #49 could be merged)
> 50+
>
> Since v2:
> - Improve host page size/mask uses (rth)
> - Remove cpu_test_interrupt in hvf_wfi (rth)
Richard found an issue with patch 32, so I'm going to
take patches 1-30 into target-arm.next (patch 31 is
reviewed, but conceptually part of the next few patches
in the set which use the new functions it defines).
thanks
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread* Re: [PATCH v3 00/59] target/arm/hvf: Consolidate
2025-10-28 13:10 ` [PATCH v3 00/59] target/arm/hvf: Consolidate Peter Maydell
@ 2025-10-28 15:41 ` Philippe Mathieu-Daudé
2025-10-28 15:45 ` Peter Maydell
0 siblings, 1 reply; 88+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-28 15:41 UTC (permalink / raw)
To: Peter Maydell
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On 28/10/25 14:10, Peter Maydell wrote:
> On Tue, 28 Oct 2025 at 05:42, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>>
>> Missing review: 15, 18, 26, 32, 33, 38 (up to #41 could be merged)
>> 42, 43 (up to #49 could be merged)
>> 50+
>>
>> Since v2:
>> - Improve host page size/mask uses (rth)
>> - Remove cpu_test_interrupt in hvf_wfi (rth)
>
> Richard found an issue with patch 32, so I'm going to
IIUC this is not an issue, just a worry about performance,
whether getpagesize() implementation calls a syscall.
Anyway I'll cache the value locally -- or better, maybe
have qemu_real_host_page_size() doing that --.
> take patches 1-30 into target-arm.next (patch 31 is
> reviewed, but conceptually part of the next few patches
> in the set which use the new functions it defines).
Thanks, this is really helpful!
Phil.
^ permalink raw reply [flat|nested] 88+ messages in thread
* Re: [PATCH v3 00/59] target/arm/hvf: Consolidate
2025-10-28 15:41 ` Philippe Mathieu-Daudé
@ 2025-10-28 15:45 ` Peter Maydell
0 siblings, 0 replies; 88+ messages in thread
From: Peter Maydell @ 2025-10-28 15:45 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Mads Ynddal, Cameron Esfahani, qemu-arm,
Roman Bolshakov, Akihiko Odaki, Phil Dennis-Jordan,
Mohamed Mediouni, Peter Collingbourne, Alexander Graf,
Richard Henderson
On Tue, 28 Oct 2025 at 15:41, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> On 28/10/25 14:10, Peter Maydell wrote:
> > On Tue, 28 Oct 2025 at 05:42, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
> >>
> >> Missing review: 15, 18, 26, 32, 33, 38 (up to #41 could be merged)
> >> 42, 43 (up to #49 could be merged)
> >> 50+
> >>
> >> Since v2:
> >> - Improve host page size/mask uses (rth)
> >> - Remove cpu_test_interrupt in hvf_wfi (rth)
> >
> > Richard found an issue with patch 32, so I'm going to
>
> IIUC this is not an issue, just a worry about performance,
> whether getpagesize() implementation calls a syscall.
> Anyway I'll cache the value locally -- or better, maybe
> have qemu_real_host_page_size() doing that --.
I just meant to note "the patch needs some change before
it can be applied"; I agree that the changes are minor.
-- PMM
^ permalink raw reply [flat|nested] 88+ messages in thread