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