[ipxe-devel] [PATCH 2/3 v2] Call efi_boot_local() from efi_block_boot()

Aaron Young Aaron.Young at oracle.com
Wed Feb 6 00:47:03 UTC 2019


Implement call to efi_boot_local() from efi_block_boot()
when there is no san_device defined for the given drive #.

This is will allow the sanboot command to attempt to boot
a local UEFI disk in the event that a drive was specified
for which there is no corrensponding san_device "hooked".

Signed-off-by: Aaron Young <Aaron.Young at oracle.com>
---
 src/include/usr/efiboot.h     |  1 +
 src/interface/efi/efi_block.c |  8 +++++++-
 src/interface/efi/efi_boot.c  | 14 ++++++++++++++
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/include/usr/efiboot.h b/src/include/usr/efiboot.h
index 816a0bb..bd3065f 100644
--- a/src/include/usr/efiboot.h
+++ b/src/include/usr/efiboot.h
@@ -10,5 +10,6 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 extern void efi_boot_display_map ( void );
+extern int efi_boot_local ( unsigned int drive, const char *filename );
 
 #endif /* _USR_EFIBOOT_H */
diff --git a/src/interface/efi/efi_block.c b/src/interface/efi/efi_block.c
index 91f830a..3c0409a 100644
--- a/src/interface/efi/efi_block.c
+++ b/src/interface/efi/efi_block.c
@@ -56,6 +56,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <ipxe/efi/efi_snp.h>
 #include <ipxe/efi/efi_utils.h>
 #include <ipxe/efi/efi_block.h>
+#include <usr/efiboot.h>
 
 /** ACPI table protocol protocol */
 static EFI_ACPI_TABLE_PROTOCOL *acpi;
@@ -634,7 +635,12 @@ static int efi_block_boot ( unsigned int drive, const char *filename ) {
 	sandev = sandev_find ( drive );
 	if ( ! sandev ) {
 		DBG ( "EFIBLK cannot find drive %#02x\n", drive );
-		rc = -ENODEV;
+		DBG ( "EFIBLK attempting local boot for drive %#02x, "
+		      "filename=%s\n", drive, filename );
+		rc = efi_boot_local( drive, filename );
+		if (rc)
+			rc = -ENODEV;
+
 		goto err_sandev_find;
 	}
 
diff --git a/src/interface/efi/efi_boot.c b/src/interface/efi/efi_boot.c
index 9976084..5d44f8b 100644
--- a/src/interface/efi/efi_boot.c
+++ b/src/interface/efi/efi_boot.c
@@ -30,6 +30,20 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  */
 
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
 void efi_boot_display_map ( void ) {
 	return;
 }
+
+int efi_boot_local ( unsigned int drive, const char *filename ) {
+
+	// Dummy code to get around compiler for now.
+	if (filename)
+		return drive;
+
+	return 0;
+}
-- 
1.8.3.1




More information about the ipxe-devel mailing list