mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-03-20 07:58:55 +00:00
arch: x86_64: Avoid calling cpuid for setting LAPIC ID
Rather than calling cpuid and then updating the APIC ID field - use the existing common CPUID data which already includes CPUID data for eax=1 (aka function = 1). This removes the need to call cpuid per vCPU thread created. This has a positive impact on boot time with multiple vCPUs as the cpuid instruction is serialising. Fixes: #5646 Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
This commit is contained in:
parent
d3cd25566b
commit
eb4dd90532
@ -820,12 +820,17 @@ pub fn configure_vcpu(
|
||||
CpuidPatch::set_cpuid_reg(&mut cpuid, 0x8000_001e, Some(0), CpuidReg::EAX, x2apic_id);
|
||||
}
|
||||
|
||||
// Set ApicId in cpuid for each vcpu
|
||||
// SAFETY: get host cpuid when eax=1
|
||||
let mut cpu_ebx = unsafe { core::arch::x86_64::__cpuid(1) }.ebx;
|
||||
cpu_ebx &= 0xffffff;
|
||||
cpu_ebx |= x2apic_id << 24;
|
||||
CpuidPatch::set_cpuid_reg(&mut cpuid, 0x1, None, CpuidReg::EBX, cpu_ebx);
|
||||
// Set ApicId in cpuid for each vcpu - found in cpuid ebx when eax = 1
|
||||
let mut apic_id_patched = false;
|
||||
for entry in &mut cpuid {
|
||||
if entry.function == 1 {
|
||||
entry.ebx &= 0xffffff;
|
||||
entry.ebx |= x2apic_id << 24;
|
||||
apic_id_patched = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assert!(apic_id_patched);
|
||||
|
||||
if let Some(t) = topology {
|
||||
update_cpuid_topology(&mut cpuid, t.0, t.1, t.2, cpu_vendor, id);
|
||||
|
Loading…
x
Reference in New Issue
Block a user