Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Apr 2014 13:03:00 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264605 - head/sys/mips/beri
Message-ID:  <201404171303.s3HD30Ls044716@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Thu Apr 17 13:02:59 2014
New Revision: 264605
URL: http://svnweb.freebsd.org/changeset/base/264605

Log:
  Based on xlp_machdep.c and completed the list of options based on
  boot/mips/beri/loader/metadata.c allow FDT configuration to set
  command line options.
  This leads to an interesting quesiton of future interactions with loader.
  However for configurations without loader this allows bootverbose or boot
  single user to be set by compiling a new kernel, which is good enough for
  testing and debugging.
  
  Reviewed by:	rwatson
  MFC after:	1 week

Modified:
  head/sys/mips/beri/beri_machdep.c

Modified: head/sys/mips/beri/beri_machdep.c
==============================================================================
--- head/sys/mips/beri/beri_machdep.c	Thu Apr 17 12:53:56 2014	(r264604)
+++ head/sys/mips/beri/beri_machdep.c	Thu Apr 17 13:02:59 2014	(r264605)
@@ -131,6 +131,46 @@ platform_reset(void)
 		__asm__ __volatile("wait");
 }
 
+#ifdef FDT
+/* Parse cmd line args as env - copied from xlp_machdep. */
+/* XXX-BZ this should really be centrally provided for all (boot) code. */
+static void
+_parse_bootargs(char *cmdline)
+{
+	char *n, *v;
+
+	while ((v = strsep(&cmdline, " \n")) != NULL) {
+		if (*v == '\0')
+			continue;
+		if (*v == '-') {
+			while (*v != '\0') {
+				v++;
+				switch (*v) {
+				case 'a': boothowto |= RB_ASKNAME; break;
+				/* Someone should simulate that ;-) */
+				case 'C': boothowto |= RB_CDROM; break;
+				case 'd': boothowto |= RB_KDB; break;
+				case 'D': boothowto |= RB_MULTIPLE; break;
+				case 'm': boothowto |= RB_MUTE; break;
+				case 'g': boothowto |= RB_GDB; break;
+				case 'h': boothowto |= RB_SERIAL; break;
+				case 'p': boothowto |= RB_PAUSE; break;
+				case 'r': boothowto |= RB_DFLTROOT; break;
+				case 's': boothowto |= RB_SINGLE; break;
+				case 'v': boothowto |= RB_VERBOSE; break;
+				}
+			}
+		} else {
+			n = strsep(&v, "=");
+			if (v == NULL)
+				setenv(n, "1");
+			else
+				setenv(n, v);
+		}
+	}
+}
+#endif
+
 void
 platform_start(__register_t a0, __register_t a1,  __register_t a2, 
     __register_t a3)
@@ -142,7 +182,9 @@ platform_start(__register_t a0, __regist
 	char **envp = (char **)a2;
 	unsigned int memsize = a3;
 #ifdef FDT
+	char buf[2048];		/* early stack supposedly big enough */
 	vm_offset_t dtbp;
+	phandle_t chosen;
 	void *kmdp;
 #endif
 	int i;
@@ -180,6 +222,13 @@ platform_start(__register_t a0, __regist
 		while (1);
 	if (OF_init((void *)dtbp) != 0)
 		while (1);
+
+	/*
+	 * Get bootargs from FDT if specified.
+	 */
+	chosen = OF_finddevice("/chosen");
+	if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
+		_parse_bootargs(buf);
 #endif
 
 	/*



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