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,
>+ ®, 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,
>+ ®, 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,
>- ®, 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,
>- ®, 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;