From 8126b243fc3439a00596395bce56e9ca32107c68 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 23 Jun 2024 04:46:32 -0700 Subject: [PATCH] chore(xenplatform): elf loader should async load the file --- crates/xen/xenplatform/src/elfloader.rs | 29 ++++++++++++++++--------- crates/xen/xenplatform/src/error.rs | 2 ++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/crates/xen/xenplatform/src/elfloader.rs b/crates/xen/xenplatform/src/elfloader.rs index 8b2509e..354d6cb 100644 --- a/crates/xen/xenplatform/src/elfloader.rs +++ b/crates/xen/xenplatform/src/elfloader.rs @@ -16,10 +16,12 @@ use slice_copy::copy; use std::collections::HashMap; use std::io::{BufReader, Read}; use std::mem::size_of; +use std::sync::Arc; use xz2::bufread::XzDecoder; +#[derive(Clone)] pub struct ElfImageLoader { - data: Vec, + data: Arc>, } fn xen_note_value_as_u64(endian: AnyEndian, value: &[u8]) -> Option { @@ -59,7 +61,9 @@ fn xen_note_value_as_u64(endian: AnyEndian, value: &[u8]) -> Option { impl ElfImageLoader { pub fn new(data: Vec) -> ElfImageLoader { - ElfImageLoader { data } + ElfImageLoader { + data: Arc::new(data), + } } pub fn load_gz(data: &[u8]) -> Result { @@ -122,15 +126,8 @@ impl ElfImageLoader { Err(Error::ElfCompressionUnknown) } -} -struct ElfNoteValue { - value: u64, -} - -#[async_trait::async_trait] -impl BootImageLoader for ElfImageLoader { - async fn parse(&self, hvm: bool) -> Result { + fn parse_sync(&self, hvm: bool) -> Result { let elf = ElfBytes::::minimal_parse(self.data.as_slice())?; let headers = elf.section_headers().ok_or(Error::ElfInvalidImage)?; let mut linux_notes: HashMap> = HashMap::new(); @@ -250,6 +247,18 @@ impl BootImageLoader for ElfImageLoader { }; Ok(image_info) } +} + +struct ElfNoteValue { + value: u64, +} + +#[async_trait::async_trait] +impl BootImageLoader for ElfImageLoader { + async fn parse(&self, hvm: bool) -> Result { + let loader = self.clone(); + tokio::task::spawn_blocking(move || loader.parse_sync(hvm)).await? + } async fn load(&self, image_info: &BootImageInfo, dst: &mut [u8]) -> Result<()> { let elf = ElfBytes::::minimal_parse(self.data.as_slice())?; diff --git a/crates/xen/xenplatform/src/error.rs b/crates/xen/xenplatform/src/error.rs index 72d85f7..a90e697 100644 --- a/crates/xen/xenplatform/src/error.rs +++ b/crates/xen/xenplatform/src/error.rs @@ -38,6 +38,8 @@ pub enum Error { GenericError(String), #[error("failed to parse int: {0}")] ParseIntError(#[from] std::num::ParseIntError), + #[error("failed to join async task: {0}")] + AsyncJoinError(#[from] tokio::task::JoinError), } pub type Result = std::result::Result;