mirror of https://github.com/xemu-project/xemu.git
i386/hvf: Adds support for INVTSC cpuid bit
This patch adds the INVTSC bit to the Hypervisor.framework accelerator's CPUID bit passthrough allow-list. Previously, specifying +invtsc in the CPU configuration would fail with the following warning despite the host CPU advertising the feature: qemu-system-x86_64: warning: host doesn't support requested feature: CPUID.80000007H:EDX.invtsc [bit 8] x86 macOS itself relies on a fixed rate TSC for its own Mach absolute time timestamp mechanism, so there's no reason we can't enable this bit for guests. When the feature is enabled, a migration blocker is installed. Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu> Reviewed-by: Roman Bolshakov <roman@roolebo.dev> Tested-by: Roman Bolshakov <roman@roolebo.dev> Message-ID: <20240605112556.43193-2-phil@philjordan.eu> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
fcce5287c0
commit
9c267239c7
|
@ -49,6 +49,8 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/memalign.h"
|
||||
#include "qapi/error.h"
|
||||
#include "migration/blocker.h"
|
||||
|
||||
#include "sysemu/hvf.h"
|
||||
#include "sysemu/hvf_int.h"
|
||||
|
@ -74,6 +76,8 @@
|
|||
#include "qemu/accel.h"
|
||||
#include "target/i386/cpu.h"
|
||||
|
||||
static Error *invtsc_mig_blocker;
|
||||
|
||||
void vmx_update_tpr(CPUState *cpu)
|
||||
{
|
||||
/* TODO: need integrate APIC handling */
|
||||
|
@ -221,6 +225,8 @@ int hvf_arch_init_vcpu(CPUState *cpu)
|
|||
{
|
||||
X86CPU *x86cpu = X86_CPU(cpu);
|
||||
CPUX86State *env = &x86cpu->env;
|
||||
Error *local_err = NULL;
|
||||
int r;
|
||||
uint64_t reqCap;
|
||||
|
||||
init_emu();
|
||||
|
@ -238,6 +244,18 @@ int hvf_arch_init_vcpu(CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
if ((env->features[FEAT_8000_0007_EDX] & CPUID_APM_INVTSC) &&
|
||||
invtsc_mig_blocker == NULL) {
|
||||
error_setg(&invtsc_mig_blocker,
|
||||
"State blocked by non-migratable CPU device (invtsc flag)");
|
||||
r = migrate_add_blocker(&invtsc_mig_blocker, &local_err);
|
||||
if (r < 0) {
|
||||
error_report_err(local_err);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (hv_vmx_read_capability(HV_VMX_CAP_PINBASED,
|
||||
&hvf_state->hvf_caps->vmx_cap_pinbased)) {
|
||||
abort();
|
||||
|
|
|
@ -146,6 +146,10 @@ uint32_t hvf_get_supported_cpuid(uint32_t func, uint32_t idx,
|
|||
CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_OSVW | CPUID_EXT3_XOP |
|
||||
CPUID_EXT3_FMA4 | CPUID_EXT3_TBM;
|
||||
break;
|
||||
case 0x80000007:
|
||||
edx &= CPUID_APM_INVTSC;
|
||||
eax = ebx = ecx = 0;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue