svn commit: r322930 - in head/sys/boot/efi: boot1 include libefi loader

Warner Losh imp at FreeBSD.org
Sat Aug 26 18:29:25 UTC 2017


Author: imp
Date: Sat Aug 26 18:29:24 2017
New Revision: 322930
URL: https://svnweb.freebsd.org/changeset/base/322930

Log:
  Move efi_main into efi/loader
  
  Move the efi_main routine out of libefi into sys/boot/efi/loader.
  Since boot1 has its own efi_main routine, this effectively prevents
  boot1 from linking with libefi. By moving it out, we can share code
  better (though though some refactoring with boot1's efi_main and
  loader.efi's efi_main is definitely in order).
  
  Sponsored by: Netflix

Added:
  head/sys/boot/efi/loader/efi_main.c
     - copied, changed from r322924, head/sys/boot/efi/libefi/libefi.c
Modified:
  head/sys/boot/efi/boot1/boot1.c
  head/sys/boot/efi/include/efidevp.h
  head/sys/boot/efi/libefi/libefi.c
  head/sys/boot/efi/loader/Makefile

Modified: head/sys/boot/efi/boot1/boot1.c
==============================================================================
--- head/sys/boot/efi/boot1/boot1.c	Sat Aug 26 18:12:25 2017	(r322929)
+++ head/sys/boot/efi/boot1/boot1.c	Sat Aug 26 18:29:24 2017	(r322930)
@@ -88,7 +88,7 @@ Free(void *buf, const char *file __unused, int line __
 static BOOLEAN
 nodes_match(EFI_DEVICE_PATH *imgpath, EFI_DEVICE_PATH *devpath)
 {
-	int len;
+	size_t len;
 
 	if (imgpath == NULL || imgpath->Type != devpath->Type ||
 	    imgpath->SubType != devpath->SubType)

Modified: head/sys/boot/efi/include/efidevp.h
==============================================================================
--- head/sys/boot/efi/include/efidevp.h	Sat Aug 26 18:12:25 2017	(r322929)
+++ head/sys/boot/efi/include/efidevp.h	Sat Aug 26 18:29:24 2017	(r322930)
@@ -52,7 +52,7 @@ typedef struct _EFI_DEVICE_PATH {
 
 #define DevicePathType(a)           ( ((a)->Type) & EFI_DP_TYPE_MASK )
 #define DevicePathSubType(a)        ( (a)->SubType )
-#define DevicePathNodeLength(a)     ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
+#define DevicePathNodeLength(a)     ((size_t)(((a)->Length[0]) | ((a)->Length[1] << 8)))
 #define NextDevicePathNode(a)       ( (EFI_DEVICE_PATH *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
 #define IsDevicePathType(a, t)      ( DevicePathType(a) == t )
 #define IsDevicePathEndType(a)      IsDevicePathType(a, END_DEVICE_PATH_TYPE)

Modified: head/sys/boot/efi/libefi/libefi.c
==============================================================================
--- head/sys/boot/efi/libefi/libefi.c	Sat Aug 26 18:12:25 2017	(r322929)
+++ head/sys/boot/efi/libefi/libefi.c	Sat Aug 26 18:29:24 2017	(r322930)
@@ -32,32 +32,8 @@ __FBSDID("$FreeBSD$");
 #include <efilib.h>
 #include <stand.h>
 
-EFI_HANDLE		IH;
-EFI_SYSTEM_TABLE	*ST;
-EFI_BOOT_SERVICES	*BS;
-EFI_RUNTIME_SERVICES	*RS;
+extern EFI_SYSTEM_TABLE *ST;
 
-static EFI_PHYSICAL_ADDRESS heap;
-static UINTN heapsize;
-
-static CHAR16 *
-arg_skipsep(CHAR16 *argp)
-{
-
-	while (*argp == ' ' || *argp == '\t' || *argp == '\n')
-		argp++;
-	return (argp);
-}
-
-static CHAR16 *
-arg_skipword(CHAR16 *argp)
-{
-
-	while (*argp && *argp != ' ' && *argp != '\t' && *argp != '\n')
-		argp++;
-	return (argp);
-}
-
 void *
 efi_get_table(EFI_GUID *tbl)
 {
@@ -70,129 +46,4 @@ efi_get_table(EFI_GUID *tbl)
 			return (ST->ConfigurationTable[i].VendorTable);
 	}
 	return (NULL);
-}
-
-void exit(EFI_STATUS exit_code)
-{
-
-	BS->FreePages(heap, EFI_SIZE_TO_PAGES(heapsize));
-	BS->Exit(IH, exit_code, 0, NULL);
-}
-
-void
-efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
-{
-	static EFI_GUID image_protocol = LOADED_IMAGE_PROTOCOL;
-	static EFI_GUID console_control_protocol =
-	    EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
-	EFI_CONSOLE_CONTROL_PROTOCOL *console_control = NULL;
-	EFI_LOADED_IMAGE *img;
-	CHAR16 *argp, *args, **argv;
-	EFI_STATUS status;
-	int argc, addprog;
-
-	IH = image_handle;
-	ST = system_table;
-	BS = ST->BootServices;
-	RS = ST->RuntimeServices;
-
-	status = BS->LocateProtocol(&console_control_protocol, NULL,
-	    (VOID **)&console_control);
-	if (status == EFI_SUCCESS)
-		(void)console_control->SetMode(console_control,
-		    EfiConsoleControlScreenText);
-
-	heapsize = 64 * 1024 * 1024;
-	status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
-	    EFI_SIZE_TO_PAGES(heapsize), &heap);
-	if (status != EFI_SUCCESS)
-		BS->Exit(IH, status, 0, NULL);
-
-	setheap((void *)(uintptr_t)heap, (void *)(uintptr_t)(heap + heapsize));
-
-	/* Use exit() from here on... */
-
-	status = BS->HandleProtocol(IH, &image_protocol, (VOID**)&img);
-	if (status != EFI_SUCCESS)
-		exit(status);
-
-	/*
-	 * Pre-process the (optional) load options. If the option string
-	 * is given as an ASCII string, we use a poor man's ASCII to
-	 * Unicode-16 translation. The size of the option string as given
-	 * to us includes the terminating null character. We assume the
-	 * string is an ASCII string if strlen() plus the terminating
-	 * '\0' is less than LoadOptionsSize. Even if all Unicode-16
-	 * characters have the upper 8 bits non-zero, the terminating
-	 * null character will cause a one-off.
-	 * If the string is already in Unicode-16, we make a copy so that
-	 * we know we can always modify the string.
-	 */
-	if (img->LoadOptionsSize > 0 && img->LoadOptions != NULL) {
-		if (img->LoadOptionsSize == strlen(img->LoadOptions) + 1) {
-			args = malloc(img->LoadOptionsSize << 1);
-			for (argc = 0; argc < img->LoadOptionsSize; argc++)
-				args[argc] = ((char*)img->LoadOptions)[argc];
-		} else {
-			args = malloc(img->LoadOptionsSize);
-			memcpy(args, img->LoadOptions, img->LoadOptionsSize);
-		}
-	} else
-		args = NULL;
-
-	/*
-	 * Use a quick and dirty algorithm to build the argv vector. We
-	 * first count the number of words. Then, after allocating the
-	 * vector, we split the string up. We don't deal with quotes or
-	 * other more advanced shell features.
-	 * The EFI shell will pass the name of the image as the first
-	 * word in the argument list. This does not happen if we're
-	 * loaded by the boot manager. This is not so easy to figure
-	 * out though. The ParentHandle is not always NULL, because
-	 * there can be a function (=image) that will perform the task
-	 * for the boot manager.
-	 */
-	/* Part 1: Figure out if we need to add our program name. */
-	addprog = (args == NULL || img->ParentHandle == NULL ||
-	    img->FilePath == NULL) ? 1 : 0;
-	if (!addprog) {
-		addprog =
-		    (DevicePathType(img->FilePath) != MEDIA_DEVICE_PATH ||
-		     DevicePathSubType(img->FilePath) != MEDIA_FILEPATH_DP ||
-		     DevicePathNodeLength(img->FilePath) <=
-			sizeof(FILEPATH_DEVICE_PATH)) ? 1 : 0;
-		if (!addprog) {
-			/* XXX todo. */
-		}
-	}
-	/* Part 2: count words. */
-	argc = (addprog) ? 1 : 0;
-	argp = args;
-	while (argp != NULL && *argp != 0) {
-		argp = arg_skipsep(argp);
-		if (*argp == 0)
-			break;
-		argc++;
-		argp = arg_skipword(argp);
-	}
-	/* Part 3: build vector. */
-	argv = malloc((argc + 1) * sizeof(CHAR16*));
-	argc = 0;
-	if (addprog)
-		argv[argc++] = (CHAR16 *)L"loader.efi";
-	argp = args;
-	while (argp != NULL && *argp != 0) {
-		argp = arg_skipsep(argp);
-		if (*argp == 0)
-			break;
-		argv[argc++] = argp;
-		argp = arg_skipword(argp);
-		/* Terminate the words. */
-		if (*argp != 0)
-			*argp++ = 0;
-	}
-	argv[argc] = NULL;
-
-	status = main(argc, argv);
-	exit(status);
 }

Modified: head/sys/boot/efi/loader/Makefile
==============================================================================
--- head/sys/boot/efi/loader/Makefile	Sat Aug 26 18:12:25 2017	(r322929)
+++ head/sys/boot/efi/loader/Makefile	Sat Aug 26 18:29:24 2017	(r322930)
@@ -16,6 +16,7 @@ SRCS=	autoload.c \
 	bootinfo.c \
 	conf.c \
 	copy.c \
+	efi_main.c \
 	main.c \
 	self_reloc.c \
 	smbios.c \

Copied and modified: head/sys/boot/efi/loader/efi_main.c (from r322924, head/sys/boot/efi/libefi/libefi.c)
==============================================================================
--- head/sys/boot/efi/libefi/libefi.c	Sat Aug 26 15:08:27 2017	(r322924, copy source)
+++ head/sys/boot/efi/loader/efi_main.c	Sat Aug 26 18:29:24 2017	(r322930)
@@ -40,6 +40,14 @@ EFI_RUNTIME_SERVICES	*RS;
 static EFI_PHYSICAL_ADDRESS heap;
 static UINTN heapsize;
 
+void
+exit(EFI_STATUS exit_code)
+{
+
+	BS->FreePages(heap, EFI_SIZE_TO_PAGES(heapsize));
+	BS->Exit(IH, exit_code, 0, NULL);
+}
+
 static CHAR16 *
 arg_skipsep(CHAR16 *argp)
 {
@@ -58,27 +66,8 @@ arg_skipword(CHAR16 *argp)
 	return (argp);
 }
 
-void *
-efi_get_table(EFI_GUID *tbl)
-{
-	EFI_GUID *id;
-	int i;
+void efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table);
 
-	for (i = 0; i < ST->NumberOfTableEntries; i++) {
-		id = &ST->ConfigurationTable[i].VendorGuid;
-		if (!memcmp(id, tbl, sizeof(EFI_GUID)))
-			return (ST->ConfigurationTable[i].VendorTable);
-	}
-	return (NULL);
-}
-
-void exit(EFI_STATUS exit_code)
-{
-
-	BS->FreePages(heap, EFI_SIZE_TO_PAGES(heapsize));
-	BS->Exit(IH, exit_code, 0, NULL);
-}
-
 void
 efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
 {
@@ -131,7 +120,7 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *sy
 	if (img->LoadOptionsSize > 0 && img->LoadOptions != NULL) {
 		if (img->LoadOptionsSize == strlen(img->LoadOptions) + 1) {
 			args = malloc(img->LoadOptionsSize << 1);
-			for (argc = 0; argc < img->LoadOptionsSize; argc++)
+			for (argc = 0; argc < (int)img->LoadOptionsSize; argc++)
 				args[argc] = ((char*)img->LoadOptions)[argc];
 		} else {
 			args = malloc(img->LoadOptionsSize);


More information about the svn-src-all mailing list