[ipxe-devel] [PATCH 1/1,WIP] [efi] allow setting of uefi filename
Vishvananda Ishaya Abrams
vish.ishaya at oracle.com
Fri Dec 2 22:12:46 UTC 2016
From: Vishvananda Ishaya <vish.ishaya at oracle.com>
This patch adds a new setting to allow a uefi filename to be specified. The
parameter is uefi-filename and can be set in a script like so:
set uefi-filename \EFI\vendor\file.efi
If specified, this filename will be used during the sanboot process in place of
the default efi filename.
---
src/interface/efi/efi_block.c | 41 +++++++++++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/src/interface/efi/efi_block.c b/src/interface/efi/efi_block.c
index ab23094..6240c9b 100644
--- a/src/interface/efi/efi_block.c
+++ b/src/interface/efi/efi_block.c
@@ -31,6 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
*/
#include <stddef.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
@@ -46,6 +47,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/process.h>
#include <ipxe/sanboot.h>
#include <ipxe/iso9660.h>
+#include <ipxe/settings.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/BlockIo.h>
#include <ipxe/efi/Protocol/SimpleFileSystem.h>
@@ -61,6 +63,14 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** Boot filename */
static wchar_t efi_block_boot_filename[] = EFI_REMOVABLE_MEDIA_FILE_NAME;
+/** uefi filename setting */
+const struct setting uefi_filename_setting __setting ( SETTING_SANBOOT_EXTRA,
+ uefi-filename ) = {
+ .name = "uefi-filename",
+ .description = "UEFI filename to boot",
+ .type = &setting_type_string,
+};
+
/** iPXE EFI block device vendor device path GUID */
#define IPXE_BLOCK_DEVICE_PATH_GUID \
{ 0x8998b594, 0xf531, 0x4e87, \
@@ -923,6 +933,9 @@ static int efi_block_boot_image ( struct efi_block *block,
size_t boot_path_len;
EFI_STATUS efirc;
int rc;
+ char *uefi_filename = NULL;
+ int uefi_filename_len = 0;
+ int i;
/* Identify device path */
if ( ( efirc = bs->OpenProtocol ( handle,
@@ -948,10 +961,23 @@ static int efi_block_boot_image ( struct efi_block *block,
block->drive, efi_devpath_text ( path.path ) );
/* Construct device path for boot image */
+ /* get setting */
+ fetch_string_setting_copy ( NULL, &uefi_filename_setting,
+ &uefi_filename );
+ if ( uefi_filename != NULL ) {
+ uefi_filename_len = strlen ( uefi_filename );
+ }
end = efi_devpath_end ( path.path );
prefix_len = ( ( ( void * ) end ) - ( ( void * ) path.path ) );
- filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
- sizeof ( efi_block_boot_filename ) );
+ if ( uefi_filename_len != 0 ) {
+ filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
+ (uefi_filename_len + 1) * sizeof ( wchar_t ) );
+ printf ( "Booting from %s\n", uefi_filename );
+ } else {
+ filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
+ sizeof ( efi_block_boot_filename ) );
+ printf ( "Booting from %ls\n", efi_block_boot_filename );
+ }
boot_path_len = ( prefix_len + filepath_len + sizeof ( *end ) );
boot_path = zalloc ( boot_path_len );
if ( ! boot_path ) {
@@ -964,8 +990,14 @@ static int efi_block_boot_image ( struct efi_block *block,
filepath->Header.SubType = MEDIA_FILEPATH_DP;
filepath->Header.Length[0] = ( filepath_len & 0xff );
filepath->Header.Length[1] = ( filepath_len >> 8 );
- memcpy ( filepath->PathName, efi_block_boot_filename,
- sizeof ( efi_block_boot_filename ) );
+ if ( uefi_filename_len != 0 ) {
+ for (i = 0; i <= uefi_filename_len; i++) {
+ filepath->PathName[i] = uefi_filename[i];
+ }
+ } else {
+ memcpy ( filepath->PathName, efi_block_boot_filename,
+ sizeof ( efi_block_boot_filename ) );
+ }
end = ( ( ( void * ) filepath ) + filepath_len );
end->Type = END_DEVICE_PATH_TYPE;
end->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
@@ -988,6 +1020,7 @@ static int efi_block_boot_image ( struct efi_block *block,
err_load_image:
free ( boot_path );
err_alloc_path:
+ free ( uefi_filename );
err_not_child:
err_open_device_path:
return rc;
--
2.5.0
More information about the ipxe-devel
mailing list