[PATCH 6/7] WIP: efi: Allow helloworld to exit boot services

Simon Glass sjg at chromium.org
Tue Nov 21 12:35:52 CET 2023


This allows testing of the exit_boot_services call, providing more
coverage of the EFI bootmeth.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 lib/efi_loader/helloworld.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/lib/efi_loader/helloworld.c b/lib/efi_loader/helloworld.c
index 1135d3a3c37e..1fb5fb5a62f2 100644
--- a/lib/efi_loader/helloworld.c
+++ b/lib/efi_loader/helloworld.c
@@ -206,6 +206,26 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
 			(con_out, u"Cannot open loaded image protocol\r\n");
 		goto out;
 	}
+
+	{
+		ulong ptr = (ulong)loaded_image;
+		u16 str[80];
+		int i;
+
+		for (i = 0; i < 8; i++) {
+			uint digit = (ptr >> ((7 - i) * 4)) & 0xf;
+
+			if (digit > 9)
+				digit = 'a' + digit - 10;
+			else
+				digit += '0';
+			str[i] = digit;
+		}
+		str[i] = 0;
+		con_out->output_string(con_out, str);
+		con_out->output_string(con_out, u"\n");
+	}
+
 	print_load_options(loaded_image);
 
 	/* Get the device path to text protocol */
@@ -243,7 +263,21 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
 		goto out;
 
 out:
-	boottime->exit(handle, ret, 0, NULL);
+	/*
+	 * TODO: Use vendor string to decide whether to call exit-boot-services
+	 */
+	efi_uintn_t map_size = 0;
+	efi_uintn_t map_key;
+	efi_uintn_t desc_size;
+	u32 desc_version;
+
+	ret = boottime->get_memory_map(&map_size, NULL, &map_key, &desc_size,
+				       &desc_version);
+	con_out->output_string(con_out, u"Exiting boot sevices\n");
+
+	boottime->exit_boot_services(handle, map_key);
+
+	ret = boottime->exit(handle, ret, 0, NULL);
 
 	/* We should never arrive here */
 	return ret;
-- 
2.43.0.rc1.413.gea7ed67945-goog



More information about the U-Boot mailing list