diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2020-03-09 13:16:46 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-04-23 07:17:59 +0000 |
commit | a7b6a1c897205d8320482eb506167c5df66647b2 (patch) | |
tree | 10b3f4ba971bfbd0a03c258193bbd47b8c672aa4 /aarch64/src | |
parent | b865810340f1b264b407137c4e69ad232194cc5e (diff) | |
download | crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar.gz crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar.bz2 crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar.lz crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar.xz crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.tar.zst crosvm-a7b6a1c897205d8320482eb506167c5df66647b2.zip |
arch, main: add virtio-console parsing and creation
This allows the creation of virtio-console devices using the new hardware=virtio-console parameter to the --serial option. Also add support for the serial earlycon option, which allows using virtio-console as the main console device with a traditional serial device as the early console. This allows logging during early boot before PCI device discovery (when virtio-console devices are set up). BUG=chromium:1059924 TEST=crosvm run -r vm_rootfs.img \ --serial hardware=serial,type=stdout,console=false,earlycon=true \ --serial hardware=virtio-console,type=stdout,console=true,stdin=true \ vm_kernel Change-Id: Iff48800272b154d49b1da00f3914799089268afe Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2127322 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'aarch64/src')
-rw-r--r-- | aarch64/src/lib.rs | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs index 67e37b4..1116b69 100644 --- a/aarch64/src/lib.rs +++ b/aarch64/src/lib.rs @@ -11,7 +11,10 @@ use std::io; use std::os::unix::io::FromRawFd; use std::sync::Arc; -use arch::{get_serial_tty_string, RunnableLinuxVm, SerialParameters, VmComponents, VmImage}; +use arch::{ + get_serial_cmdline, GetSerialCmdlineError, RunnableLinuxVm, SerialHardware, SerialParameters, + VmComponents, VmImage, +}; use devices::{Bus, BusError, PciConfigMmio, PciDevice, PciInterruptPin}; use io_jail::Minijail; use remain::sorted; @@ -121,6 +124,7 @@ pub enum Error { CreateSocket(io::Error), CreateVcpu(sys_util::Error), CreateVm(sys_util::Error), + GetSerialCmdline(GetSerialCmdlineError), InitrdLoadFailure(arch::LoadImageError), KernelLoadFailure(arch::LoadImageError), KernelMissing, @@ -153,6 +157,7 @@ impl Display for Error { CreateSocket(e) => write!(f, "failed to create socket: {}", e), CreateVcpu(e) => write!(f, "failed to create VCPU: {}", e), CreateVm(e) => write!(f, "failed to create vm: {}", e), + GetSerialCmdline(e) => write!(f, "failed to get serial cmdline: {}", e), InitrdLoadFailure(e) => write!(f, "initrd cound not be loaded: {}", e), KernelLoadFailure(e) => write!(f, "kernel cound not be loaded: {}", e), KernelMissing => write!(f, "aarch64 requires a kernel"), @@ -194,7 +199,7 @@ impl arch::LinuxArch for AArch64 { mut components: VmComponents, _split_irqchip: bool, _ioapic_device_socket: VmIrqRequestSocket, - serial_parameters: &BTreeMap<u8, SerialParameters>, + serial_parameters: &BTreeMap<(SerialHardware, u8), SerialParameters>, serial_jail: Option<Minijail>, create_devices: F, ) -> Result<RunnableLinuxVm> @@ -259,11 +264,11 @@ impl arch::LinuxArch for AArch64 { let com_evt_1_3 = EventFd::new().map_err(Error::CreateEventFd)?; let com_evt_2_4 = EventFd::new().map_err(Error::CreateEventFd)?; - let stdio_serial_num = arch::add_serial_devices( + arch::add_serial_devices( &mut mmio_bus, &com_evt_1_3, &com_evt_2_4, - &serial_parameters, + serial_parameters, serial_jail, ) .map_err(Error::CreateSerialDevices)?; @@ -282,7 +287,9 @@ impl arch::LinuxArch for AArch64 { ) .map_err(Error::RegisterPci)?; - let mut cmdline = Self::get_base_linux_cmdline(stdio_serial_num); + let mut cmdline = Self::get_base_linux_cmdline(); + get_serial_cmdline(&mut cmdline, serial_parameters, "mmio") + .map_err(Error::GetSerialCmdline)?; for param in components.extra_kernel_params { cmdline.insert_str(¶m).map_err(Error::Cmdline)?; } @@ -385,12 +392,8 @@ impl AArch64 { } /// This returns a base part of the kernel command for this architecture - fn get_base_linux_cmdline(stdio_serial_num: Option<u8>) -> kernel_cmdline::Cmdline { + fn get_base_linux_cmdline() -> kernel_cmdline::Cmdline { let mut cmdline = kernel_cmdline::Cmdline::new(sys_util::pagesize()); - if let Some(stdio_serial_num) = stdio_serial_num { - let tty_string = get_serial_tty_string(stdio_serial_num); - cmdline.insert("console", &tty_string).unwrap(); - } cmdline.insert_str("panic=-1").unwrap(); cmdline } |