aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMuchun Song <songmuchun@bytedance.com>2022-02-16 19:37:35 +0800
committerWill Deacon <will@kernel.org>2022-02-16 15:43:31 +0000
commit20b93be583f6cb994f9df05e410ff27e24e76dc2 (patch)
treea9d7d209747000ec30d6932fedb26192a5f5db50
parentd4d6f1538966e211913db5d522e67ed65d73625d (diff)
downloadkvmtool-20b93be583f6cb994f9df05e410ff27e24e76dc2.tar.gz
x86: Set the correct APIC ID
When kvmtool boots a kernel, the dmesg will print the following message: [Firmware Bug]: CPU1: APIC id mismatch. Firmware: 1 APIC: 30 Fix this by setting up correct initial_apicid to cpu_id. Signed-off-by: Muchun Song <songmuchun@bytedance.com> Tested-by: Alexandru Elisei <alexandru.elisei@arm.com> Link: https://lore.kernel.org/r/20220216113735.52240-2-songmuchun@bytedance.com Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r--x86/cpuid.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/x86/cpuid.c b/x86/cpuid.c
index c3b67d92..aa213d5b 100644
--- a/x86/cpuid.c
+++ b/x86/cpuid.c
@@ -8,7 +8,7 @@
#define MAX_KVM_CPUID_ENTRIES 100
-static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid)
+static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid, int cpu_id)
{
unsigned int signature[3];
unsigned int i;
@@ -28,6 +28,8 @@ static void filter_cpuid(struct kvm_cpuid2 *kvm_cpuid)
entry->edx = signature[2];
break;
case 1:
+ entry->ebx &= ~(0xff << 24);
+ entry->ebx |= cpu_id << 24;
/* Set X86_FEATURE_HYPERVISOR */
if (entry->index == 0)
entry->ecx |= (1 << 31);
@@ -80,7 +82,7 @@ void kvm_cpu__setup_cpuid(struct kvm_cpu *vcpu)
if (ioctl(vcpu->kvm->sys_fd, KVM_GET_SUPPORTED_CPUID, kvm_cpuid) < 0)
die_perror("KVM_GET_SUPPORTED_CPUID failed");
- filter_cpuid(kvm_cpuid);
+ filter_cpuid(kvm_cpuid, vcpu->cpu_id);
if (ioctl(vcpu->vcpu_fd, KVM_SET_CPUID2, kvm_cpuid) < 0)
die_perror("KVM_SET_CPUID2 failed");