svn commit: r265089 - head/sys/mips/beri

Bjoern A. Zeeb bz at FreeBSD.org
Tue Apr 29 07:48:08 UTC 2014


Author: bz
Date: Tue Apr 29 07:48:07 2014
New Revision: 265089
URL: http://svnweb.freebsd.org/changeset/base/265089

Log:
  After r264897 restore the ability to add bootoptions from FDT for
  platforms which do not use loaders or kernels that want to hardcode
  options or for FDT passed in by loader.
  
  Also fix a build issue by putting the kmdp variable accessed back under
  the #ifdef FDT;  we may wish to revisit decision in which case more
  code needs changing.
  
  Submitted by:	brooks

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

Modified: head/sys/mips/beri/beri_machdep.c
==============================================================================
--- head/sys/mips/beri/beri_machdep.c	Tue Apr 29 07:45:21 2014	(r265088)
+++ head/sys/mips/beri/beri_machdep.c	Tue Apr 29 07:48:07 2014	(r265089)
@@ -132,6 +132,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)
@@ -144,7 +184,9 @@ platform_start(__register_t a0, __regist
 	char **envp = (char **)a2;
 	long memsize;
 #ifdef FDT
+	char buf[2048];		/* early stack supposedly big enough */
 	vm_offset_t dtbp;
+	phandle_t chosen;
 	void *kmdp;
 #endif
 	int i;
@@ -201,7 +243,6 @@ platform_start(__register_t a0, __regist
 		while (1);
 	if (OF_init((void *)dtbp) != 0)
 		while (1);
-#endif
 
 	/*
 	 * Configure more boot-time parameters passed in by loader.
@@ -210,6 +251,14 @@ platform_start(__register_t a0, __regist
 	kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
 
 	/*
+	 * Get bootargs from FDT if specified.
+	 */
+	chosen = OF_finddevice("/chosen");
+	if (OF_getprop(chosen, "bootargs", buf, sizeof(buf)) != -1)
+		_parse_bootargs(buf);
+#endif
+
+	/*
 	 * XXXRW: We have no way to compare wallclock time to cycle rate on
 	 * BERI, so for now assume we run at the MALTA default (100MHz).
 	 */


More information about the svn-src-all mailing list