mirror of
https://github.com/qemu/qemu.git
synced 2026-07-09 01:56:21 +00:00
whpx: i386: remove CPUID trapping
Very partial in its current state and results in significantly inconsistent CPUID data. Remove it until it's reimplemented later. Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr> Link: https://lore.kernel.org/r/20260223233950.96076-15-mohamed@unpredictable.fr Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
40860e0c95
commit
2c08624db0
@@ -1795,75 +1795,6 @@ int whpx_vcpu_run(CPUState *cpu)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
case WHvRunVpExitReasonX64Cpuid: {
|
||||
WHV_REGISTER_VALUE reg_values[5];
|
||||
WHV_REGISTER_NAME reg_names[5];
|
||||
UINT32 reg_count = 5;
|
||||
UINT64 cpuid_fn, rip = 0, rax = 0, rcx = 0, rdx = 0, rbx = 0;
|
||||
X86CPU *x86_cpu = X86_CPU(cpu);
|
||||
CPUX86State *env = &x86_cpu->env;
|
||||
|
||||
memset(reg_values, 0, sizeof(reg_values));
|
||||
|
||||
rip = vcpu->exit_ctx.VpContext.Rip +
|
||||
vcpu->exit_ctx.VpContext.InstructionLength;
|
||||
cpuid_fn = vcpu->exit_ctx.CpuidAccess.Rax;
|
||||
|
||||
/*
|
||||
* Ideally, these should be supplied to the hypervisor during VCPU
|
||||
* initialization and it should be able to satisfy this request.
|
||||
* But, currently, WHPX doesn't support setting CPUID values in the
|
||||
* hypervisor once the partition has been setup, which is too late
|
||||
* since VCPUs are realized later. For now, use the values from
|
||||
* QEMU to satisfy these requests, until WHPX adds support for
|
||||
* being able to set these values in the hypervisor at runtime.
|
||||
*/
|
||||
cpu_x86_cpuid(env, cpuid_fn, 0, (UINT32 *)&rax, (UINT32 *)&rbx,
|
||||
(UINT32 *)&rcx, (UINT32 *)&rdx);
|
||||
switch (cpuid_fn) {
|
||||
case 0x40000000:
|
||||
/* Expose the vmware cpu frequency cpuid leaf */
|
||||
rax = 0x40000010;
|
||||
rbx = rcx = rdx = 0;
|
||||
break;
|
||||
|
||||
case 0x40000010:
|
||||
rax = env->tsc_khz;
|
||||
rbx = env->apic_bus_freq / 1000; /* Hz to KHz */
|
||||
rcx = rdx = 0;
|
||||
break;
|
||||
|
||||
case 0x80000001:
|
||||
/* Remove any support of OSVW */
|
||||
rcx &= ~CPUID_EXT3_OSVW;
|
||||
break;
|
||||
}
|
||||
|
||||
reg_names[0] = WHvX64RegisterRip;
|
||||
reg_names[1] = WHvX64RegisterRax;
|
||||
reg_names[2] = WHvX64RegisterRcx;
|
||||
reg_names[3] = WHvX64RegisterRdx;
|
||||
reg_names[4] = WHvX64RegisterRbx;
|
||||
|
||||
reg_values[0].Reg64 = rip;
|
||||
reg_values[1].Reg64 = rax;
|
||||
reg_values[2].Reg64 = rcx;
|
||||
reg_values[3].Reg64 = rdx;
|
||||
reg_values[4].Reg64 = rbx;
|
||||
|
||||
hr = whp_dispatch.WHvSetVirtualProcessorRegisters(
|
||||
whpx->partition, cpu->cpu_index,
|
||||
reg_names,
|
||||
reg_count,
|
||||
reg_values);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set CpuidAccess state registers,"
|
||||
" hr=%08lx", hr);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
case WHvRunVpExitReasonException:
|
||||
whpx_get_registers(cpu);
|
||||
|
||||
@@ -2017,26 +1948,6 @@ int whpx_init_vcpu(CPUState *cpu)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the vmware cpuid frequency leaf option is set, and we have a valid
|
||||
* tsc value, trap the corresponding cpuid's.
|
||||
*/
|
||||
if (x86_cpu->vmware_cpuid_freq && env->tsc_khz) {
|
||||
UINT32 cpuidExitList[] = {1, 0x80000001, 0x40000000, 0x40000010};
|
||||
|
||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||
whpx->partition,
|
||||
WHvPartitionPropertyCodeCpuidExitList,
|
||||
cpuidExitList,
|
||||
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
|
||||
hr);
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
vcpu->interruptable = true;
|
||||
cpu->vcpu_dirty = true;
|
||||
@@ -2073,7 +1984,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms)
|
||||
WHV_CAPABILITY whpx_cap;
|
||||
UINT32 whpx_cap_size;
|
||||
WHV_PARTITION_PROPERTY prop;
|
||||
UINT32 cpuidExitList[] = {1, 0x80000001};
|
||||
WHV_CAPABILITY_FEATURES features = {0};
|
||||
|
||||
whpx = &whpx_global;
|
||||
@@ -2183,7 +2093,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms)
|
||||
/* Register for MSR and CPUID exits */
|
||||
memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));
|
||||
prop.ExtendedVmExits.X64MsrExit = 1;
|
||||
prop.ExtendedVmExits.X64CpuidExit = 1;
|
||||
prop.ExtendedVmExits.ExceptionExit = 1;
|
||||
if (whpx_irqchip_in_kernel()) {
|
||||
prop.ExtendedVmExits.X64ApicInitSipiExitTrap = 1;
|
||||
@@ -2200,19 +2109,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms)
|
||||
goto error;
|
||||
}
|
||||
|
||||
hr = whp_dispatch.WHvSetPartitionProperty(
|
||||
whpx->partition,
|
||||
WHvPartitionPropertyCodeCpuidExitList,
|
||||
cpuidExitList,
|
||||
RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32));
|
||||
|
||||
if (FAILED(hr)) {
|
||||
error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx",
|
||||
hr);
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*
|
||||
* We do not want to intercept any exceptions from the guest,
|
||||
* until we actually start debugging with gdb.
|
||||
|
||||
Reference in New Issue
Block a user