Rollup merge of #122164 - beetrees:uefi-argv-align, r=workingjubilee

Fix misaligned loads when loading UEFI arg pointers

Currently, the two UEFI argument pointers are stored in an `alloca` of alignment 1, a pointer to which is then passed as `argv`. However, [the library code](9c3ad802d9/library/std/src/sys/pal/uefi/mod.rs (L60-L61)) treats `argv` as a pointer to an array of pointers and dereferences it as such, meaning that it presumes the `alloca` is aligned to at least the alignment of a pointer. This PR fixes this mismatch by aligning the `alloca` to the alignment of a pointer.

This PR also changed the `gep` to use the new `inbounds_ptradd` method.
This commit is contained in:
Matthias Krüger 2024-03-08 21:02:01 +01:00 committed by GitHub
commit 2b6ae95d3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 4 deletions

View File

@ -510,11 +510,13 @@ fn get_argc_argv<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
// Params for UEFI // Params for UEFI
let param_handle = bx.get_param(0); let param_handle = bx.get_param(0);
let param_system_table = bx.get_param(1); let param_system_table = bx.get_param(1);
let ptr_size = bx.tcx().data_layout.pointer_size;
let ptr_align = bx.tcx().data_layout.pointer_align.abi;
let arg_argc = bx.const_int(cx.type_isize(), 2); let arg_argc = bx.const_int(cx.type_isize(), 2);
let arg_argv = bx.alloca(cx.type_array(cx.type_ptr(), 2), Align::ONE); let arg_argv = bx.alloca(cx.type_array(cx.type_ptr(), 2), ptr_align);
bx.store(param_handle, arg_argv, Align::ONE); bx.store(param_handle, arg_argv, ptr_align);
let arg_argv_el1 = bx.gep(cx.type_ptr(), arg_argv, &[bx.const_int(cx.type_int(), 1)]); let arg_argv_el1 = bx.inbounds_ptradd(arg_argv, bx.const_usize(ptr_size.bytes()));
bx.store(param_system_table, arg_argv_el1, Align::ONE); bx.store(param_system_table, arg_argv_el1, ptr_align);
(arg_argc, arg_argv) (arg_argc, arg_argv)
} else if cx.sess().target.main_needs_argc_argv { } else if cx.sess().target.main_needs_argc_argv {
// Params from native `main()` used as args for rust start function // Params from native `main()` used as args for rust start function