From 57bb9de481fca304b8f3089f6d747f39dcbf1e38 Mon Sep 17 00:00:00 2001 From: Ayush Singh Date: Sun, 31 Mar 2024 01:06:33 +0530 Subject: [PATCH] Fixes from PR - Update system table crc32 Signed-off-by: Ayush Singh --- library/std/src/sys/pal/uefi/process.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/library/std/src/sys/pal/uefi/process.rs b/library/std/src/sys/pal/uefi/process.rs index 7075af186f9bd..c374836117846 100644 --- a/library/std/src/sys/pal/uefi/process.rs +++ b/library/std/src/sys/pal/uefi/process.rs @@ -393,7 +393,9 @@ mod uefi_command_internal { } } - pub fn start_image(&self) -> io::Result { + pub fn start_image(&mut self) -> io::Result { + self.update_st_crc32()?; + let boot_services: NonNull = boot_services() .ok_or_else(|| const_io_error!(io::ErrorKind::NotFound, "Boot Services not found"))? .cast(); @@ -476,6 +478,27 @@ mod uefi_command_internal { self.args = Some(args); } + + fn update_st_crc32(&mut self) -> io::Result<()> { + let bt: NonNull = boot_services().unwrap().cast(); + let st_size = self.st.hdr.header_size as usize; + let mut crc32: u32 = 0; + + let r = unsafe { + ((*bt.as_ptr()).calculate_crc32)( + self.st.as_mut() as *mut r_efi::efi::SystemTable as *mut crate::ffi::c_void, + st_size, + &mut crc32, + ) + }; + + if r.is_error() { + Err(io::Error::from_raw_os_error(r.as_usize())) + } else { + self.st.hdr.crc32 = crc32; + Ok(()) + } + } } impl Drop for Command {