Am 29. Oktober 2025 16:55:08 UTC schrieb Mohamed Mediouni <mohamed@unpredictable.fr>:
>WHvGetVirtualProcessorInterruptControllerState2 and
>WHvSetVirtualProcessorInterruptControllerState2 are
>deprecated since Windows 10 version 2004.
>
>Use the non-deprecated WHvGetVirtualProcessorState and
>WHvSetVirtualProcessorState when available.
I still have to revert this patch to avoid termination of the VM.
Best regards,
Bernhard
>
>Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>
>Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>---
> include/system/whpx-internal.h | 9 +++++++
> target/i386/whpx/whpx-apic.c | 46 +++++++++++++++++++++++++---------
> 2 files changed, 43 insertions(+), 12 deletions(-)
>
>diff --git a/include/system/whpx-internal.h b/include/system/whpx-internal.h
>index 81c0c1819f..90b4077b76 100644
>--- a/include/system/whpx-internal.h
>+++ b/include/system/whpx-internal.h
>@@ -86,6 +86,15 @@ void whpx_apic_get(APICCommonState *s);
> X(HRESULT, WHvSetVirtualProcessorInterruptControllerState2, \
> (WHV_PARTITION_HANDLE Partition, UINT32 VpIndex, PVOID State, \
> UINT32 StateSize)) \
>+ X(HRESULT, WHvGetVirtualProcessorState, \
>+ (WHV_PARTITION_HANDLE Partition, UINT32 VpIndex, \
>+ WHV_VIRTUAL_PROCESSOR_STATE_TYPE StateType, PVOID Buffer, \
>+ UINT32 BufferSizeInBytes, UINT32 *BytesWritten)) \
>+ X(HRESULT, WHvSetVirtualProcessorState, \
>+ (WHV_PARTITION_HANDLE Partition, UINT32 VpIndex, \
>+ WHV_VIRTUAL_PROCESSOR_STATE_TYPE StateType, PVOID Buffer, \
>+ UINT32 BufferSizeInBytes)) \
>+
>
> #define LIST_WINHVEMULATION_FUNCTIONS(X) \
> X(HRESULT, WHvEmulatorCreateEmulator, (const WHV_EMULATOR_CALLBACKS* Callbacks, WHV_EMULATOR_HANDLE* Emulator)) \
>diff --git a/target/i386/whpx/whpx-apic.c b/target/i386/whpx/whpx-apic.c
>index b934fdcbe1..fa45a64b21 100644
>--- a/target/i386/whpx/whpx-apic.c
>+++ b/target/i386/whpx/whpx-apic.c
>@@ -137,11 +137,21 @@ static void whpx_apic_put(CPUState *cs, run_on_cpu_data data)
> whpx_put_apic_base(CPU(s->cpu), s->apicbase);
> whpx_put_apic_state(s, &kapic);
>
>- hr = whp_dispatch.WHvSetVirtualProcessorInterruptControllerState2(
>- whpx_global.partition,
>- cs->cpu_index,
>- &kapic,
>- sizeof(kapic));
>+ if (whp_dispatch.WHvSetVirtualProcessorState) {
>+ hr = whp_dispatch.WHvSetVirtualProcessorState(
>+ whpx_global.partition,
>+ cs->cpu_index,
>+ WHvVirtualProcessorStateTypeInterruptControllerState2,
>+ &kapic,
>+ sizeof(kapic));
>+ } else {
>+ hr = whp_dispatch.WHvSetVirtualProcessorInterruptControllerState2(
>+ whpx_global.partition,
>+ cs->cpu_index,
>+ &kapic,
>+ sizeof(kapic));
>+ }
>+
> if (FAILED(hr)) {
> fprintf(stderr,
> "WHvSetVirtualProcessorInterruptControllerState failed: %08lx\n",
>@@ -155,16 +165,28 @@ void whpx_apic_get(APICCommonState *s)
> {
> CPUState *cpu = CPU(s->cpu);
> struct whpx_lapic_state kapic;
>+ HRESULT hr;
>+
>+ if (whp_dispatch.WHvGetVirtualProcessorState) {
>+ hr = whp_dispatch.WHvGetVirtualProcessorState(
>+ whpx_global.partition,
>+ cpu->cpu_index,
>+ WHvVirtualProcessorStateTypeInterruptControllerState2,
>+ &kapic,
>+ sizeof(kapic),
>+ NULL);
>+ } else {
>+ hr = whp_dispatch.WHvGetVirtualProcessorInterruptControllerState2(
>+ whpx_global.partition,
>+ cpu->cpu_index,
>+ &kapic,
>+ sizeof(kapic),
>+ NULL);
>+ }
>
>- HRESULT hr = whp_dispatch.WHvGetVirtualProcessorInterruptControllerState2(
>- whpx_global.partition,
>- cpu->cpu_index,
>- &kapic,
>- sizeof(kapic),
>- NULL);
> if (FAILED(hr)) {
> fprintf(stderr,
>- "WHvSetVirtualProcessorInterruptControllerState failed: %08lx\n",
>+ "WHvGetVirtualProcessorInterruptControllerState failed: %08lx\n",
> hr);
>
> abort();