WHPX workaround bug in OSVW handling
Adds a workaround to an incorrect value setting CPUID Fn8000_0001_ECX[bit 9 OSVW] = 1. This can cause a guest linux kernel to panic when an issue to rdmsr C001_0140h returns 0. Disabling this feature correctly allows the guest to boot without accessing the osv workarounds. Signed-off-by: Justin Terry (VM) <juterry@microsoft.com> Message-Id: <20180605221500.21674-1-juterry@microsoft.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e7d99825f0
commit
e1753a7e1d
@ -961,6 +961,16 @@ static int whpx_vcpu_run(CPUState *cpu)
|
|||||||
vcpu->exit_ctx.CpuidAccess.DefaultResultRcx |
|
vcpu->exit_ctx.CpuidAccess.DefaultResultRcx |
|
||||||
CPUID_EXT_HYPERVISOR;
|
CPUID_EXT_HYPERVISOR;
|
||||||
|
|
||||||
|
rdx = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx;
|
||||||
|
rbx = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx;
|
||||||
|
break;
|
||||||
|
case 0x80000001:
|
||||||
|
rax = vcpu->exit_ctx.CpuidAccess.DefaultResultRax;
|
||||||
|
/* Remove any support of OSVW */
|
||||||
|
rcx =
|
||||||
|
vcpu->exit_ctx.CpuidAccess.DefaultResultRcx &
|
||||||
|
~CPUID_EXT3_OSVW;
|
||||||
|
|
||||||
rdx = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx;
|
rdx = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx;
|
||||||
rbx = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx;
|
rbx = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx;
|
||||||
break;
|
break;
|
||||||
@ -1382,12 +1392,13 @@ static int whpx_accel_init(MachineState *ms)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 cpuidExitList[] = {1};
|
UINT32 cpuidExitList[] = {1, 0x80000001};
|
||||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||||
whpx->partition,
|
whpx->partition,
|
||||||
WHvPartitionPropertyCodeCpuidExitList,
|
WHvPartitionPropertyCodeCpuidExitList,
|
||||||
cpuidExitList,
|
cpuidExitList,
|
||||||
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
|
error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
|
||||||
hr);
|
hr);
|
||||||
|
Loading…
Reference in New Issue
Block a user