target/i386: Call accel-agnostic x86_cpu_get_supported_cpuid()
x86_cpu_get_supported_cpuid() is generic and handles the different accelerators. Use it instead of kvm_arch_get_supported_cpuid(). That fixes a link failure introduced by commit3adce820cf
("target/i386: Remove unused KVM stubs") when QEMU is configured as: $ ./configure --cc=clang \ --target-list=x86_64-linux-user,x86_64-softmmu \ --enable-debug We were getting: [71/71] Linking target qemu-x86_64 FAILED: qemu-x86_64 /usr/bin/ld: libqemu-x86_64-linux-user.fa.p/target_i386_cpu.c.o: in function `cpu_x86_cpuid': cpu.c:(.text+0x1374): undefined reference to `kvm_arch_get_supported_cpuid' /usr/bin/ld: libqemu-x86_64-linux-user.fa.p/target_i386_cpu.c.o: in function `x86_cpu_filter_features': cpu.c:(.text+0x81c2): undefined reference to `kvm_arch_get_supported_cpuid' /usr/bin/ld: cpu.c:(.text+0x81da): undefined reference to `kvm_arch_get_supported_cpuid' /usr/bin/ld: cpu.c:(.text+0x81f2): undefined reference to `kvm_arch_get_supported_cpuid' /usr/bin/ld: cpu.c:(.text+0x820a): undefined reference to `kvm_arch_get_supported_cpuid' /usr/bin/ld: libqemu-x86_64-linux-user.fa.p/target_i386_cpu.c.o:cpu.c:(.text+0x8225): more undefined references to `kvm_arch_get_supported_cpuid' follow clang: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. For the record, this is because '--enable-debug' disables optimizations (CFLAGS=-O0). While at this (un)optimization level GCC eliminate the following dead code (CPP output of mentioned build): static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { if ((0)) { *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX); *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX); *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX); *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX); } else if (0) { *eax = 0; *ebx = 0; *ecx = 0; *edx = 0; } else { *eax = 0; *ebx = 0; *ecx = 0; *edx = 0; } Clang does not (see commit2140cfa51d
"i386: Fix build by providing stub kvm_arch_get_supported_cpuid()"). Cc: qemu-stable@nongnu.org Fixes:3adce820cf
("target/i386: Remove unused KVM stubs") Reported-by: Kevin Wolf <kwolf@redhat.com> Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20230913093009.83520-4-philmd@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
da472f9487
commit
d047402436
@ -6154,6 +6154,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
case 7:
|
||||
/* Structured Extended Feature Flags Enumeration Leaf */
|
||||
if (count == 0) {
|
||||
uint32_t eax_0_unused, ebx_0, ecx_0, edx_0_unused;
|
||||
|
||||
/* Maximum ECX value for sub-leaves */
|
||||
*eax = env->cpuid_level_func7;
|
||||
*ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
|
||||
@ -6168,17 +6170,15 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
* support enabling SGX and/or SGX flexible launch control,
|
||||
* then we need to update the VM's CPUID values accordingly.
|
||||
*/
|
||||
if ((*ebx & CPUID_7_0_EBX_SGX) &&
|
||||
(!kvm_enabled() ||
|
||||
!(kvm_arch_get_supported_cpuid(cs->kvm_state, 0x7, 0, R_EBX) &
|
||||
CPUID_7_0_EBX_SGX))) {
|
||||
x86_cpu_get_supported_cpuid(0x7, 0,
|
||||
&eax_0_unused, &ebx_0,
|
||||
&ecx_0, &edx_0_unused);
|
||||
if ((*ebx & CPUID_7_0_EBX_SGX) && !(ebx_0 & CPUID_7_0_EBX_SGX)) {
|
||||
*ebx &= ~CPUID_7_0_EBX_SGX;
|
||||
}
|
||||
|
||||
if ((*ecx & CPUID_7_0_ECX_SGX_LC) &&
|
||||
(!(*ebx & CPUID_7_0_EBX_SGX) || !kvm_enabled() ||
|
||||
!(kvm_arch_get_supported_cpuid(cs->kvm_state, 0x7, 0, R_ECX) &
|
||||
CPUID_7_0_ECX_SGX_LC))) {
|
||||
if ((*ecx & CPUID_7_0_ECX_SGX_LC)
|
||||
&& (!(*ebx & CPUID_7_0_EBX_SGX) || !(ecx_0 & CPUID_7_0_ECX_SGX_LC))) {
|
||||
*ecx &= ~CPUID_7_0_ECX_SGX_LC;
|
||||
}
|
||||
} else if (count == 1) {
|
||||
@ -7150,14 +7150,14 @@ static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
|
||||
mark_unavailable_features(cpu, w, unavailable_features, prefix);
|
||||
}
|
||||
|
||||
if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
|
||||
kvm_enabled()) {
|
||||
KVMState *s = CPU(cpu)->kvm_state;
|
||||
uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
|
||||
uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
|
||||
uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
|
||||
uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
|
||||
uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
|
||||
if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) {
|
||||
uint32_t eax_0, ebx_0, ecx_0, edx_0_unused;
|
||||
uint32_t eax_1, ebx_1, ecx_1_unused, edx_1_unused;
|
||||
|
||||
x86_cpu_get_supported_cpuid(0x14, 0,
|
||||
&eax_0, &ebx_0, &ecx_0, &edx_0_unused);
|
||||
x86_cpu_get_supported_cpuid(0x14, 1,
|
||||
&eax_1, &ebx_1, &ecx_1_unused, &edx_1_unused);
|
||||
|
||||
if (!eax_0 ||
|
||||
((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
|
||||
|
Loading…
Reference in New Issue
Block a user