Am 15. Februar 2026 05:22:19 UTC schrieb Mohamed Mediouni 
<[email protected]>:
>These will be used in the next commit on the x86_64 backend too.
>Also move flush_cpu_state as it's used by get_reg/set_reg and the arm64 code.
>
>Signed-off-by: Mohamed Mediouni <[email protected]>
>---
> accel/whpx/whpx-common.c     | 35 +++++++++++++++++++++++++++++++++++
> include/system/whpx-common.h |  3 +++
> target/arm/whpx/whpx-all.c   | 35 -----------------------------------
> 3 files changed, 38 insertions(+), 35 deletions(-)
>
>diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
>index c57a0d3f0f..c2263c2496 100644
>--- a/accel/whpx/whpx-common.c
>+++ b/accel/whpx/whpx-common.c
>@@ -46,6 +46,41 @@ static HMODULE hWinHvEmulation;
> struct whpx_state whpx_global;
> struct WHPDispatch whp_dispatch;
> 
>+void flush_cpu_state(CPUState *cpu)
>+{
>+    if (cpu->vcpu_dirty) {
>+        whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE);
>+        cpu->vcpu_dirty = false;
>+    }
>+}
>+
>+void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE* 
>val)
>+{
>+    struct whpx_state *whpx = &whpx_global;
>+    HRESULT hr;
>+
>+    flush_cpu_state(cpu);
>+
>+    hr = whp_dispatch.WHvGetVirtualProcessorRegisters(whpx->partition, 
>cpu->cpu_index,
>+         &reg, 1, val);
>+
>+    if (FAILED(hr)) {
>+        error_report("WHPX: Failed to get register %08x, hr=%08lx", reg, hr);
>+    }
>+}
>+
>+void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE 
>val)
>+{
>+    struct whpx_state *whpx = &whpx_global;
>+    HRESULT hr;
>+    hr = whp_dispatch.WHvSetVirtualProcessorRegisters(whpx->partition, 
>cpu->cpu_index,
>+         &reg, 1, &val);
>+
>+    if (FAILED(hr)) {
>+        error_report("WHPX: Failed to set register %08x, hr=%08lx", reg, hr);
>+    }
>+}
>+
> /* Tries to find a breakpoint at the specified address. */
> struct whpx_breakpoint *whpx_lookup_breakpoint_by_addr(uint64_t address)
> {
>diff --git a/include/system/whpx-common.h b/include/system/whpx-common.h
>index b86fe9db6e..5bce33e336 100644
>--- a/include/system/whpx-common.h
>+++ b/include/system/whpx-common.h
>@@ -20,6 +20,9 @@ int whpx_first_vcpu_starting(CPUState *cpu);
> int whpx_last_vcpu_stopping(CPUState *cpu);
> void whpx_memory_init(void);
> struct whpx_breakpoint *whpx_lookup_breakpoint_by_addr(uint64_t address);
>+void flush_cpu_state(CPUState *cpu);

Now that flush_cpu_state() is exported we should better prefix it with "whpx_" 
to avoid name clashes.

With this fixed:

Reviewed-by: Bernhard Beschow <[email protected]>

>+void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE* 
>val);
>+void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE 
>val);
> 
> /* On x64: same as WHvX64ExceptionTypeDebugTrapOrFault */
> #define WHPX_INTERCEPT_DEBUG_TRAPS 1
>diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
>index d52580a082..c8d71a252e 100644
>--- a/target/arm/whpx/whpx-all.c
>+++ b/target/arm/whpx/whpx-all.c
>@@ -274,14 +274,6 @@ static struct whpx_sreg_match whpx_sreg_match[] = {
>     { WHvArm64RegisterSpEl1, ENCODE_AA64_CP_REG(4, 1, 3, 4, 0) },
> };
> 
>-static void flush_cpu_state(CPUState *cpu)
>-{
>-    if (cpu->vcpu_dirty) {
>-        whpx_set_registers(cpu, WHPX_SET_RUNTIME_STATE);
>-        cpu->vcpu_dirty = false;
>-    }
>-}
>-
> HRESULT whpx_set_exception_exit_bitmap(UINT64 exceptions)
> {
>     if (exceptions != 0) {
>@@ -314,33 +306,6 @@ void whpx_arch_destroy_vcpu(CPUState *cpu)
>     /* currently empty on Arm */
> }
> 
>-static void whpx_get_reg(CPUState *cpu, WHV_REGISTER_NAME reg, 
>WHV_REGISTER_VALUE* val)
>-{
>-    struct whpx_state *whpx = &whpx_global;
>-    HRESULT hr;
>-
>-    flush_cpu_state(cpu);
>-
>-    hr = whp_dispatch.WHvGetVirtualProcessorRegisters(whpx->partition, 
>cpu->cpu_index,
>-         &reg, 1, val);
>-
>-    if (FAILED(hr)) {
>-        error_report("WHPX: Failed to get register %08x, hr=%08lx", reg, hr);
>-    }
>-}
>-
>-static void whpx_set_reg(CPUState *cpu, WHV_REGISTER_NAME reg, 
>WHV_REGISTER_VALUE val)
>-{
>-    struct whpx_state *whpx = &whpx_global;
>-    HRESULT hr;
>-    hr = whp_dispatch.WHvSetVirtualProcessorRegisters(whpx->partition, 
>cpu->cpu_index,
>-         &reg, 1, &val);
>-
>-    if (FAILED(hr)) {
>-        error_report("WHPX: Failed to set register %08x, hr=%08lx", reg, hr);
>-    }
>-}
>-
> static void whpx_get_global_reg(WHV_REGISTER_NAME reg, WHV_REGISTER_VALUE 
> *val)
> {
>     struct whpx_state *whpx = &whpx_global;

Reply via email to