svn commit: r227924 - in head/sys: conf mips/atheros

Adrian Chadd adrian at FreeBSD.org
Thu Nov 24 07:32:53 UTC 2011


Author: adrian
Date: Thu Nov 24 07:32:52 2011
New Revision: 227924
URL: http://svn.freebsd.org/changeset/base/227924

Log:
  Introduce a new (global, sorry!) option which controls whether
  the ar71xx platform code should assume a uboot or redboot environment.
  
  The current code gets very confused (and just crashes) on a uboot
  environment, where each attribute=value pair is in a single entry.
  Redboot on the other hand stores it as "attribute", "value", "attribute",
  "value", ...
  
  This allows the kernel to boot on a TP-LINK TL-WR1043ND from flash,
  where the uboot environment gets setup. This didn't show up during a netboot
  as "tftpboot" and "go" don't setup the uboot environment variables.

Modified:
  head/sys/conf/options
  head/sys/mips/atheros/ar71xx_machdep.c

Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options	Thu Nov 24 07:25:43 2011	(r227923)
+++ head/sys/conf/options	Thu Nov 24 07:32:52 2011	(r227924)
@@ -899,4 +899,5 @@ RCTL		opt_global.h
 # that "lies" about the amount of RAM it has. Until a cleaner method is
 # defined, this option will suffice in overriding what Redboot says.
 AR71XX_REALMEM    opt_global.h
-
+AR71XX_ENV_UBOOT	opt_global.h
+AR71XX_ENV_REDBOOT	opt_global.h

Modified: head/sys/mips/atheros/ar71xx_machdep.c
==============================================================================
--- head/sys/mips/atheros/ar71xx_machdep.c	Thu Nov 24 07:25:43 2011	(r227923)
+++ head/sys/mips/atheros/ar71xx_machdep.c	Thu Nov 24 07:32:52 2011	(r227924)
@@ -168,8 +168,8 @@ platform_start(__register_t a0 __unused,
     __register_t a2 __unused, __register_t a3 __unused)
 {
 	uint64_t platform_counter_freq;
-	int argc, i;
-	char **argv, **envp;
+	int argc = 0, i;
+	char **argv = NULL, **envp = NULL;
 	vm_offset_t kernend;
 
 	/* 
@@ -184,9 +184,18 @@ platform_start(__register_t a0 __unused,
 	/* Initialize pcpu stuff */
 	mips_pcpu0_init();
 
+	/*
+	 * Until some more sensible abstractions for uboot/redboot
+	 * environment handling, we have to make this a compile-time
+	 * hack.  The existing code handles the uboot environment
+	 * very incorrectly so we should just ignore initialising
+	 * the relevant pointers.
+	 */
+#ifndef	AR71XX_ENV_UBOOT
 	argc = a0;
 	argv = (char**)a1;
 	envp = (char**)a2;
+#endif
 	/* 
 	 * Protect ourselves from garbage in registers 
 	 */
@@ -255,6 +264,9 @@ platform_start(__register_t a0 __unused,
 	printf("  a2 = %08x\n", a2);
 	printf("  a3 = %08x\n", a3);
 
+	/*
+	 * XXX this code is very redboot specific.
+	 */
 	printf("Cmd line:");
 	if (MIPS_IS_VALID_PTR(argv)) {
 		for (i = 0; i < argc; i++) {


More information about the svn-src-head mailing list