svn commit: r269373 - in projects/arm64/sys: arm64/arm64 boot/arm64/efi

Andrew Turner andrew at FreeBSD.org
Fri Aug 1 09:54:12 UTC 2014


Author: andrew
Date: Fri Aug  1 09:54:11 2014
New Revision: 269373
URL: http://svnweb.freebsd.org/changeset/base/269373

Log:
  Allow us to set verbose boot, along with the other flags loaders boot
  command takes.

Modified:
  projects/arm64/sys/arm64/arm64/machdep.c
  projects/arm64/sys/boot/arm64/efi/bootinfo.c

Modified: projects/arm64/sys/arm64/arm64/machdep.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/machdep.c	Fri Aug  1 08:39:47 2014	(r269372)
+++ projects/arm64/sys/arm64/arm64/machdep.c	Fri Aug  1 09:54:11 2014	(r269373)
@@ -529,6 +529,7 @@ initarm(struct arm64_bootparams *abp)
 	if (kmdp == NULL)
 		kmdp = preload_search_by_type("elf64 kernel");
 
+	boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
 #ifdef FDT
 	try_load_dtb(kmdp);
 #endif

Modified: projects/arm64/sys/boot/arm64/efi/bootinfo.c
==============================================================================
--- projects/arm64/sys/boot/arm64/efi/bootinfo.c	Fri Aug  1 08:39:47 2014	(r269372)
+++ projects/arm64/sys/boot/arm64/efi/bootinfo.c	Fri Aug  1 09:54:11 2014	(r269373)
@@ -29,7 +29,9 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/reboot.h>
 #include <sys/linker.h>
+#include <sys/boot.h>
 
 #include <machine/metadata.h>
 
@@ -100,6 +102,81 @@ UINTN arm64_efi_mapkey;
 	COPY32(0, a, c);				\
 }
 
+static int
+bi_getboothowto(char *kargs)
+{
+	char	*cp;
+	char	*p;
+	int	howto;
+	int	active;
+	int	i;
+
+	/* Parse kargs */
+	howto = 0;
+	if (kargs != NULL) {
+		cp = kargs;
+		active = 0;
+		while (*cp != 0) {
+			if (!active && (*cp == '-'))
+				active = 1;
+			else if (active)
+				switch (*cp) {
+				case 'a':
+					howto |= RB_ASKNAME;
+					break;
+				case 'C':
+					howto |= RB_CDROM;
+					break;
+				case 'd':
+					howto |= RB_KDB;
+					break;
+				case 'D':
+					howto |= RB_MULTIPLE;
+					break;
+				case 'm':
+					howto |= RB_MUTE;
+					break;
+				case 'g':
+					howto |= RB_GDB;
+					break;
+				case 'h':
+					howto |= RB_SERIAL;
+					break;
+				case 'p':
+					howto |= RB_PAUSE;
+					break;
+				case 'r':
+					howto |= RB_DFLTROOT;
+					break;
+				case 's':
+					howto |= RB_SINGLE;
+					break;
+				case 'v':
+					howto |= RB_VERBOSE;
+					break;
+				default:
+					active = 0;
+					break;
+				}
+				cp++;
+		}
+	}
+
+	/* get equivalents from the environment */
+	for (i = 0; howto_names[i].ev != NULL; i++) {
+		if (getenv(howto_names[i].ev) != NULL)
+			howto |= howto_names[i].mask;
+	}
+	if ((p = getenv("console"))) {
+		if (!strcmp(p, "comconsole"))
+			howto |= RB_SERIAL;
+		if (!strcmp(p, "nullconsole"))
+			howto |= RB_MUTE;
+	}
+
+	return(howto);
+}
+
 static vm_offset_t
 bi_copymodules(vm_offset_t addr)
 {
@@ -203,6 +280,9 @@ bi_load(char *args, vm_offset_t *modulep
 	uint64_t kernend;
 	vm_offset_t addr, size;
 	vm_offset_t dtbp;
+	int howto;
+
+	howto = bi_getboothowto(args);
 
 	/* find the last module in the chain */
 	addr = 0;
@@ -220,6 +300,8 @@ bi_load(char *args, vm_offset_t *modulep
 		panic("can't find kernel file");
 	kernend = 0;	/* fill it in later */
 
+	file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto);
+
 	dtbfp = file_findfile(NULL, "dtb");
 	if (dtbfp != NULL) {
 		printf("dtbfp = %llx %lld\n", dtbfp->f_addr, dtbfp->f_addr - kfp->f_addr);


More information about the svn-src-projects mailing list