Resolves WHPX breaking changes in SDK 17095
1. Fixes the changes required to the WHvTryMmioEmulation, WHvTryIoEmulation, and WHvEmulatorCreateEmulator based on the new VpContext forwarding. 2. Removes the WHvRunVpExitReasonAlerted case. Signed-off-by: Justin Terry (VM) <juterry@microsoft.com> Message-Id: <1519665216-1078-3-git-send-email-juterry@microsoft.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Justin Terry (VM) via Qemu-devel <qemu-devel@nongnu.org>
This commit is contained in:
parent
53537bb18c
commit
914e2ab364
@ -613,6 +613,7 @@ static HRESULT CALLBACK whpx_emu_translate_callback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const WHV_EMULATOR_CALLBACKS whpx_emu_callbacks = {
|
static const WHV_EMULATOR_CALLBACKS whpx_emu_callbacks = {
|
||||||
|
.Size = sizeof(WHV_EMULATOR_CALLBACKS),
|
||||||
.WHvEmulatorIoPortCallback = whpx_emu_ioport_callback,
|
.WHvEmulatorIoPortCallback = whpx_emu_ioport_callback,
|
||||||
.WHvEmulatorMemoryCallback = whpx_emu_memio_callback,
|
.WHvEmulatorMemoryCallback = whpx_emu_memio_callback,
|
||||||
.WHvEmulatorGetVirtualProcessorRegisters = whpx_emu_getreg_callback,
|
.WHvEmulatorGetVirtualProcessorRegisters = whpx_emu_getreg_callback,
|
||||||
@ -626,7 +627,9 @@ static int whpx_handle_mmio(CPUState *cpu, WHV_MEMORY_ACCESS_CONTEXT *ctx)
|
|||||||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||||
WHV_EMULATOR_STATUS emu_status;
|
WHV_EMULATOR_STATUS emu_status;
|
||||||
|
|
||||||
hr = WHvEmulatorTryMmioEmulation(vcpu->emulator, cpu, ctx, &emu_status);
|
hr = WHvEmulatorTryMmioEmulation(vcpu->emulator, cpu,
|
||||||
|
&vcpu->exit_ctx.VpContext, ctx,
|
||||||
|
&emu_status);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
error_report("WHPX: Failed to parse MMIO access, hr=%08lx", hr);
|
error_report("WHPX: Failed to parse MMIO access, hr=%08lx", hr);
|
||||||
@ -649,7 +652,9 @@ static int whpx_handle_portio(CPUState *cpu,
|
|||||||
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
struct whpx_vcpu *vcpu = get_whpx_vcpu(cpu);
|
||||||
WHV_EMULATOR_STATUS emu_status;
|
WHV_EMULATOR_STATUS emu_status;
|
||||||
|
|
||||||
hr = WHvEmulatorTryIoEmulation(vcpu->emulator, cpu, ctx, &emu_status);
|
hr = WHvEmulatorTryIoEmulation(vcpu->emulator, cpu,
|
||||||
|
&vcpu->exit_ctx.VpContext, ctx,
|
||||||
|
&emu_status);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
error_report("WHPX: Failed to parse PortIO access, hr=%08lx", hr);
|
error_report("WHPX: Failed to parse PortIO access, hr=%08lx", hr);
|
||||||
@ -905,18 +910,8 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||||||
whpx_vcpu_kick(cpu);
|
whpx_vcpu_kick(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
hr = WHvRunVirtualProcessor(whpx->partition, cpu->cpu_index,
|
||||||
hr = WHvRunVirtualProcessor(whpx->partition, cpu->cpu_index,
|
&vcpu->exit_ctx, whpx->exit_ctx_size);
|
||||||
&vcpu->exit_ctx, whpx->exit_ctx_size);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr) && (vcpu->exit_ctx.ExitReason ==
|
|
||||||
WHvRunVpExitReasonAlerted)) {
|
|
||||||
WHvCancelRunVirtualProcessor(whpx->partition, cpu->cpu_index,
|
|
||||||
0);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
error_report("WHPX: Failed to exec a virtual processor,"
|
error_report("WHPX: Failed to exec a virtual processor,"
|
||||||
@ -956,7 +951,6 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||||||
case WHvRunVpExitReasonX64MsrAccess:
|
case WHvRunVpExitReasonX64MsrAccess:
|
||||||
case WHvRunVpExitReasonX64Cpuid:
|
case WHvRunVpExitReasonX64Cpuid:
|
||||||
case WHvRunVpExitReasonException:
|
case WHvRunVpExitReasonException:
|
||||||
case WHvRunVpExitReasonAlerted:
|
|
||||||
default:
|
default:
|
||||||
error_report("WHPX: Unexpected VP exit code %d",
|
error_report("WHPX: Unexpected VP exit code %d",
|
||||||
vcpu->exit_ctx.ExitReason);
|
vcpu->exit_ctx.ExitReason);
|
||||||
@ -1068,7 +1062,7 @@ int whpx_init_vcpu(CPUState *cpu)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = WHvEmulatorCreateEmulator(whpx_emu_callbacks, &vcpu->emulator);
|
hr = WHvEmulatorCreateEmulator(&whpx_emu_callbacks, &vcpu->emulator);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
error_report("WHPX: Failed to setup instruction completion support,"
|
error_report("WHPX: Failed to setup instruction completion support,"
|
||||||
" hr=%08lx", hr);
|
" hr=%08lx", hr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user