This patch introduces support for command line arguments to Plan 9.
Plan 9 generally dedicates a small region of kernel memory (known
as CONFADDR) for runtime configuration.  A new environment variable
named confaddr was introduced to indicate this location when copying
arguments.

Signed-off-by: Steven Stallion <sstall...@gmail.com>
---
Changes for v2:
   - Corrected checkpatch misses
   - Refactored common code to copy command line arguments
   - Added documentation for odd Plan 9 behavior
Changes for v3:
   - Corrected patch Subject

 common/cmd_bootm.c |   36 +++++++++++++++++++++++++++++-------
 doc/README.plan9   |   18 ++++++++++++++++++
 2 files changed, 47 insertions(+), 7 deletions(-)
 create mode 100644 doc/README.plan9

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 05130b6..960a68f 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -1346,6 +1346,19 @@ static void fixup_silent_linux(void)
 }
 #endif /* CONFIG_SILENT_CONSOLE */
 
+#if defined(CONFIG_BOOTM_NETBSD) || defined(CONFIG_BOOTM_PLAN9)
+static void copy_args(char *dest, int argc, char * const argv[], char delim)
+{
+       int i;
+
+       for (i = 0; i < argc; i++) {
+               if (i > 0)
+                       *dest++ = delim;
+               strcpy(dest, argv[i]);
+               dest += strlen(argv[i]);
+       }
+}
+#endif
 
 /*******************************************************************/
 /* OS booting routines */
@@ -1408,13 +1421,7 @@ static int do_bootm_netbsd(int flag, int argc, char * 
const argv[],
                for (i = 2, len = 0; i < argc; i += 1)
                        len += strlen(argv[i]) + 1;
                cmdline = malloc(len);
-
-               for (i = 2, len = 0; i < argc; i += 1) {
-                       if (i > 2)
-                               cmdline[len++] = ' ';
-                       strcpy(&cmdline[len], argv[i]);
-                       len += strlen(argv[i]);
-               }
+               copy_args(cmdline, argc-2, argv+2, ' ');
        } else if ((cmdline = getenv("bootargs")) == NULL) {
                cmdline = "";
        }
@@ -1533,6 +1540,7 @@ static int do_bootm_plan9(int flag, int argc, char * 
const argv[],
                           bootm_headers_t *images)
 {
        void (*entry_point)(void);
+       char *s;
 
        if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
                return 1;
@@ -1544,6 +1552,20 @@ static int do_bootm_plan9(int flag, int argc, char * 
const argv[],
        }
 #endif
 
+       /* See README.plan9 */
+       s = getenv("confaddr");
+       if (s != NULL) {
+               char *confaddr = (char *)simple_strtoul(s, NULL, 16);
+
+               if (argc > 2) {
+                       copy_args(confaddr, argc-2, argv+2, '\n');
+               } else {
+                       s = getenv("bootargs");
+                       if (s != NULL)
+                               strcpy(confaddr, s);
+               }
+       }
+
        entry_point = (void (*)(void))images->ep;
 
        printf("## Transferring control to Plan 9 (at address %08lx) ...\n",
diff --git a/doc/README.plan9 b/doc/README.plan9
new file mode 100644
index 0000000..2d3d0e0
--- /dev/null
+++ b/doc/README.plan9
@@ -0,0 +1,18 @@
+Plan 9 from Bell Labs kernel images require additional setup to pass
+configuration information to the kernel.  An environment variable named
+confaddr must be defined with the same value as CONFADDR (see mem.h).
+Use of this facility is optional, but should be preferable to manual
+configuration.
+
+When booting an image, arguments supplied to the bootm command will be
+copied to CONFADDR.  If no arguments are specified, the contents of the
+bootargs environment variable will be copied.
+
+If no command line arguments or bootargs are defined, CONFADDR is left
+uninitialized to permit manual configuration.  For example, PC-style
+configuration could be simulated by issuing a fatload in bootcmd:
+
+  # setenv bootcmd fatload mmc 0 $confaddr plan9.ini; ...; bootm
+
+Steven Stallion
+June 2013
-- 
1.7.0.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to