diff options
author | Cody Schuffelen <schuffelen@google.com> | 2019-05-21 12:12:38 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-31 17:21:46 -0700 |
commit | 6d1ab5094375afb653d9955fe7ccb818eca48665 (patch) | |
tree | 863d07e2334dec3f66961afbdcb8a618b08384e1 /aarch64/src | |
parent | 580d4186562c9c1e5b399885c6c5647cdde15243 (diff) | |
download | crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar.gz crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar.bz2 crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar.lz crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar.xz crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.tar.zst crosvm-6d1ab5094375afb653d9955fe7ccb818eca48665.zip |
Initial BIOS support.
The --bios argument is added as an alternative to the kernel positional argument. The BIOS runs in unreal mode (16-bit cs selector set to the end of 32-bit address space), which matches the default state KVM puts the segment and data registers into. Example usage: Build u-boot with "make qemu-x86_defconfig && make" Run crosvm with "crosvm_wrapper.sh run --bios=u-boot.rom" This produces the following message: """ U-Boot 2019.01-00017-gdc76aabe6a-dirty (May 21 2019 - 12:17:02 -0700) CPU: DRAM: 16 MiB unable to get online cpu number: -19 Warning: MP init failure Model: QEMU x86 (I440FX) Net: No ethernet found. error: can't find etc/table-loader Hit any key to stop autoboot: 0 => """ At this point the u-boot shell works with stdin/stdout, but virtual disks passed with --rwdisk weren't immediately visible from running "virtio scan" and "virtio info". This change puts the bios loading together with the linux kernel loading code since there is a lot of overlap in functionality. Bug: b/133358982 Test: ./crosvm_wrapper.sh run --mem=4097 --bios=u-boot.rom Change-Id: I65b0e1044233af662a642c592d35b106217f3c13 Reviewed-on: https://chromium-review.googlesource.com/1622648 Commit-Ready: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'aarch64/src')
-rw-r--r-- | aarch64/src/lib.rs | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs index 64dfb1f..4d226c0 100644 --- a/aarch64/src/lib.rs +++ b/aarch64/src/lib.rs @@ -11,7 +11,7 @@ use std::io; use std::os::unix::io::FromRawFd; use std::sync::Arc; -use arch::{RunnableLinuxVm, VmComponents}; +use arch::{RunnableLinuxVm, VmComponents, VmImage}; use devices::{ get_serial_tty_string, Bus, BusError, PciConfigMmio, PciDevice, PciInterruptPin, SerialParameters, @@ -124,6 +124,7 @@ pub enum Error { CreateVm(sys_util::Error), InitrdLoadFailure(arch::LoadImageError), KernelLoadFailure(arch::LoadImageError), + KernelMissing, ReadPreferredTarget(sys_util::Error), RegisterIrqfd(sys_util::Error), RegisterPci(BusError), @@ -155,6 +156,7 @@ impl Display for Error { CreateVm(e) => write!(f, "failed to create vm: {}", 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"), ReadPreferredTarget(e) => write!(f, "failed to read preferred target: {}", e), RegisterIrqfd(e) => write!(f, "failed to register irq fd: {}", e), RegisterPci(e) => write!(f, "error registering PCI bus: {}", e), @@ -272,15 +274,16 @@ impl arch::LinuxArch for AArch64 { cmdline.insert_str(¶m).map_err(Error::Cmdline)?; } + let kernel_image = if let VmImage::Kernel(ref mut img) = components.vm_image { + img + } else { + return Err(Error::KernelMissing); + }; + // separate out kernel loading from other setup to get a specific error for // kernel loading - let kernel_size = arch::load_image( - &mem, - &mut components.kernel_image, - get_kernel_addr(), - u64::max_value(), - ) - .map_err(Error::KernelLoadFailure)?; + let kernel_size = arch::load_image(&mem, kernel_image, get_kernel_addr(), u64::max_value()) + .map_err(Error::KernelLoadFailure)?; let kernel_end = get_kernel_addr().offset() + kernel_size as u64; Self::setup_system_memory( &mem, |