| /* |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * cmdline.c: Kernel command line creation using ARCS argc/argv. |
| * |
| * Copyright (C) 1996 David S. Miller (davem@davemloft.net) |
| */ |
| #include <linux/bug.h> |
| #include <linux/init.h> |
| #include <linux/kernel.h> |
| #include <linux/string.h> |
| |
| #include <asm/sgialib.h> |
| #include <asm/bootinfo.h> |
| |
| #undef DEBUG_CMDLINE |
| |
| static char *ignored[] = { |
| "ConsoleIn=", |
| "ConsoleOut=", |
| "SystemPartition=", |
| "OSLoader=", |
| "OSLoadPartition=", |
| "OSLoadFilename=", |
| "OSLoadOptions=" |
| }; |
| |
| static char *used_arc[][2] = { |
| { "OSLoadPartition=", "root=" }, |
| { "OSLoadOptions=", "" } |
| }; |
| |
| static char * __init move_firmware_args(char* cp) |
| { |
| char *s; |
| int actr, i; |
| |
| actr = 1; /* Always ignore argv[0] */ |
| |
| while (actr < prom_argc) { |
| for(i = 0; i < ARRAY_SIZE(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 = strchr(prom_argv(actr), '='); |
| if (s) { |
| s++; |
| strcpy(cp, s); |
| cp += strlen(s); |
| } |
| *cp++ = ' '; |
| break; |
| } |
| } |
| actr++; |
| } |
| |
| return cp; |
| } |
| |
| void __init prom_init_cmdline(void) |
| { |
| char *cp; |
| int actr, i; |
| |
| actr = 1; /* Always ignore argv[0] */ |
| |
| cp = arcs_cmdline; |
| /* |
| * 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 < ARRAY_SIZE(ignored); i++) { |
| int len = strlen(ignored[i]); |
| |
| if (!strncmp(prom_argv(actr), ignored[i], len)) |
| goto pic_cont; |
| } |
| /* Ok, we want it. */ |
| strcpy(cp, prom_argv(actr)); |
| cp += strlen(prom_argv(actr)); |
| *cp++ = ' '; |
| |
| pic_cont: |
| actr++; |
| } |
| |
| if (cp != arcs_cmdline) /* get rid of trailing space */ |
| --cp; |
| *cp = '\0'; |
| |
| #ifdef DEBUG_CMDLINE |
| printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline); |
| #endif |
| } |