diff --git a/arch/src/aarch64/mod.rs b/arch/src/aarch64/mod.rs index f78880092..136620c85 100644 --- a/arch/src/aarch64/mod.rs +++ b/arch/src/aarch64/mod.rs @@ -63,7 +63,6 @@ pub fn configure_vcpu( id: u8, kernel_entry_point: Option, vm_memory: &GuestMemoryAtomic, - _phys_bits: u8, ) -> super::Result { if let Some(kernel_entry_point) = kernel_entry_point { regs::setup_regs( diff --git a/arch/src/x86_64/mod.rs b/arch/src/x86_64/mod.rs index 8d1b30643..75486e8b2 100644 --- a/arch/src/x86_64/mod.rs +++ b/arch/src/x86_64/mod.rs @@ -336,7 +336,6 @@ pub fn configure_vcpu( vm_memory: &GuestMemoryAtomic, cpuid: CpuId, kvm_hyperv: bool, - phys_bits: u8, ) -> super::Result<()> { let mut cpuid = cpuid; CpuidPatch::set_cpuid_reg(&mut cpuid, 0xb, None, CpuidReg::EDX, u32::from(id)); @@ -410,13 +409,6 @@ pub fn configure_vcpu( .map_err(|_| Error::PopulatingCpuid)?; } - // Set CPU physical bits - for entry in cpuid.as_mut_slice().iter_mut() { - if entry.function == 0x8000_0008 { - entry.eax = (entry.eax & 0xffff_ff00) | (phys_bits as u32 & 0xff); - } - } - fd.set_cpuid2(&cpuid) .map_err(|e| Error::SetSupportedCpusFailed(e.into()))?; diff --git a/vmm/src/cpu.rs b/vmm/src/cpu.rs index a4a74c358..5e8ea44f4 100644 --- a/vmm/src/cpu.rs +++ b/vmm/src/cpu.rs @@ -17,6 +17,7 @@ use crate::config::CpusConfig; use crate::device_manager::DeviceManager; use crate::memory_manager::MemoryManager; use crate::seccomp_filters::{get_seccomp_filter, Thread}; +#[cfg(target_arch = "x86_64")] use crate::vm::physical_bits; use crate::CPU_MANAGER_SNAPSHOT_ID; #[cfg(feature = "acpi")] @@ -258,19 +259,12 @@ impl Vcpu { vm_memory: &GuestMemoryAtomic, #[cfg(target_arch = "x86_64")] cpuid: CpuId, #[cfg(target_arch = "x86_64")] kvm_hyperv: bool, - phys_bits: u8, ) -> Result<()> { #[cfg(target_arch = "aarch64")] { self.init(vm)?; - self.mpidr = arch::configure_vcpu( - &self.vcpu, - self.id, - kernel_entry_point, - vm_memory, - phys_bits, - ) - .map_err(Error::VcpuConfiguration)?; + self.mpidr = arch::configure_vcpu(&self.vcpu, self.id, kernel_entry_point, vm_memory) + .map_err(Error::VcpuConfiguration)?; } #[cfg(target_arch = "x86_64")] @@ -281,7 +275,6 @@ impl Vcpu { vm_memory, cpuid, kvm_hyperv, - phys_bits, ) .map_err(Error::VcpuConfiguration)?; @@ -559,7 +552,10 @@ impl CpuManager { None }; #[cfg(target_arch = "x86_64")] - let cpuid = CpuManager::patch_cpuid(hypervisor, &config.topology, sgx_epc_sections)?; + let cpuid = { + let phys_bits = physical_bits(config.max_phys_bits); + CpuManager::patch_cpuid(hypervisor, &config.topology, sgx_epc_sections, phys_bits)? + }; let device_manager = device_manager.lock().unwrap(); #[cfg(feature = "acpi")] @@ -607,6 +603,7 @@ impl CpuManager { hypervisor: Arc, topology: &Option, sgx_epc_sections: Option>, + phys_bits: u8, ) -> Result { let mut cpuid_patches = Vec::new(); @@ -663,6 +660,13 @@ impl CpuManager { arch::x86_64::update_cpuid_sgx(&mut cpuid, sgx_epc_sections).unwrap(); } + // Set CPU physical bits + for entry in cpuid.as_mut_slice().iter_mut() { + if entry.function == 0x8000_0008 { + entry.eax = (entry.eax & 0xffff_ff00) | (phys_bits as u32 & 0xff); + } + } + Ok(cpuid) } @@ -688,8 +692,6 @@ impl CpuManager { } else { let vm_memory = self.vm_memory.clone(); - let phys_bits = physical_bits(self.config.max_phys_bits); - #[cfg(target_arch = "x86_64")] vcpu.lock() .unwrap() @@ -698,14 +700,13 @@ impl CpuManager { &vm_memory, self.cpuid.clone(), self.config.kvm_hyperv, - phys_bits, ) .expect("Failed to configure vCPU"); #[cfg(target_arch = "aarch64")] vcpu.lock() .unwrap() - .configure(&self.vm, entry_point, &vm_memory, phys_bits) + .configure(&self.vm, entry_point, &vm_memory) .expect("Failed to configure vCPU"); }