@@ -693,6 +693,8 @@ pub extern "efiapi" fn load_image(
693
693
path,
694
694
parent_image_handle,
695
695
wrapped_fs_ref as * const _ as Handle ,
696
+ null_mut ( ) ,
697
+ 0 ,
696
698
load_addr,
697
699
load_size,
698
700
entry_addr,
@@ -1033,10 +1035,13 @@ struct LoadedImageWrapper {
1033
1035
1034
1036
type DevicePaths = [ file:: FileDevicePathProtocol ; 2 ] ;
1035
1037
1038
+ #[ allow( clippy:: too_many_arguments) ]
1036
1039
fn new_image_handle (
1037
1040
path : & str ,
1038
1041
parent_handle : Handle ,
1039
1042
device_handle : Handle ,
1043
+ load_options : * mut core:: ffi:: c_void ,
1044
+ load_options_size : u32 ,
1040
1045
load_addr : u64 ,
1041
1046
load_size : u64 ,
1042
1047
entry_addr : u64 ,
@@ -1088,8 +1093,8 @@ fn new_image_handle(
1088
1093
system_table : unsafe { & mut ST } ,
1089
1094
device_handle,
1090
1095
file_path : & mut file_paths[ 0 ] . device_path , // Pointer to first path entry
1091
- load_options_size : 0 ,
1092
- load_options : null_mut ( ) ,
1096
+ load_options_size,
1097
+ load_options,
1093
1098
image_base : load_addr as * mut _ ,
1094
1099
image_size : load_size,
1095
1100
image_code_type : efi:: LOADER_CODE ,
@@ -1102,6 +1107,39 @@ fn new_image_handle(
1102
1107
image
1103
1108
}
1104
1109
1110
+ #[ cfg( target_arch = "aarch64" ) ]
1111
+ fn prepare_cmdline ( info : & dyn bootinfo:: Info ) -> ( * mut c_void , u32 ) {
1112
+ let cmdline = info. cmdline ( ) ;
1113
+ let mut cmdline_size = cmdline. len ( ) ;
1114
+ let mut cmd_addr = null_mut ( ) ;
1115
+ // Allocate memory for cmdline
1116
+ // cmdline will be converted to [u16], so size must be double
1117
+ let status = allocate_pool (
1118
+ efi:: LOADER_DATA ,
1119
+ cmdline_size * 2 ,
1120
+ & mut cmd_addr as * mut * mut c_void ,
1121
+ ) ;
1122
+
1123
+ assert ! ( status == Status :: SUCCESS ) ;
1124
+
1125
+ let cmd_addr = cmd_addr as * mut u16 ;
1126
+ // Linux asks for cmdline to be in format of utf-16.
1127
+ for ( i, p) in cmdline. iter ( ) . enumerate ( ) . take ( cmdline_size) {
1128
+ unsafe {
1129
+ let tmp_addr = cmd_addr. add ( i) ;
1130
+ * tmp_addr = * p as u16 ;
1131
+ }
1132
+ }
1133
+ cmdline_size *= 2 ;
1134
+
1135
+ ( cmd_addr as * mut c_void , cmdline_size as u32 )
1136
+ }
1137
+
1138
+ #[ cfg( not( target_arch = "aarch64" ) ) ]
1139
+ fn prepare_cmdline ( _info : & dyn bootinfo:: Info ) -> ( * mut c_void , u32 ) {
1140
+ ( null_mut ( ) , 0 )
1141
+ }
1142
+
1105
1143
pub fn efi_exec (
1106
1144
address : u64 ,
1107
1145
loaded_address : u64 ,
@@ -1190,10 +1228,14 @@ pub fn efi_exec(
1190
1228
core:: ptr:: null :: < u8 > ( ) as Handle
1191
1229
} ;
1192
1230
1231
+ let ( cmd_addr, cmdline_size) = prepare_cmdline ( info) ;
1232
+
1193
1233
let image = new_image_handle (
1194
1234
crate :: efi:: EFI_BOOT_PATH ,
1195
1235
0 as Handle ,
1196
1236
wrapped_fs,
1237
+ cmd_addr,
1238
+ cmdline_size,
1197
1239
loaded_address,
1198
1240
loaded_size,
1199
1241
address,
0 commit comments