File tree 1 file changed +24
-1
lines changed
library/std/src/sys/pal/uefi
1 file changed +24
-1
lines changed Original file line number Diff line number Diff line change @@ -393,7 +393,9 @@ mod uefi_command_internal {
393
393
}
394
394
}
395
395
396
- pub fn start_image ( & self ) -> io:: Result < r_efi:: efi:: Status > {
396
+ pub fn start_image ( & mut self ) -> io:: Result < r_efi:: efi:: Status > {
397
+ self . update_st_crc32 ( ) ?;
398
+
397
399
let boot_services: NonNull < r_efi:: efi:: BootServices > = boot_services ( )
398
400
. ok_or_else ( || const_io_error ! ( io:: ErrorKind :: NotFound , "Boot Services not found" ) ) ?
399
401
. cast ( ) ;
@@ -476,6 +478,27 @@ mod uefi_command_internal {
476
478
477
479
self . args = Some ( args) ;
478
480
}
481
+
482
+ fn update_st_crc32 ( & mut self ) -> io:: Result < ( ) > {
483
+ let bt: NonNull < r_efi:: efi:: BootServices > = boot_services ( ) . unwrap ( ) . cast ( ) ;
484
+ let st_size = self . st . hdr . header_size as usize ;
485
+ let mut crc32: u32 = 0 ;
486
+
487
+ let r = unsafe {
488
+ ( ( * bt. as_ptr ( ) ) . calculate_crc32 ) (
489
+ self . st . as_mut ( ) as * mut r_efi:: efi:: SystemTable as * mut crate :: ffi:: c_void ,
490
+ st_size,
491
+ & mut crc32,
492
+ )
493
+ } ;
494
+
495
+ if r. is_error ( ) {
496
+ Err ( io:: Error :: from_raw_os_error ( r. as_usize ( ) ) )
497
+ } else {
498
+ self . st . hdr . crc32 = crc32;
499
+ Ok ( ( ) )
500
+ }
501
+ }
479
502
}
480
503
481
504
impl Drop for Command {
You can’t perform that action at this time.
0 commit comments