efi_loader: Handle GD_FLG_SKIP_RELOC

If the EFI runtime services pointers are relocated even though
relocation is skipped, it corrupts some other data resulting in some
unexpected behaviour.

In this specific case, it overwrote some page table entries resulting in
the device memory address range's mappings getting removed. Eventually,
after the completion of efi_runtime_relocate(), when a driver tries to
access its device's registers it crashes since the mappings are absent.

Signed-off-by: Varadarajan Narayanan <quic_varada@quicinc.com>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
Varadarajan Narayanan 2025-03-26 11:16:53 +05:30 committed by Heinrich Schuchardt
parent 85403c46e6
commit 742aa8b039

View file

@ -169,7 +169,8 @@ static int initr_reloc_global_data(void)
*/
efi_save_gd();
efi_runtime_relocate(gd->relocaddr, NULL);
if (!(gd->flags & GD_FLG_SKIP_RELOC))
efi_runtime_relocate(gd->relocaddr, NULL);
#endif
/*