summaryrefslogtreecommitdiffstats
path: root/sys/boot/ia64/efi
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2002-12-10 06:22:25 +0000
committermarcel <marcel@FreeBSD.org>2002-12-10 06:22:25 +0000
commit2b58aefd52a6386b1c0856e55a718966b9adb8a1 (patch)
tree94b8f0b58d4709b442bd9ffc80891c80059a5483 /sys/boot/ia64/efi
parentf4623ed8677c37348f599d913b06a9f803722b93 (diff)
downloadFreeBSD-src-2b58aefd52a6386b1c0856e55a718966b9adb8a1.zip
FreeBSD-src-2b58aefd52a6386b1c0856e55a718966b9adb8a1.tar.gz
Change the startup code to fix a memory leak and to allow us to
accept load options (=command line options). The call graph changes from *entry*->efi_main->efi_init, where efi_main is the EFI equivalent of main to *entry*->efi_main->main, where main is what you'd expect. efi_main now is what efi_init was. The prototype of main follows that of C. The first argument is argc and the second is argv. There is no third argument. Allocation of heap pages is now handled by the EFI library and it now deallocates the pages when main() returns or when exit() is called. This allows us to safely return to the boot manager (or EFI shell) without leaks. EFI applications are responsible to free all memory themselves. Handling of the load options is a bit tricky. There are either no load options, load options in ASCII or load options in Unicode. The EFI library will translate the ASCII options to Unicode options as to simplify user code. Since the load options are passed as a single string (if present) and main() accepts argc and argv, the startup code also has to split the string into words and build the argv vector. Here the trickiness starts. When the loader is started from the EFI shell, argv[0] will automaticly load the program name. In all other cases (ie through the boot manager), this is not the case. Unfortunately, there's no trivial way to check. Hence, a set of conditions is checked to determine if we need to fill in argv[0] ourselves or not. This checking is not perfect. There are known cases where it fails to do the right thing. The logic works for most expected cases, though. This includes the case where no options are given. Approved by: re (blanket)
Diffstat (limited to 'sys/boot/ia64/efi')
-rw-r--r--sys/boot/ia64/efi/main.c22
1 files changed, 3 insertions, 19 deletions
diff --git a/sys/boot/ia64/efi/main.c b/sys/boot/ia64/efi/main.c
index 5a886ed..51ac572 100644
--- a/sys/boot/ia64/efi/main.c
+++ b/sys/boot/ia64/efi/main.c
@@ -104,27 +104,13 @@ find_pal_proc(void)
}
EFI_STATUS
-efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
+main(int argc, CHAR16 *argv[])
{
- EFI_PHYSICAL_ADDRESS mem;
EFI_LOADED_IMAGE *img;
EFI_SIMPLE_NETWORK *net;
EFI_STATUS status;
- struct ia64_pal_result res;
- char buf[32];
int i;
- efi_init(image_handle, system_table);
-
- /*
- * Initialise the heap as early as possible. Once this is done,
- * alloc() is usable. The stack is buried inside us, so this is
- * safe.
- */
- BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
- 512*1024/4096, &mem);
- setheap((void *)mem, (void *)(mem + 512*1024));
-
/*
* XXX Chicken-and-egg problem; we want to have console output
* early, but some console attributes may depend on reading from
@@ -148,7 +134,7 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
(devsw[i]->dv_init)();
efinet_init_driver();
-
+
printf("\n");
printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
@@ -156,14 +142,13 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
printf("Memory: %ld k\n", memsize() / 1024);
#endif
-
/*
* XXX quick and dirty check to see if we're loaded from the
* network. If so, we set the default device to 'net'. In all
* other cases we set the default device to 'disk'. We presume
* fixed positions in devsw for both net and disk.
*/
- BS->HandleProtocol(image_handle, &imgid, (VOID**)&img);
+ BS->HandleProtocol(IH, &imgid, (VOID**)&img);
status = BS->HandleProtocol(img->DeviceHandle, &netid, (VOID**)&net);
if (status == EFI_SUCCESS && net != NULL) {
@@ -177,7 +162,6 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
/* default to 'a' */
currdev.d_kind.efidisk.partition = 0;
}
-
currdev.d_type = currdev.d_dev->dv_type;
/*
OpenPOWER on IntegriCloud