Signed-off-by: Ying Fang fangying1@huawei.com --- boot_loader/src/aarch64/mod.rs | 5 ++++- device_model/src/micro_vm/mod.rs | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/boot_loader/src/aarch64/mod.rs b/boot_loader/src/aarch64/mod.rs index 190abe2..b9fa3d3 100644 --- a/boot_loader/src/aarch64/mod.rs +++ b/boot_loader/src/aarch64/mod.rs @@ -73,6 +73,7 @@ pub fn linux_bootloader( config: &AArch64BootLoaderConfig, sys_mem: &Arc<AddressSpace>, ) -> Result<AArch64BootLoader> { + let dtb_addr = if sys_mem.memory_end_address().raw_value() > u64::from(device_tree::FDT_MAX_SIZE) { if let Some(addr) = sys_mem @@ -96,6 +97,8 @@ pub fn linux_bootloader( return Err(ErrorKind::DTBOverflow(sys_mem.memory_end_address().raw_value()).into()); }
+ let dbt_addr: u64 = 1 << 30; + let mut initrd_addr = 0; if config.initrd_size > 0 { initrd_addr = if let Some(addr) = dtb_addr.checked_sub(u64::from(config.initrd_size)) { @@ -112,7 +115,7 @@ pub fn linux_bootloader( }
Ok(AArch64BootLoader { - kernel_start: config.mem_start + AARCH64_KERNEL_OFFSET, + kernel_start: 0x00, vmlinux_start: config.mem_start + AARCH64_KERNEL_OFFSET, initrd_start: initrd_addr, dtb_start: dtb_addr, diff --git a/device_model/src/micro_vm/mod.rs b/device_model/src/micro_vm/mod.rs index 6751f8d..e99d8fb 100644 --- a/device_model/src/micro_vm/mod.rs +++ b/device_model/src/micro_vm/mod.rs @@ -51,7 +51,7 @@ use vmm_sys_util::terminal::Terminal;
#[cfg(target_arch = "x86_64")] use address_space::KvmIoListener; -use address_space::{create_host_mmaps, AddressSpace, GuestAddress, KvmMemoryListener, Region}; +use address_space::{create_host_mmaps, AddressSpace, GuestAddress, KvmMemoryListener, Region, FileBackend, HostMemMapping}; use boot_loader::{load_kernel, BootLoaderConfig}; use machine_manager::config::{ BootSource, ConsoleConfig, DriveConfig, NetworkInterfaceConfig, SerialConfig, VmConfig, @@ -61,6 +61,7 @@ use machine_manager::machine::{ DeviceInterface, KvmVmState, MachineAddressInterface, MachineExternalInterface, MachineInterface, MachineLifecycle, }; + #[cfg(feature = "qmp")] use machine_manager::{qmp, qmp::qmp_schema as schema, qmp::QmpChannel}; #[cfg(target_arch = "aarch64")] @@ -88,6 +89,9 @@ use crate::{
use crate::{LayoutEntryType, MEM_LAYOUT};
+#[cfg(target_arch = "aarch64")] +pub const UEFI_ROM_BASE: u64 = 0x0; + /// Every type of devices depends on this configure-related trait to perform /// initialization. pub trait ConfigDevBuilder { @@ -223,6 +227,21 @@ impl LightMachine { )?; }
+ // Init uefi rom + let path = Some("/home/QEMU_EFI.raw"); + let fb = FileBackend::new(path.unwrap(), 0x04000000)?; + let mapping = Arc::new(HostMemMapping::new( + GuestAddress(UEFI_ROM_BASE), + 0x04000000, + fb.file.as_raw_fd(), + 0 as u64, + false, + false)?); + sys_mem.root().add_subregion( + Region::init_ram_region(mapping.clone()), + mapping.start_address().raw_value(), + )?; + #[cfg(target_arch = "x86_64")] Self::arch_init(&vm_fd)?;