mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
xen/efi: Handle cases where file didn't come from ESP
A boot loader can load files from outside ESP. In these cases device could be not provided or path could be something not supported. In these cases allows to boot anyway, all information could be provided using UKI or using other boot loader features. Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com> Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
This commit is contained in:
1 parent
3e5f9674c0
commit
196cdc097f
1 file changed
+29
-5
+29
-5
@@ -443,6 +443,18 @@ static EFI_FILE_HANDLE __init get_parent_handle(const EFI_LOADED_IMAGE *loaded_i
|
||||
CHAR16 *pathend, *ptr;
|
||||
EFI_STATUS ret;
|
||||
|
||||
/*
|
||||
* In some cases the image could not come from a specific device.
|
||||
* For instance this can happen if Xen was loaded using GRUB2 "linux"
|
||||
* command.
|
||||
*/
|
||||
*leaf = NULL;
|
||||
if ( !loaded_image->DeviceHandle )
|
||||
{
|
||||
PrintStr(L"Xen image loaded without providing a device\r\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
do {
|
||||
EFI_FILE_IO_INTERFACE *fio;
|
||||
|
||||
@@ -466,7 +478,15 @@ static EFI_FILE_HANDLE __init get_parent_handle(const EFI_LOADED_IMAGE *loaded_i
|
||||
|
||||
if ( DevicePathType(dp) != MEDIA_DEVICE_PATH ||
|
||||
DevicePathSubType(dp) != MEDIA_FILEPATH_DP )
|
||||
blexit(L"Unsupported device path component");
|
||||
{
|
||||
/*
|
||||
* The image could come from an unsupported device.
|
||||
* For instance this can happen if Xen was loaded using GRUB2
|
||||
* "chainloader" command and the file was not from ESP.
|
||||
*/
|
||||
PrintStr(L"Unsupported device path component\r\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ( *buffer )
|
||||
{
|
||||
@@ -772,8 +792,11 @@ static bool __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
|
||||
|
||||
if ( !name )
|
||||
PrintErrMesg(L"No filename", EFI_OUT_OF_RESOURCES);
|
||||
ret = dir_handle->Open(dir_handle, &FileHandle, name,
|
||||
EFI_FILE_MODE_READ, 0);
|
||||
if ( dir_handle )
|
||||
ret = dir_handle->Open(dir_handle, &FileHandle, name,
|
||||
EFI_FILE_MODE_READ, 0);
|
||||
else
|
||||
ret = EFI_NOT_FOUND;
|
||||
if ( file == &cfg && ret == EFI_NOT_FOUND )
|
||||
return false;
|
||||
if ( EFI_ERROR(ret) )
|
||||
@@ -1404,7 +1427,7 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE ImageHandle,
|
||||
/* Read and parse the config file. */
|
||||
if ( read_section(loaded_image, L"config", &cfg, NULL) )
|
||||
PrintStr(L"Using builtin config file\r\n");
|
||||
else if ( !cfg_file_name )
|
||||
else if ( !cfg_file_name && file_name )
|
||||
{
|
||||
CHAR16 *tail;
|
||||
|
||||
@@ -1515,7 +1538,8 @@ void EFIAPI __init noreturn efi_start(EFI_HANDLE ImageHandle,
|
||||
efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size));
|
||||
cfg.addr = 0;
|
||||
|
||||
dir_handle->Close(dir_handle);
|
||||
if ( dir_handle )
|
||||
dir_handle->Close(dir_handle);
|
||||
|
||||
if ( gop && !base_video )
|
||||
{
|
||||
|
||||