From 09e79a5e9b6f25f18c918d7c5ba057216e47040d Mon Sep 17 00:00:00 2001 From: Praveen K Paladugu Date: Mon, 15 Aug 2022 15:34:54 +0000 Subject: [PATCH] vmm: Add tpm device to mmio bus Add tpm device to mmio bus if appropriate cmdline arguments were passed. Signed-off-by: Praveen K Paladugu --- vmm/src/device_manager.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 410734c9e..7165f5801 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -172,6 +172,9 @@ pub enum DeviceManagerError { /// Cannot create virtio-vsock device CreateVirtioVsock(io::Error), + /// Cannot create tpm device + CreateTpmDevice(anyhow::Error), + /// Failed to convert Path to &str for the vDPA device. CreateVdpaConvertPath, @@ -1187,6 +1190,11 @@ impl DeviceManager { console_resize_pipe, )?; + if let Some(tpm) = self.config.clone().lock().unwrap().tpm.as_ref() { + let tpm_dev = self.add_tpm_device(tpm.socket.clone())?; + self.bus_devices + .push(Arc::clone(&tpm_dev) as Arc>) + } self.legacy_interrupt_manager = Some(legacy_interrupt_manager); virtio_devices.append(&mut self.make_virtio_devices()?); @@ -1986,6 +1994,29 @@ impl DeviceManager { Ok(Arc::new(Console { console_resizer })) } + fn add_tpm_device( + &mut self, + tpm_path: PathBuf, + ) -> DeviceManagerResult>> { + // Create TPM Device + let tpm = devices::tpm::Tpm::new(tpm_path.to_str().unwrap().to_string()).map_err(|e| { + DeviceManagerError::CreateTpmDevice(anyhow!("Failed to create TPM Device : {:?}", e)) + })?; + let tpm = Arc::new(Mutex::new(tpm)); + + // Add TPM Device to mmio + self.address_manager + .mmio_bus + .insert( + tpm.clone(), + arch::layout::TPM_START.0, + arch::layout::TPM_SIZE, + ) + .map_err(DeviceManagerError::BusError)?; + + Ok(tpm) + } + fn make_virtio_devices(&mut self) -> DeviceManagerResult> { let mut devices: Vec = Vec::new();