Linux MIPS Architecture development
 help / color / mirror / Atom feed
* [patch] cmdline.c rewrite
@ 2003-02-04  6:13 Andrew Clausen
  2003-02-04  9:24 ` Guido Guenther
  0 siblings, 1 reply; 11+ messages in thread
From: Andrew Clausen @ 2003-02-04  6:13 UTC (permalink / raw)
  To: Linux-MIPS

Hi all,

This patch is mainly a cleanup.  There is only one change (improvement!)
in the semantics:

Some kernel parameters are auto-generated.   eg: root= (always has been
broken).  Anyway, the old version of cmdline.c added these auto-generated
parameters unconditionally.  Now, it old adds them if there's no
collision with old parameters.  Is that Right?

Cheers,
Andrew


Index: cmdline.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/arc/cmdline.c,v
retrieving revision 1.5.2.3
diff -u -r1.5.2.3 cmdline.c
--- cmdline.c	5 Aug 2002 23:53:30 -0000	1.5.2.3
+++ cmdline.c	24 Jan 2003 06:43:57 -0000
@@ -6,6 +6,8 @@
  * cmdline.c: Kernel command line creation using ARCS argc/argv.
  *
  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
+ * Copyright (C) 2003 Silicon Graphics, Inc.
+ *	modifications by Andrew Clausen (clausen@gnu.org)
  */
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -16,96 +18,76 @@
 
 #undef DEBUG_CMDLINE
 
-char arcs_cmdline[CL_SIZE];
+char arcs_cmdline[CL_SIZE]; /* initialized to empty */
+static int __initdata arg_count = 0;
 
 char * __init prom_getcmdline(void)
 {
-	return &(arcs_cmdline[0]);
+	return arcs_cmdline;
 }
 
-static char *ignored[] = {
+static void __init append_translated_arg(const char* match, const char* trans)
+{
+	int len = strlen(match);
+	int i;
+
+	/* don't repeat arguments, like "root=X root=Y", unless the
+	 * replacement string "trans" is empty, in which case the user is
+	 * getting exactly what they asked for.
+	 */
+	if (strlen(trans) > 0 && strstr(arcs_cmdline, trans))
+		return;
+
+	for (i = 1; i < prom_argc; i++) {
+		if (!strncmp(prom_argv(i), match, len)) {
+			if (arg_count++)
+				strcat(arcs_cmdline, " ");
+			strcat(arcs_cmdline, trans);
+			strcat(arcs_cmdline, prom_argv(i) + len);
+			return;
+		}
+	}
+}
+
+static char __initdata *ignored_args[] = {
 	"ConsoleIn=",
 	"ConsoleOut=",
 	"SystemPartition=",
 	"OSLoader=",
 	"OSLoadPartition=",
 	"OSLoadFilename=",
-	"OSLoadOptions="
-};
-#define NENTS(foo) ((sizeof((foo)) / (sizeof((foo[0])))))
-
-static char *used_arc[][2] = {
-	{ "OSLoadPartition=", "root=" },
-	{ "OSLoadOptions=", "" }
+	"OSLoadOptions=",
+	NULL
 };
 
-static char * __init move_firmware_args(char* cp)
+static int __init is_arg_useful(const char* arg)
 {
-	char *s;
-	int actr, i;
-
-	actr = 1; /* Always ignore argv[0] */
-
-	while (actr < prom_argc) {
-		for(i = 0; i < NENTS(used_arc); i++) {
-			int len = strlen(used_arc[i][0]);
-
-			if (!strncmp(prom_argv(actr), used_arc[i][0], len)) {
-			/* Ok, we want it. First append the replacement... */
-				strcat(cp, used_arc[i][1]);
-				cp += strlen(used_arc[i][1]);
-				/* ... and now the argument */
-				s = strstr(prom_argv(actr), "=");
-				if (s) {
-					s++;
-					strcpy(cp, s);
-					cp += strlen(s);
-				}
-				*cp++ = ' ';
-				break;
-			}
-		}
-		actr++;
+	int i;
+	for (i = 0; ignored_args[i] != NULL; i++) {
+		if (!strncmp(arg, ignored_args[i], strlen(ignored_args[i]) - 1))
+			return 0;
 	}
-
-	return cp;
+	return 1;
 }
 
-
-void __init prom_init_cmdline(void)
+static void __init append_untranslated_args(void)
 {
-	char *cp;
-	int actr, i;
-
-	actr = 1; /* Always ignore argv[0] */
-
-	cp = &(arcs_cmdline[0]);
-	/*
-	 * Move ARC variables to the beginning to make sure they can be
-	 * overridden by later arguments.
-	 */
-	cp = move_firmware_args(cp);
-
-	while (actr < prom_argc) {
-		for (i = 0; i < NENTS(ignored); i++) {
-			int len = strlen(ignored[i]);
-
-			if (!strncmp(prom_argv(actr), ignored[i], len))
-				goto pic_cont;
+	int i;
+	for (i = 1; i < prom_argc; i++) {
+		if (is_arg_useful(prom_argv(i))) {
+			if (arg_count++)
+				strcat(arcs_cmdline, " ");
+			strcat(arcs_cmdline, prom_argv(i));
 		}
-		/* Ok, we want it. */
-		strcpy(cp, prom_argv(actr));
-		cp += strlen(prom_argv(actr));
-		*cp++ = ' ';
-
-	pic_cont:
-		actr++;
 	}
-	if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
-		--cp;
-	*cp = '\0';
+}
 
+void __init prom_init_cmdline(void)
+{
+	append_translated_arg("OSLoadOptions=", "");
+	append_translated_arg("OSLoadPartition=", "root=");
+	append_untranslated_args();
 #ifdef DEBUG_CMDLINE
-	prom_printf("prom_init_cmdline: %s\n", &(arcs_cmdline[0]));
+	prom_printf("prom_init_cmdline: \"%s\"\n", arcs_cmdline);
 #endif
 }

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2003-02-07  0:25 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-04  6:13 [patch] cmdline.c rewrite Andrew Clausen
2003-02-04  9:24 ` Guido Guenther
2003-02-04 22:39   ` Andrew Clausen
2003-02-04 23:12     ` Guido Guenther
2003-02-04 23:19       ` Andrew Clausen
2003-02-04 23:45         ` Guido Guenther
2003-02-04 23:55           ` Andrew Clausen
2003-02-05  0:07             ` Guido Guenther
2003-02-05  0:19               ` Andrew Clausen
2003-02-06 16:53                 ` Ralf Baechle
2003-02-07  0:24                   ` Andrew Clausen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox