- * [PATCH v2 01/58] target/arm/hvf: Release memory allocated by hv_vcpu_config_create()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 02/58] target/arm/hvf: Trace vCPU KICK events Philippe Mathieu-Daudé
                   ` (56 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 02/58] target/arm/hvf: Trace vCPU KICK events
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 01/58] target/arm/hvf: Release memory allocated by hv_vcpu_config_create() Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-25 17:01   ` Richard Henderson
  2025-10-23 11:45 ` [PATCH v2 03/58] target/arm/hvf: Check hv_vcpus_exit() returned value Philippe Mathieu-Daudé
                   ` (55 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
Signed-off-by: Philippe Mathieu-Daudé <philmd@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] 78+ messages in thread
- * Re: [PATCH v2 02/58] target/arm/hvf: Trace vCPU KICK events
  2025-10-23 11:45 ` [PATCH v2 02/58] target/arm/hvf: Trace vCPU KICK events Philippe Mathieu-Daudé
@ 2025-10-25 17:01   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:01 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi, Roman Bolshakov,
	Mohamed Mediouni, Alexander Graf, Paolo Bonzini, Mads Ynddal,
	qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
On 10/23/25 13:45, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c        | 1 +
>   target/arm/hvf/trace-events | 1 +
>   2 files changed, 2 insertions(+)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 03/58] target/arm/hvf: Check hv_vcpus_exit() returned value
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 01/58] target/arm/hvf: Release memory allocated by hv_vcpu_config_create() Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 02/58] target/arm/hvf: Trace vCPU KICK events Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-25 17:02   ` Richard Henderson
  2025-10-23 11:45 ` [PATCH v2 04/58] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() " Philippe Mathieu-Daudé
                   ` (54 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan,
	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>
---
 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] 78+ messages in thread
- * Re: [PATCH v2 03/58] target/arm/hvf: Check hv_vcpus_exit() returned value
  2025-10-23 11:45 ` [PATCH v2 03/58] target/arm/hvf: Check hv_vcpus_exit() returned value Philippe Mathieu-Daudé
@ 2025-10-25 17:02   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:02 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi, Roman Bolshakov,
	Mohamed Mediouni, Alexander Graf, Paolo Bonzini, Mads Ynddal,
	qemu-arm, Peter Collingbourne, Phil Dennis-Jordan,
	Alex Bennée
On 10/23/25 13:45, Philippe Mathieu-Daudé wrote:
> 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>
> ---
>   target/arm/hvf/hvf.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 04/58] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() returned value
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 03/58] target/arm/hvf: Check hv_vcpus_exit() returned value Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 05/58] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec() Philippe Mathieu-Daudé
                   ` (53 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 05/58] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 04/58] target/arm/hvf: Check hv_vcpu_set_vtimer_mask() " Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 06/58] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers Philippe Mathieu-Daudé
                   ` (52 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 06/58] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 05/58] accel/hvf: Rename hvf_vcpu_exec() -> hvf_arch_vcpu_exec() Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 07/58] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread Philippe Mathieu-Daudé
                   ` (51 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 07/58] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 06/58] accel/hvf: Rename hvf_put|get_registers -> hvf_arch_put|get_registers Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 08/58] accel/hvf: Mention hvf_arch_init_vcpu() " Philippe Mathieu-Daudé
                   ` (50 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 08/58] accel/hvf: Mention hvf_arch_init_vcpu() must run on vCPU thread
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 07/58] target/arm/hvf: Mention flush_cpu_state() must run on vCPU thread Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:45 ` [PATCH v2 09/58] target/arm/hvf: Mention hvf_sync_vtimer() " Philippe Mathieu-Daudé
                   ` (49 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 09/58] target/arm/hvf: Mention hvf_sync_vtimer() must run on vCPU thread
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (7 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 08/58] accel/hvf: Mention hvf_arch_init_vcpu() " Philippe Mathieu-Daudé
@ 2025-10-23 11:45 ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 30/58] target/arm: Re-use arm_is_psci_call() in HVF Philippe Mathieu-Daudé
                   ` (48 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:45 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cameron Esfahani, Peter Maydell, Stefan Hajnoczi,
	Richard Henderson, Roman Bolshakov, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Alexander Graf, Paolo Bonzini,
	Mads Ynddal, qemu-arm, Peter Collingbourne, Phil Dennis-Jordan
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] 78+ messages in thread
- * [PATCH v2 30/58] target/arm: Re-use arm_is_psci_call() in HVF
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (8 preceding siblings ...)
  2025-10-23 11:45 ` [PATCH v2 09/58] target/arm/hvf: Mention hvf_sync_vtimer() " Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-25 17:28   ` Richard Henderson
  2025-10-23 11:52 ` [PATCH v2 31/58] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF Philippe Mathieu-Daudé
                   ` (47 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
Re-use arm_is_psci_call() instead of open-coding it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@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 67130ce27d2..e913662dee5 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1945,7 +1945,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 */
@@ -1958,7 +1958,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] 78+ messages in thread
- * Re: [PATCH v2 30/58] target/arm: Re-use arm_is_psci_call() in HVF
  2025-10-23 11:52 ` [PATCH v2 30/58] target/arm: Re-use arm_is_psci_call() in HVF Philippe Mathieu-Daudé
@ 2025-10-25 17:28   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:28 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani, qemu-arm,
	Peter Maydell, Peter Collingbourne, Mads Ynddal, Roman Bolshakov,
	Alexander Graf, Stefan Hajnoczi, Paolo Bonzini
On 10/23/25 13:52, Philippe Mathieu-Daudé wrote:
> Re-use arm_is_psci_call() instead of open-coding it.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 31/58] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (9 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 30/58] target/arm: Re-use arm_is_psci_call() in HVF Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-25 17:29   ` Richard Henderson
  2025-10-23 11:52 ` [PATCH v2 32/58] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC Philippe Mathieu-Daudé
                   ` (46 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
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>
---
 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 e913662dee5..b5fdd86837e 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] 78+ messages in thread
- * Re: [PATCH v2 31/58] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF
  2025-10-23 11:52 ` [PATCH v2 31/58] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF Philippe Mathieu-Daudé
@ 2025-10-25 17:29   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:29 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani, qemu-arm,
	Peter Maydell, Peter Collingbourne, Mads Ynddal, Roman Bolshakov,
	Alexander Graf, Stefan Hajnoczi, Paolo Bonzini
On 10/23/25 13:52, Philippe Mathieu-Daudé wrote:
> 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>
> ---
>   target/arm/hvf/hvf.c    | 3 ++-
>   target/arm/tcg/psci.c   | 3 +++
>   target/arm/trace-events | 3 +++
>   3 files changed, 8 insertions(+), 1 deletion(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 32/58] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (10 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 31/58] target/arm: Share ARM_PSCI_CALL trace event between TCG and HVF Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-25 17:30   ` Richard Henderson
  2025-10-23 11:52 ` [PATCH v2 33/58] accel/hvf: Trace prefetch abort Philippe Mathieu-Daudé
                   ` (45 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
Signed-off-by: Philippe Mathieu-Daudé <philmd@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 b5fdd86837e..a045f83c9e2 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1947,6 +1947,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 */
@@ -1960,6 +1961,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] 78+ messages in thread
- * Re: [PATCH v2 32/58] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC
  2025-10-23 11:52 ` [PATCH v2 32/58] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC Philippe Mathieu-Daudé
@ 2025-10-25 17:30   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:30 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani, qemu-arm,
	Peter Maydell, Peter Collingbourne, Mads Ynddal, Roman Bolshakov,
	Alexander Graf, Stefan Hajnoczi, Paolo Bonzini
On 10/23/25 13:52, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <philmd@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 b5fdd86837e..a045f83c9e2 100644
> --- a/target/arm/hvf/hvf.c
> +++ b/target/arm/hvf/hvf.c
> @@ -1947,6 +1947,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 */
> @@ -1960,6 +1961,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)) {
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread
 
- * [PATCH v2 33/58] accel/hvf: Trace prefetch abort
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (11 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 32/58] target/arm/hvf/hvf: Document $pc adjustment in HVF & SMC Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-25 17:31   ` Richard Henderson
  2025-10-23 11:52 ` [PATCH v2 34/58] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range Philippe Mathieu-Daudé
                   ` (44 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
Signed-off-by: Philippe Mathieu-Daudé <philmd@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 a045f83c9e2..77998ab90a6 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1974,6 +1974,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] 78+ messages in thread
- * Re: [PATCH v2 33/58] accel/hvf: Trace prefetch abort
  2025-10-23 11:52 ` [PATCH v2 33/58] accel/hvf: Trace prefetch abort Philippe Mathieu-Daudé
@ 2025-10-25 17:31   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:31 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani, qemu-arm,
	Peter Maydell, Peter Collingbourne, Mads Ynddal, Roman Bolshakov,
	Alexander Graf, Stefan Hajnoczi, Paolo Bonzini
On 10/23/25 13:52, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c        | 11 +++++++++++
>   target/arm/hvf/trace-events |  1 +
>   2 files changed, 12 insertions(+)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 34/58] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (12 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 33/58] accel/hvf: Trace prefetch abort Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:18   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 35/58] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
                   ` (43 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
From: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@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] 78+ messages in thread
- * Re: [PATCH v2 34/58] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range
  2025-10-23 11:52 ` [PATCH v2 34/58] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range Philippe Mathieu-Daudé
@ 2025-10-23 14:18   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:18 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> From: Richard Henderson <richard.henderson@linaro.org>
> 
> Signed-off-by: Richard Henderson <richard.henderson@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(+)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 35/58] target/i386/hvf: Use hvf_unprotect_page
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (13 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 34/58] accel/hvf: Create hvf_protect_clean_range, hvf_unprotect_dirty_range Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:19   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 36/58] target/i386/hvf: Use address_space_translate in ept_emulation_fault Philippe Mathieu-Daudé
                   ` (42 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
From: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/i386/hvf/hvf.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index ab59381b500..aae4877d568 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -139,8 +139,7 @@ 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 & ~(TARGET_PAGE_SIZE - 1u);
             memory_region_set_dirty(slot->region, gpa - slot->start, 1);
-            hv_vm_protect(dirty_page_start, TARGET_PAGE_SIZE,
-                          HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
+            hvf_unprotect_dirty_range(dirty_page_start, TARGET_PAGE_SIZE);
         }
     }
 
-- 
2.51.0
^ permalink raw reply related	[flat|nested] 78+ messages in thread
- * Re: [PATCH v2 35/58] target/i386/hvf: Use hvf_unprotect_page
  2025-10-23 11:52 ` [PATCH v2 35/58] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
@ 2025-10-23 14:19   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:19 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> From: Richard Henderson <richard.henderson@linaro.org>
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/i386/hvf/hvf.c | 3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 36/58] target/i386/hvf: Use address_space_translate in ept_emulation_fault
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (14 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 35/58] target/i386/hvf: Use hvf_unprotect_page Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:39   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 37/58] accel/hvf: Simplify hvf_log_* Philippe Mathieu-Daudé
                   ` (41 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
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>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/i386/hvf/hvf.c | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index aae4877d568..4597d191f9d 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 & TARGET_PAGE_MASK;
+    hwaddr xlat;
 
     /* EPT fault on an instruction fetch doesn't make sense here */
     if (ept_qual & EPT_VIOLATION_INST_FETCH) {
@@ -129,18 +132,20 @@ 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 & ~(TARGET_PAGE_SIZE - 1u);
-            memory_region_set_dirty(slot->region, gpa - slot->start, 1);
-            hvf_unprotect_dirty_range(dirty_page_start, TARGET_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)) {
+        memory_region_set_dirty(mr, gpa_page + xlat, TARGET_PAGE_SIZE);
+        hvf_unprotect_dirty_range(gpa_page, TARGET_PAGE_SIZE);
     }
 
     /*
@@ -153,9 +158,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;
@@ -761,7 +763,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) &&
@@ -769,9 +770,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] 78+ messages in thread
- * Re: [PATCH v2 36/58] target/i386/hvf: Use address_space_translate in ept_emulation_fault
  2025-10-23 11:52 ` [PATCH v2 36/58] target/i386/hvf: Use address_space_translate in ept_emulation_fault Philippe Mathieu-Daudé
@ 2025-10-23 14:39   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:39 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> 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>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/i386/hvf/hvf.c | 34 +++++++++++++++++-----------------
>   1 file changed, 17 insertions(+), 17 deletions(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 37/58] accel/hvf: Simplify hvf_log_*
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (15 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 36/58] target/i386/hvf: Use address_space_translate in ept_emulation_fault Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:40   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 38/58] accel/hvf: Move hvf_log_sync to hvf_log_clear Philippe Mathieu-Daudé
                   ` (40 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
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>
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 e13abddbd9c..1be419652e0 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -200,45 +200,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,
@@ -248,7 +227,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] 78+ messages in thread
- * Re: [PATCH v2 37/58] accel/hvf: Simplify hvf_log_*
  2025-10-23 11:52 ` [PATCH v2 37/58] accel/hvf: Simplify hvf_log_* Philippe Mathieu-Daudé
@ 2025-10-23 14:40   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:40 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> 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>
> 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(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 38/58] accel/hvf: Move hvf_log_sync to hvf_log_clear
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (16 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 37/58] accel/hvf: Simplify hvf_log_* Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:19   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 39/58] accel/hvf: Simplify hvf_set_phys_mem Philippe Mathieu-Daudé
                   ` (39 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
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>
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 1be419652e0..844cc179de2 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -220,12 +220,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));
@@ -250,7 +251,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] 78+ messages in thread
- * Re: [PATCH v2 38/58] accel/hvf: Move hvf_log_sync to hvf_log_clear
  2025-10-23 11:52 ` [PATCH v2 38/58] accel/hvf: Move hvf_log_sync to hvf_log_clear Philippe Mathieu-Daudé
@ 2025-10-23 14:19   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:19 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> 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>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   accel/hvf/hvf-all.c | 11 ++++++-----
>   1 file changed, 6 insertions(+), 5 deletions(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 39/58] accel/hvf: Simplify hvf_set_phys_mem
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (17 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 38/58] accel/hvf: Move hvf_log_sync to hvf_log_clear Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 40/58] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot Philippe Mathieu-Daudé
                   ` (38 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
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 844cc179de2..21386acd143 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -83,45 +83,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) {
@@ -135,69 +106,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,
@@ -256,7 +186,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;
@@ -277,12 +206,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] 78+ messages in thread
- * [PATCH v2 40/58] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (18 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 39/58] accel/hvf: Simplify hvf_set_phys_mem Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:20   ` Philippe Mathieu-Daudé
  2025-10-23 11:52 ` [PATCH v2 41/58] accel/hvf: Remove mac_slots Philippe Mathieu-Daudé
                   ` (37 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
From: Richard Henderson <richard.henderson@linaro.org>
These are now unused.
Signed-off-by: Richard Henderson <richard.henderson@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] 78+ messages in thread
- * Re: [PATCH v2 40/58] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot
  2025-10-23 11:52 ` [PATCH v2 40/58] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot Philippe Mathieu-Daudé
@ 2025-10-23 14:20   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> From: Richard Henderson <richard.henderson@linaro.org>
> 
> These are now unused.
> 
> Signed-off-by: Richard Henderson <richard.henderson@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(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 41/58] accel/hvf: Remove mac_slots
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (19 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 40/58] accel/hvf: Drop hvf_slot and hvf_find_overlap_slot Philippe Mathieu-Daudé
@ 2025-10-23 11:52 ` Philippe Mathieu-Daudé
  2025-10-23 14:20   ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 50/58] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0 Philippe Mathieu-Daudé
                   ` (36 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 11:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Philippe Mathieu-Daudé,
	Cameron Esfahani, Richard Henderson, qemu-arm, Peter Maydell,
	Peter Collingbourne, Mads Ynddal, Roman Bolshakov, Alexander Graf,
	Stefan Hajnoczi, Paolo Bonzini
From: Richard Henderson <richard.henderson@linaro.org>
This data structure is no longer used.
Signed-off-by: Richard Henderson <richard.henderson@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 21386acd143..c767e13c212 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -21,15 +21,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] 78+ messages in thread
- * Re: [PATCH v2 41/58] accel/hvf: Remove mac_slots
  2025-10-23 11:52 ` [PATCH v2 41/58] accel/hvf: Remove mac_slots Philippe Mathieu-Daudé
@ 2025-10-23 14:20   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Phil Dennis-Jordan, Cameron Esfahani,
	Richard Henderson, qemu-arm, Peter Maydell, Peter Collingbourne,
	Mads Ynddal, Roman Bolshakov, Alexander Graf, Stefan Hajnoczi,
	Paolo Bonzini
On 23/10/25 13:52, Philippe Mathieu-Daudé wrote:
> From: Richard Henderson <richard.henderson@linaro.org>
> 
> This data structure is no longer used.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   accel/hvf/hvf-all.c | 9 ---------
>   1 file changed, 9 deletions(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 50/58] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (20 preceding siblings ...)
  2025-10-23 11:52 ` [PATCH v2 41/58] accel/hvf: Remove mac_slots Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 51/58] accel/hvf: Model PhysTimer register Philippe Mathieu-Daudé
                   ` (35 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 36fa67caf62..dbf6b83532d 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -201,6 +201,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)
@@ -2009,13 +2012,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] 78+ messages in thread
- * [PATCH v2 51/58] accel/hvf: Model PhysTimer register
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (21 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 50/58] accel/hvf: Sync CNTV_CTL_EL0 & CNTV_CVAL_EL0 Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 52/58] accel: Introduce AccelOpsClass::cpu_target_realize() hook Philippe Mathieu-Daudé
                   ` (34 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 dbf6b83532d..cc3f22ac542 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -190,6 +190,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)
@@ -202,6 +203,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)
@@ -1231,16 +1234,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:
@@ -1553,19 +1560,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] 78+ messages in thread
- * [PATCH v2 52/58] accel: Introduce AccelOpsClass::cpu_target_realize() hook
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (22 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 51/58] accel/hvf: Model PhysTimer register Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 53/58] accel/hvf: Add hvf_arch_cpu_realize() stubs Philippe Mathieu-Daudé
                   ` (33 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 53/58] accel/hvf: Add hvf_arch_cpu_realize() stubs
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (23 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 52/58] accel: Introduce AccelOpsClass::cpu_target_realize() hook Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 54/58] target/arm: Create GTimers *after* features finalized / accel realized Philippe Mathieu-Daudé
                   ` (32 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 eab443aa91f..3120a4593a4 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -110,4 +110,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 744a5288298..6fb1fda424c 100644
--- a/accel/hvf/hvf-accel-ops.c
+++ b/accel/hvf/hvf-accel-ops.c
@@ -363,6 +363,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 cc3f22ac542..759fa2e4d7d 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -979,6 +979,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 8acdfa952c1..168227af631 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -368,6 +368,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] 78+ messages in thread
- * [PATCH v2 54/58] target/arm: Create GTimers *after* features finalized / accel realized
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (24 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 53/58] accel/hvf: Add hvf_arch_cpu_realize() stubs Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 55/58] target/arm/hvf: Really set Generic Timer counter frequency Philippe Mathieu-Daudé
                   ` (31 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 5eaf950b969..bfd3b57e8a8 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1633,26 +1633,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
@@ -1699,7 +1679,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);
 
@@ -1720,18 +1733,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] 78+ messages in thread
- * [PATCH v2 55/58] target/arm/hvf: Really set Generic Timer counter frequency
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (25 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 54/58] target/arm: Create GTimers *after* features finalized / accel realized Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 56/58] accel/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size() Philippe Mathieu-Daudé
                   ` (30 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 759fa2e4d7d..f3cf5793ba5 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -904,6 +904,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);
@@ -915,7 +922,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,
@@ -981,6 +990,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] 78+ messages in thread
- * [PATCH v2 56/58] accel/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (26 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 55/58] target/arm/hvf: Really set Generic Timer counter frequency Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 57/58] hw/arm/virt: Warn when HVF doesn't report IPA bit length Philippe Mathieu-Daudé
                   ` (29 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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 f3cf5793ba5..12f7d09a697 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -836,24 +836,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] 78+ messages in thread
- * [PATCH v2 57/58] hw/arm/virt: Warn when HVF doesn't report IPA bit length
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (27 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 56/58] accel/hvf: Do not abort in hvf_arm_get_*_ipa_bit_size() Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-23 12:31 ` [PATCH v2 58/58] target/arm: Only allow disabling NEON when using TCG Philippe Mathieu-Daudé
                   ` (28 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 58/58] target/arm: Only allow disabling NEON when using TCG
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (28 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 57/58] hw/arm/virt: Warn when HVF doesn't report IPA bit length Philippe Mathieu-Daudé
@ 2025-10-23 12:31 ` Philippe Mathieu-Daudé
  2025-10-25 17:58   ` Richard Henderson
  2025-10-23 13:06 ` [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
                   ` (27 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 12:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, Philippe Mathieu-Daudé,
	qemu-arm, Stefan Hajnoczi, Mads Ynddal, Phil Dennis-Jordan,
	Richard Henderson, Roman Bolshakov, Cameron Esfahani
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>
---
 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 bfd3b57e8a8..9343c6093b9 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1457,7 +1457,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] 78+ messages in thread
- * Re: [PATCH v2 58/58] target/arm: Only allow disabling NEON when using TCG
  2025-10-23 12:31 ` [PATCH v2 58/58] target/arm: Only allow disabling NEON when using TCG Philippe Mathieu-Daudé
@ 2025-10-25 17:58   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 17:58 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Peter Maydell, Mohamed Mediouni, Peter Collingbourne,
	Alexander Graf, Paolo Bonzini, qemu-arm, Stefan Hajnoczi,
	Mads Ynddal, Phil Dennis-Jordan, Roman Bolshakov,
	Cameron Esfahani
On 10/23/25 14:31, Philippe Mathieu-Daudé wrote:
> 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>
> ---
>   target/arm/cpu.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (29 preceding siblings ...)
  2025-10-23 12:31 ` [PATCH v2 58/58] target/arm: Only allow disabling NEON when using TCG Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 14:43   ` Philippe Mathieu-Daudé
  2025-10-25 18:25   ` Richard Henderson
  2025-10-23 13:06 ` [PATCH v2 43/58] accel/hvf: Enforce host alignment when calling hv_vm_protect() Philippe Mathieu-Daudé
                   ` (26 subsequent siblings)
  57 siblings, 2 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
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>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 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 77998ab90a6..cf4746c344a 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -37,6 +37,7 @@
 #include "target/arm/trace.h"
 #include "trace.h"
 #include "migration/vmstate.h"
+#include "exec/target_page.h"
 
 #include "gdbstub/enums.h"
 
@@ -1880,9 +1881,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) {
@@ -1891,23 +1893,55 @@ 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 & TARGET_PAGE_MASK;
+
+                /* TODO: Inject exception to the guest. */
+                assert(!mr->readonly);
+
+                if (memory_region_get_dirty_log_mask(mr)) {
+                    memory_region_set_dirty(mr, ipa_page + xlat,
+                                            TARGET_PAGE_SIZE);
+                    hvf_unprotect_dirty_range(ipa_page, TARGET_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] 78+ messages in thread
- * Re: [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking
  2025-10-23 13:06 ` [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
@ 2025-10-23 14:43   ` Philippe Mathieu-Daudé
  2025-10-25 18:25   ` Richard Henderson
  1 sibling, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Cameron Esfahani, qemu-arm, Mads Ynddal, Phil Dennis-Jordan,
	Peter Maydell, Roman Bolshakov
On 23/10/25 15:06, Philippe Mathieu-Daudé wrote:
> 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>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c | 52 ++++++++++++++++++++++++++++++++++++--------
>   1 file changed, 43 insertions(+), 9 deletions(-)
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread 
- * Re: [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking
  2025-10-23 13:06 ` [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
  2025-10-23 14:43   ` Philippe Mathieu-Daudé
@ 2025-10-25 18:25   ` Richard Henderson
  1 sibling, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 18:25 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Paolo Bonzini, Mohamed Mediouni, Stefan Hajnoczi, Alexander Graf,
	Peter Collingbourne, Cameron Esfahani, qemu-arm, Mads Ynddal,
	Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
On 10/23/25 15:06, Philippe Mathieu-Daudé wrote:
> +        /* 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 & TARGET_PAGE_MASK;
> +
> +                /* TODO: Inject exception to the guest. */
> +                assert(!mr->readonly);
> +
> +                if (memory_region_get_dirty_log_mask(mr)) {
> +                    memory_region_set_dirty(mr, ipa_page + xlat,
> +                                            TARGET_PAGE_SIZE);
> +                    hvf_unprotect_dirty_range(ipa_page, TARGET_PAGE_SIZE);
> +                }
We need to use the host page size/mask, not TARGET_PAGE_SIZE/MASK here.
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread
 
- * [PATCH v2 43/58] accel/hvf: Enforce host alignment when calling hv_vm_protect()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (30 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 42/58] target/arm/hvf: Implement dirty page tracking Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 13:06 ` [PATCH v2 44/58] accel/hvf: Have WFI returns if !cpu_has_work Philippe Mathieu-Daudé
                   ` (25 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 accel/hvf/hvf-all.c | 2 ++
 1 file changed, 2 insertions(+)
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index c767e13c212..7e54cf202f0 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -54,6 +54,8 @@ static void do_hv_vm_protect(hwaddr start, size_t size,
 {
     hv_return_t ret;
 
+    start &= qemu_real_host_page_mask();
+    size = REAL_HOST_PAGE_ALIGN(size);
     trace_hvf_vm_protect(start, size, flags,
                          flags & HV_MEMORY_READ  ? 'R' : '-',
                          flags & HV_MEMORY_WRITE ? 'W' : '-',
-- 
2.51.0
^ permalink raw reply related	[flat|nested] 78+ messages in thread
- * [PATCH v2 44/58] accel/hvf: Have WFI returns if !cpu_has_work
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (31 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 43/58] accel/hvf: Enforce host alignment when calling hv_vm_protect() Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-25 18:29   ` Richard Henderson
  2025-10-23 13:06 ` [PATCH v2 45/58] accel/hvf: Implement WFI without using pselect() Philippe Mathieu-Daudé
                   ` (24 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/arm/hvf/hvf.c | 7 +++++++
 1 file changed, 7 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index cf4746c344a..8c2eac6738f 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1749,6 +1749,13 @@ static void hvf_wfi(CPUState *cpu)
     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;
+    }
+
     if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIQ)) {
         /* Interrupt pending, no need to wait */
         return;
-- 
2.51.0
^ permalink raw reply related	[flat|nested] 78+ messages in thread
- * Re: [PATCH v2 44/58] accel/hvf: Have WFI returns if !cpu_has_work
  2025-10-23 13:06 ` [PATCH v2 44/58] accel/hvf: Have WFI returns if !cpu_has_work Philippe Mathieu-Daudé
@ 2025-10-25 18:29   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 18:29 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Paolo Bonzini, Mohamed Mediouni, Stefan Hajnoczi, Alexander Graf,
	Peter Collingbourne, Cameron Esfahani, qemu-arm, Mads Ynddal,
	Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
On 10/23/25 15:06, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
> index cf4746c344a..8c2eac6738f 100644
> --- a/target/arm/hvf/hvf.c
> +++ b/target/arm/hvf/hvf.c
> @@ -1749,6 +1749,13 @@ static void hvf_wfi(CPUState *cpu)
>       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;
> +    }
> +
>       if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIQ)) {
>           /* Interrupt pending, no need to wait */
>           return;
cpu_has_work is a superset of the interrupt test.
The interrupt test should be removed.
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread
 
- * [PATCH v2 45/58] accel/hvf: Implement WFI without using pselect()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (32 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 44/58] accel/hvf: Have WFI returns if !cpu_has_work Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 13:06 ` [PATCH v2 46/58] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU Philippe Mathieu-Daudé
                   ` (23 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
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      | 76 ++++-----------------------------------
 3 files changed, 9 insertions(+), 73 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 8c2eac6738f..d3d05b0ccba 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -302,7 +302,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;
 
@@ -1715,85 +1715,21 @@ 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;
     }
 
     if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIQ)) {
         /* Interrupt pending, no need to wait */
-        return;
+        return EXCP_INTERRUPT;
     }
 
-    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 */
@@ -1982,7 +1918,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] 78+ messages in thread
- * [PATCH v2 46/58] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (33 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 45/58] accel/hvf: Implement WFI without using pselect() Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-25 19:27   ` Richard Henderson
  2025-10-23 13:06 ` [PATCH v2 47/58] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks Philippe Mathieu-Daudé
                   ` (22 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
Return EXCP_HLT to the main loop.
Signed-off-by: Philippe Mathieu-Daudé <philmd@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 d3d05b0ccba..b0918de5f92 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -302,8 +302,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 {
@@ -1009,7 +1007,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;
@@ -1092,9 +1090,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:
@@ -1925,7 +1922,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;
@@ -1941,7 +1938,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] 78+ messages in thread
- * Re: [PATCH v2 46/58] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU
  2025-10-23 13:06 ` [PATCH v2 46/58] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU Philippe Mathieu-Daudé
@ 2025-10-25 19:27   ` Richard Henderson
  0 siblings, 0 replies; 78+ messages in thread
From: Richard Henderson @ 2025-10-25 19:27 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Paolo Bonzini, Mohamed Mediouni, Stefan Hajnoczi, Alexander Graf,
	Peter Collingbourne, Cameron Esfahani, qemu-arm, Mads Ynddal,
	Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
On 10/23/25 15:06, Philippe Mathieu-Daudé wrote:
> Return EXCP_HLT to the main loop.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   target/arm/hvf/hvf.c | 11 ++++-------
>   1 file changed, 4 insertions(+), 7 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply	[flat|nested] 78+ messages in thread 
 
- * [PATCH v2 47/58] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (34 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 46/58] accel/hvf: Have PSCI CPU_SUSPEND halt the vCPU Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 13:06 ` [PATCH v2 48/58] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop Philippe Mathieu-Daudé
                   ` (21 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
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 c8e407a1463..eab443aa91f 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 e9dd2d24745..744a5288298 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 b0918de5f92..c83bffe46ad 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2009,6 +2009,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 4597d191f9d..de5e8b45d19 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -722,6 +722,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] 78+ messages in thread
- * [PATCH v2 48/58] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (35 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 47/58] accel/hvf: Introduce hvf_arch_cpu_synchronize_[pre/post]exec() hooks Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 13:06 ` [PATCH v2 49/58] target/arm/hvf: " Philippe Mathieu-Daudé
                   ` (20 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
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 de5e8b45d19..8acdfa952c1 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -724,6 +724,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)
@@ -983,11 +987,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] 78+ messages in thread
- * [PATCH v2 49/58] target/arm/hvf: Flush vCPU registers once before vcpu_exec() loop
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (36 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 48/58] target/i386/hvf: Flush vCPU registers once before vcpu_exec() loop Philippe Mathieu-Daudé
@ 2025-10-23 13:06 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 10/58] target/arm/hvf: Mention hvf_arch_set_traps() must run on vCPU thread Philippe Mathieu-Daudé
                   ` (19 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 13:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Richard Henderson, Mohamed Mediouni,
	Stefan Hajnoczi, Alexander Graf, Peter Collingbourne,
	Philippe Mathieu-Daudé, Cameron Esfahani, qemu-arm,
	Mads Ynddal, Phil Dennis-Jordan, Peter Maydell, Roman Bolshakov
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 c83bffe46ad..36fa67caf62 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -2011,6 +2011,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)
@@ -2026,8 +2027,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] 78+ messages in thread
- * [PATCH v2 10/58] target/arm/hvf: Mention hvf_arch_set_traps() must run on vCPU thread
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (37 preceding siblings ...)
  2025-10-23 13:06 ` [PATCH v2 49/58] target/arm/hvf: " Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 11/58] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU Philippe Mathieu-Daudé
                   ` (18 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 11/58] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (38 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 10/58] target/arm/hvf: Mention hvf_arch_set_traps() must run on vCPU thread Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 12/58] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread Philippe Mathieu-Daudé
                   ` (17 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 12/58] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (39 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 11/58] accel/hvf: Mention hvf_arch_update_guest_debug() must run on vCPU Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 13/58] accel/hvf: Implement hvf_arch_vcpu_destroy() Philippe Mathieu-Daudé
                   ` (16 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 13/58] accel/hvf: Implement hvf_arch_vcpu_destroy()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (40 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 12/58] target/arm/hvf: Mention hvf_inject_interrupts() must run on vCPU thread Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 14/58] target/arm/hvf: Hardcode Apple MIDR Philippe Mathieu-Daudé
                   ` (15 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 14/58] target/arm/hvf: Hardcode Apple MIDR
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (41 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 13/58] accel/hvf: Implement hvf_arch_vcpu_destroy() Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 15/58] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
                   ` (14 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 15/58] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (42 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 14/58] target/arm/hvf: Hardcode Apple MIDR Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 16/58] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU Philippe Mathieu-Daudé
                   ` (13 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 16/58] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (43 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 15/58] target/arm/hvf: Simplify hvf_arm_get_host_cpu_features() Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 17/58] target/arm/hvf: Factor hvf_handle_exception() out Philippe Mathieu-Daudé
                   ` (12 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 17/58] target/arm/hvf: Factor hvf_handle_exception() out
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (44 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 16/58] target/arm/hvf: switch hvf_arm_get_host_cpu_features to not create a vCPU Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 18/58] target/i386/hvf: Factor hvf_handle_vmexit() out Philippe Mathieu-Daudé
                   ` (11 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 18/58] target/i386/hvf: Factor hvf_handle_vmexit() out
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (45 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 17/58] target/arm/hvf: Factor hvf_handle_exception() out Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:13 ` [PATCH v2 19/58] target/arm/hvf: " Philippe Mathieu-Daudé
                   ` (10 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
Factor hvf_handle_vmexit() out of hvf_arch_vcpu_exec().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/i386/hvf/hvf.c | 477 +++++++++++++++++++++---------------------
 1 file changed, 244 insertions(+), 233 deletions(-)
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 76a58cb0350..2929a92defe 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);
@@ -753,239 +996,7 @@ int hvf_arch_vcpu_exec(CPUState *cpu)
         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] 78+ messages in thread
- * [PATCH v2 19/58] target/arm/hvf: Factor hvf_handle_vmexit() out
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (46 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 18/58] target/i386/hvf: Factor hvf_handle_vmexit() out Philippe Mathieu-Daudé
@ 2025-10-23 14:13 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 20/58] target/arm/hvf: Keep calling hv_vcpu_run() in loop Philippe Mathieu-Daudé
                   ` (9 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mohamed Mediouni, Peter Maydell, Richard Henderson,
	Alexander Graf, Philippe Mathieu-Daudé, Cameron Esfahani,
	Stefan Hajnoczi, Peter Collingbourne, qemu-arm, Paolo Bonzini,
	Phil Dennis-Jordan, Mads Ynddal, Roman Bolshakov
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] 78+ messages in thread
- * [PATCH v2 20/58] target/arm/hvf: Keep calling hv_vcpu_run() in loop
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (47 preceding siblings ...)
  2025-10-23 14:13 ` [PATCH v2 19/58] target/arm/hvf: " Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 21/58] cpus: Trace cpu_exec_start() and cpu_exec_end() calls Philippe Mathieu-Daudé
                   ` (8 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 21/58] cpus: Trace cpu_exec_start() and cpu_exec_end() calls
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (48 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 20/58] target/arm/hvf: Keep calling hv_vcpu_run() in loop Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 22/58] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls Philippe Mathieu-Daudé
                   ` (7 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 22/58] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (49 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 21/58] cpus: Trace cpu_exec_start() and cpu_exec_end() calls Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:36   ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 23/58] target/arm: Call aarch64_add_pauth_properties() once in host_initfn() Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  57 siblings, 1 reply; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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>
---
 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 2929a92defe..ab59381b500 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);
+
         /* handle VMEXIT */
         ret = hvf_handle_vmexit(cpu);
     } while (ret == 0);
-- 
2.51.0
^ permalink raw reply related	[flat|nested] 78+ messages in thread
- * Re: [PATCH v2 22/58] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls
  2025-10-23 14:30 ` [PATCH v2 22/58] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls Philippe Mathieu-Daudé
@ 2025-10-23 14:36   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Cameron Esfahani
On 23/10/25 16:30, Philippe Mathieu-Daudé wrote:
> 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>
> ---
>   target/arm/hvf/hvf.c  | 2 ++
>   target/i386/hvf/hvf.c | 4 ++++
>   2 files changed, 6 insertions(+)
I forgot:
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
^ permalink raw reply	[flat|nested] 78+ messages in thread
 
- * [PATCH v2 23/58] target/arm: Call aarch64_add_pauth_properties() once in host_initfn()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (50 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 22/58] accel/hvf: Guard hv_vcpu_run() between cpu_exec_start/end() calls Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 24/58] accel/hvf: Restrict ARM specific fields of AccelCPUState Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 24/58] accel/hvf: Restrict ARM specific fields of AccelCPUState
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (51 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 23/58] target/arm: Call aarch64_add_pauth_properties() once in host_initfn() Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 25/58] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list() Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 25/58] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list()
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (52 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 24/58] accel/hvf: Restrict ARM specific fields of AccelCPUState Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 26/58] target/arm: Better describe PMU depends on TCG or HVF Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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 f539bbe58e1..972b8bc50da 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 3b556f1404e..bfc031c70c1 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2138,7 +2138,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 167f2909b3f..9e26edf4dd0 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] 78+ messages in thread
- * [PATCH v2 26/58] target/arm: Better describe PMU depends on TCG or HVF
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (53 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 25/58] target/arm: Rename init_cpreg_list() -> arm_init_cpreg_list() Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 27/58] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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 bfc031c70c1..5eaf950b969 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1975,7 +1975,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] 78+ messages in thread
- * [PATCH v2 27/58] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (54 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 26/58] target/arm: Better describe PMU depends on TCG or HVF Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 28/58] target/arm/hvf: Emulate PMU registers Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 29/58] target/arm/hvf: Emulate Monitor Debug registers Philippe Mathieu-Daudé
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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] 78+ messages in thread
- * [PATCH v2 28/58] target/arm/hvf: Emulate PMU registers
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (55 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 27/58] target/arm/hvf: Rename 'vgic' -> 'emu_reginfo' in trace events Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  2025-10-23 14:30 ` [PATCH v2 29/58] target/arm/hvf: Emulate Monitor Debug registers Philippe Mathieu-Daudé
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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 26bafee259e..4fc92760934 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1214,6 +1214,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:
@@ -1505,6 +1509,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] 78+ messages in thread
- * [PATCH v2 29/58] target/arm/hvf: Emulate Monitor Debug registers
  2025-10-23 11:45 [PATCH v2 00/58] target/arm/hvf: Consolidate Philippe Mathieu-Daudé
                   ` (56 preceding siblings ...)
  2025-10-23 14:30 ` [PATCH v2 28/58] target/arm/hvf: Emulate PMU registers Philippe Mathieu-Daudé
@ 2025-10-23 14:30 ` Philippe Mathieu-Daudé
  57 siblings, 0 replies; 78+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-23 14:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Mads Ynddal, Alexander Graf, Stefan Hajnoczi, Richard Henderson,
	Phil Dennis-Jordan, qemu-arm, Peter Maydell, Roman Bolshakov,
	Peter Collingbourne, Paolo Bonzini, Mohamed Mediouni,
	Philippe Mathieu-Daudé, Cameron Esfahani
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 4fc92760934..67130ce27d2 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -1596,6 +1596,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] 78+ messages in thread