Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jan 2010 06:48:24 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r202552 - head/sys/boot/ia64/efi
Message-ID:  <201001180648.o0I6mODW080285@svn.freebsd.org>

index | next in thread | raw e-mail

Author: marcel
Date: Mon Jan 18 06:48:24 2010
New Revision: 202552
URL: http://svn.freebsd.org/changeset/base/202552

Log:
  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.

Modified:
  head/sys/boot/ia64/efi/main.c
  head/sys/boot/ia64/efi/version

Modified: head/sys/boot/ia64/efi/main.c
==============================================================================
--- head/sys/boot/ia64/efi/main.c	Mon Jan 18 05:24:51 2010	(r202551)
+++ head/sys/boot/ia64/efi/main.c	Mon Jan 18 06:48:24 2010	(r202552)
@@ -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;

Modified: head/sys/boot/ia64/efi/version
==============================================================================
--- head/sys/boot/ia64/efi/version	Mon Jan 18 05:24:51 2010	(r202551)
+++ head/sys/boot/ia64/efi/version	Mon Jan 18 06:48:24 2010	(r202552)
@@ -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.


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001180648.o0I6mODW080285>