Adds all devices that behave like a console with respect to the VM configuration. This includes: - debug-console - serial-console - virtio-console
(
&mut self,
interrupt_manager: &dyn InterruptManager<GroupConfig = LegacyIrqGroupConfig>,
console_info: Option<ConsoleInfo>,
console_resize_pipe: Option<Arc<File>>,
| 2493 | /// - serial-console |
| 2494 | /// - virtio-console |
| 2495 | fn add_console_devices( |
| 2496 | &mut self, |
| 2497 | interrupt_manager: &dyn InterruptManager<GroupConfig = LegacyIrqGroupConfig>, |
| 2498 | console_info: Option<ConsoleInfo>, |
| 2499 | console_resize_pipe: Option<Arc<File>>, |
| 2500 | ) -> DeviceManagerResult<Arc<Console>> { |
| 2501 | let serial_config = self.config.lock().unwrap().serial.clone(); |
| 2502 | if console_info.is_none() { |
| 2503 | return Err(DeviceManagerError::InvalidConsoleInfo); |
| 2504 | } |
| 2505 | |
| 2506 | // SAFETY: console_info is Some, so it's safe to unwrap. |
| 2507 | let console_info = console_info.unwrap(); |
| 2508 | |
| 2509 | let serial_writer: Option<Box<dyn io::Write + Send>> = match console_info.serial { |
| 2510 | ConsoleTransport::File(ref file) | ConsoleTransport::Tty(ref file) => { |
| 2511 | Some(Box::new(Arc::clone(file))) |
| 2512 | } |
| 2513 | ConsoleTransport::Off |
| 2514 | | ConsoleTransport::Null |
| 2515 | | ConsoleTransport::Pty(_) |
| 2516 | | ConsoleTransport::Socket(_) => None, |
| 2517 | }; |
| 2518 | |
| 2519 | if !matches!(console_info.serial, ConsoleTransport::Off) { |
| 2520 | let serial = self.add_serial_device(interrupt_manager, serial_writer)?; |
| 2521 | self.serial_manager = match console_info.serial { |
| 2522 | ConsoleTransport::Pty(_) |
| 2523 | | ConsoleTransport::Tty(_) |
| 2524 | | ConsoleTransport::Socket(_) => { |
| 2525 | let serial_manager = SerialManager::new( |
| 2526 | serial, |
| 2527 | console_info.serial, |
| 2528 | serial_config.common.socket, |
| 2529 | ) |
| 2530 | .map_err(DeviceManagerError::CreateSerialManager)?; |
| 2531 | if let Some(mut serial_manager) = serial_manager { |
| 2532 | serial_manager |
| 2533 | .start_thread( |
| 2534 | self.exit_evt |
| 2535 | .try_clone() |
| 2536 | .map_err(DeviceManagerError::EventFd)?, |
| 2537 | ) |
| 2538 | .map_err(DeviceManagerError::SpawnSerialManager)?; |
| 2539 | Some(Arc::new(serial_manager)) |
| 2540 | } else { |
| 2541 | None |
| 2542 | } |
| 2543 | } |
| 2544 | _ => None, |
| 2545 | }; |
| 2546 | } |
| 2547 | |
| 2548 | #[cfg(target_arch = "x86_64")] |
| 2549 | { |
| 2550 | let debug_console_writer: Option<Box<dyn io::Write + Send>> = match console_info.debug { |
| 2551 | ConsoleTransport::File(file) | ConsoleTransport::Tty(file) => Some(Box::new(file)), |
| 2552 | ConsoleTransport::Off |
no test coverage detected