MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / add_console_devices

Method add_console_devices

vmm/src/device_manager.rs:2495–2566  ·  view source on GitHub ↗

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>>,
  

Source from the content-addressed store, hash-verified

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

Callers 1

create_devicesMethod · 0.80

Calls 7

newFunction · 0.85
add_serial_deviceMethod · 0.80
cloneMethod · 0.45
start_threadMethod · 0.45
try_cloneMethod · 0.45

Tested by

no test coverage detected