summary refs log tree commit diff
path: root/aarch64
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-12-12 15:20:30 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-01-18 00:45:57 -0800
commitc195616e3f288672198961c043ba5a2a71b792b9 (patch)
tree4653283a499402428aff150f62ee041c2c80375b /aarch64
parent68d0e7237e8ffac07239032c8d2ef0ccf3f1d312 (diff)
downloadcrosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar.gz
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar.bz2
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar.lz
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar.xz
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.tar.zst
crosvm-c195616e3f288672198961c043ba5a2a71b792b9.zip
arch: add generic image loading function
Factor out the common parts of kernel loading code from x86_64 and
aarch64.  This will be used to load initrds as well.

BUG=None
TEST=Boot termina on kevin

Change-Id: I0f61fdaf1067311d25393e8d64340f570f5a6ed7
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1407220
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'aarch64')
-rw-r--r--aarch64/src/lib.rs30
1 files changed, 10 insertions, 20 deletions
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs
index c1696e4..dda7bfc 100644
--- a/aarch64/src/lib.rs
+++ b/aarch64/src/lib.rs
@@ -135,7 +135,7 @@ pub enum Error {
     /// FDT could not be created
     FDTCreateFailure(Box<error::Error>),
     /// Kernel could not be loaded
-    KernelLoadFailure,
+    KernelLoadFailure(arch::LoadImageError),
     /// Failure to Create GIC
     CreateGICFailure(sys_util::Error),
     /// Couldn't register PCI bus.
@@ -159,7 +159,7 @@ impl error::Error for Error {
             &Error::CreateSocket(_) => "failed to create socket",
             &Error::CreateVcpu(_) => "failed to create VCPU",
             &Error::FDTCreateFailure(_) => "FDT could not be created",
-            &Error::KernelLoadFailure => "Kernel cound not be loaded",
+            &Error::KernelLoadFailure(_) => "Kernel cound not be loaded",
             &Error::CreateGICFailure(_) => "Failure to create GIC",
             &Error::RegisterPci(_) => "error registering PCI bus",
             &Error::RegisterVsock(_) => "error registering virtual socket device",
@@ -250,9 +250,15 @@ impl arch::LinuxArch for AArch64 {
             cmdline.insert_str(&param).map_err(Error::Cmdline)?;
         }
 
-        // separate out load_kernel from other setup to get a specific error for
+        // separate out kernel loading from other setup to get a specific error for
         // kernel loading
-        Self::load_kernel(&mem, &mut components.kernel_image)?;
+        arch::load_image(
+            &mem,
+            &mut components.kernel_image,
+            get_kernel_addr(),
+            u64::max_value(),
+        )
+        .map_err(Error::KernelLoadFailure)?;
         Self::setup_system_memory(
             &mem,
             components.memory_mb,
@@ -276,22 +282,6 @@ impl arch::LinuxArch for AArch64 {
 }
 
 impl AArch64 {
-    /// Loads the kernel from an open file.
-    ///
-    /// # Arguments
-    ///
-    /// * `mem` - The memory to be used by the guest.
-    /// * `kernel_image` - the File object for the specified kernel.
-    fn load_kernel(guest_mem: &GuestMemory, mut kernel_image: &mut File) -> Result<()> {
-        let kernel_addr = get_kernel_addr();
-        let kernel_meta = kernel_image.metadata()?;
-        let kernel_size = kernel_meta.len();
-        guest_mem
-            .read_to_memory(kernel_addr, &mut kernel_image, kernel_size as usize)
-            .map_err(|_| Error::KernelLoadFailure)?;
-        Ok(())
-    }
-
     fn setup_system_memory(
         mem: &GuestMemory,
         mem_size: u64,