summaryrefslogtreecommitdiffstats
path: root/sys/boot/ia64
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2010-01-18 06:48:24 +0000
committermarcel <marcel@FreeBSD.org>2010-01-18 06:48:24 +0000
commitcf3f3cdea63c866b330c4caf9f8559ab072f1347 (patch)
tree80179bd5307186a8a21508054ca2b8f13a3dfd17 /sys/boot/ia64
parentfe0462f218ddf6ebb55f92e9e3d4c61e45c030a2 (diff)
downloadFreeBSD-src-cf3f3cdea63c866b330c4caf9f8559ab072f1347.zip
FreeBSD-src-cf3f3cdea63c866b330c4caf9f8559ab072f1347.tar.gz
Add command-line option -dev to set the default value of the currdev
variable. This is to be used by the EFI boot manager. While here, re-factor the code a little bit and bump the version to 2.1.
Diffstat (limited to 'sys/boot/ia64')
-rw-r--r--sys/boot/ia64/efi/main.c71
-rw-r--r--sys/boot/ia64/efi/version1
2 files changed, 58 insertions, 14 deletions
diff --git a/sys/boot/ia64/efi/main.c b/sys/boot/ia64/efi/main.c
index c9bb547..3f0b071 100644
--- a/sys/boot/ia64/efi/main.c
+++ b/sys/boot/ia64/efi/main.c
@@ -50,7 +50,6 @@ extern char bootprog_rev[];
extern char bootprog_date[];
extern char bootprog_maker[];
-struct devdesc currdev; /* our current device */
struct arch_switch archsw; /* MI/MD interface boundary */
extern u_int64_t ia64_pal_entry;
@@ -101,10 +100,49 @@ find_pal_proc(void)
return;
}
+static int
+usc2cmp(CHAR16 *s1, CHAR16 *s2)
+{
+
+ while (*s1 == *s2++) {
+ if (*s1++ == 0)
+ return (0);
+ }
+ return (*s1 - *(s2 - 1));
+}
+
+static char *
+get_dev_option(int argc, CHAR16 *argv[])
+{
+ static char dev[32];
+ CHAR16 *arg;
+ char *devp;
+ int i, j;
+
+ devp = NULL;
+ for (i = 0; i < argc; i++) {
+ if (usc2cmp(argv[i], L"-dev") == 0 && i < argc - 1) {
+ arg = argv[i + 1];
+ j = 0;
+ while (j < sizeof(dev) && *arg != 0)
+ dev[j++] = *arg++;
+ if (j == sizeof(dev))
+ j--;
+ dev[j] = '\0';
+ devp = dev;
+ break;
+ }
+ }
+
+ return (devp);
+}
+
EFI_STATUS
main(int argc, CHAR16 *argv[])
{
+ struct devdesc currdev;
EFI_LOADED_IMAGE *img;
+ char *dev;
int i;
/*
@@ -115,6 +153,10 @@ main(int argc, CHAR16 *argv[])
*/
cons_probe();
+ printf("\n");
+ printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
+ printf("(%s, %s)\n", bootprog_maker, bootprog_date);
+
find_pal_proc();
/*
@@ -124,16 +166,6 @@ main(int argc, CHAR16 *argv[])
if (devsw[i]->dv_init != NULL)
(devsw[i]->dv_init)();
- /* Get our loaded image protocol interface structure. */
- BS->HandleProtocol(IH, &imgid, (VOID**)&img);
-
- printf("\n");
- printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
- printf("(%s, %s)\n", bootprog_maker, bootprog_date);
-
- efi_handle_lookup(img->DeviceHandle, &currdev.d_dev, &currdev.d_unit);
- currdev.d_type = currdev.d_dev->dv_type;
-
/*
* Disable the watchdog timer. By default the boot manager sets
* the timer to 5 minutes before invoking a boot option. If we
@@ -145,13 +177,24 @@ main(int argc, CHAR16 *argv[])
*/
BS->SetWatchdogTimer(0, 0, 0, NULL);
- env_setenv("currdev", EV_VOLATILE, ia64_fmtdev(&currdev),
- ia64_setcurrdev, env_nounset);
+ /* Get our loaded image protocol interface structure. */
+ BS->HandleProtocol(IH, &imgid, (VOID**)&img);
+
+ bzero(&currdev, sizeof(currdev));
+ efi_handle_lookup(img->DeviceHandle, &currdev.d_dev, &currdev.d_unit);
+ currdev.d_type = currdev.d_dev->dv_type;
+
env_setenv("loaddev", EV_VOLATILE, ia64_fmtdev(&currdev), env_noset,
env_nounset);
+ dev = get_dev_option(argc, argv);
+ if (dev == NULL)
+ dev = ia64_fmtdev(&currdev);
+
+ env_setenv("currdev", EV_VOLATILE, dev, ia64_setcurrdev, env_nounset);
+
setenv("LINES", "24", 1); /* optional */
-
+
archsw.arch_autoload = ia64_autoload;
archsw.arch_getdev = ia64_getdev;
archsw.arch_copyin = ia64_copyin;
diff --git a/sys/boot/ia64/efi/version b/sys/boot/ia64/efi/version
index 37a71c3..148ed4c 100644
--- a/sys/boot/ia64/efi/version
+++ b/sys/boot/ia64/efi/version
@@ -3,6 +3,7 @@ $FreeBSD$
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important. Make sure the current version number is on line 6.
+2.1: Add support for "-dev <part>" argument parsing.
2.0: Provide devices based on the block I/O protocol, rather than the
simple file services protocol. Use the FreeBSD file system code
on top of those devices to access files.
OpenPOWER on IntegriCloud