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