hypervisor: aarch64: Add init_vm
Gunyah initializes at VM level, not the vCPU level as KVM. Add
VM-generic initialization which happens after build_vm, but before the
VM starts to run.
BUG=b:232360323
Change-Id: Iea38cf63eca9b525e613450fd7bca2d422923063
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4400669
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs
index d53648c..06d343c 100644
--- a/aarch64/src/lib.rs
+++ b/aarch64/src/lib.rs
@@ -255,6 +255,8 @@
InitPvtimeError(base::Error),
#[error("initrd could not be loaded: {0}")]
InitrdLoadFailure(arch::LoadImageError),
+ #[error("failed to initialize virtual machine {0}")]
+ InitVmError(base::Error),
#[error("kernel could not be loaded: {0}")]
KernelLoadFailure(kernel_loader::Error),
#[error("error loading Kernel from Elf image: {0}")]
@@ -702,6 +704,13 @@
)
.map_err(Error::CreateFdt)?;
+ vm.init_arch(
+ payload.entry(),
+ fdt_offset,
+ AARCH64_FDT_MAX_SIZE.try_into().unwrap(),
+ )
+ .map_err(Error::InitVmError)?;
+
Ok(RunnableLinuxVm {
vm,
vcpu_count,
diff --git a/hypervisor/src/aarch64.rs b/hypervisor/src/aarch64.rs
index 712aa2f..a3d3b98 100644
--- a/hypervisor/src/aarch64.rs
+++ b/hypervisor/src/aarch64.rs
@@ -84,6 +84,14 @@
fdt: &mut FdtWriter,
phandles: &BTreeMap<&str, u32>,
) -> cros_fdt::Result<()>;
+
+ // Initialize a VM. Called after building the VM. Presently called before vCPUs are initialized.
+ fn init_arch(
+ &self,
+ payload_entry_address: GuestAddress,
+ fdt_address: GuestAddress,
+ fdt_size: usize,
+ ) -> Result<()>;
}
/// A wrapper around creating and using a VCPU on aarch64.
diff --git a/hypervisor/src/geniezone/mod.rs b/hypervisor/src/geniezone/mod.rs
index e19b67a..10c166c 100644
--- a/hypervisor/src/geniezone/mod.rs
+++ b/hypervisor/src/geniezone/mod.rs
@@ -192,6 +192,15 @@
) -> cros_fdt::Result<()> {
Ok(())
}
+
+ fn init_arch(
+ &self,
+ _payload_entry_address: GuestAddress,
+ _fdt_address: GuestAddress,
+ _fdt_size: usize,
+ ) -> Result<()> {
+ Ok(())
+ }
}
impl GeniezoneVcpu {
diff --git a/hypervisor/src/kvm/aarch64.rs b/hypervisor/src/kvm/aarch64.rs
index 7ad773e..da8bc77 100644
--- a/hypervisor/src/kvm/aarch64.rs
+++ b/hypervisor/src/kvm/aarch64.rs
@@ -216,6 +216,15 @@
) -> cros_fdt::Result<()> {
Ok(())
}
+
+ fn init_arch(
+ &self,
+ _payload_entry_address: GuestAddress,
+ _fdt_address: GuestAddress,
+ _fdt_size: usize,
+ ) -> Result<()> {
+ Ok(())
+ }
}
impl KvmVcpu {