| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * This file is subject to the terms and conditions of the GNU General Public | 
|  | 3 | * License.  See the file "COPYING" in the main directory of this archive | 
|  | 4 | * for more details. | 
|  | 5 | * | 
|  | 6 | * cmdline.c: Kernel command line creation using ARCS argc/argv. | 
|  | 7 | * | 
|  | 8 | * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) | 
|  | 9 | */ | 
|  | 10 | #include <linux/init.h> | 
|  | 11 | #include <linux/kernel.h> | 
|  | 12 | #include <linux/string.h> | 
|  | 13 |  | 
|  | 14 | #include <asm/sgialib.h> | 
|  | 15 | #include <asm/bootinfo.h> | 
|  | 16 |  | 
|  | 17 | #undef DEBUG_CMDLINE | 
|  | 18 |  | 
|  | 19 | char * __init prom_getcmdline(void) | 
|  | 20 | { | 
|  | 21 | return arcs_cmdline; | 
|  | 22 | } | 
|  | 23 |  | 
|  | 24 | static char *ignored[] = { | 
|  | 25 | "ConsoleIn=", | 
|  | 26 | "ConsoleOut=", | 
|  | 27 | "SystemPartition=", | 
|  | 28 | "OSLoader=", | 
|  | 29 | "OSLoadPartition=", | 
|  | 30 | "OSLoadFilename=", | 
|  | 31 | "OSLoadOptions=" | 
|  | 32 | }; | 
|  | 33 |  | 
|  | 34 | static char *used_arc[][2] = { | 
|  | 35 | { "OSLoadPartition=", "root=" }, | 
|  | 36 | { "OSLoadOptions=", "" } | 
|  | 37 | }; | 
|  | 38 |  | 
|  | 39 | static char * __init move_firmware_args(char* cp) | 
|  | 40 | { | 
|  | 41 | char *s; | 
|  | 42 | int actr, i; | 
|  | 43 |  | 
|  | 44 | actr = 1; /* Always ignore argv[0] */ | 
|  | 45 |  | 
|  | 46 | while (actr < prom_argc) { | 
|  | 47 | for(i = 0; i < ARRAY_SIZE(used_arc); i++) { | 
|  | 48 | int len = strlen(used_arc[i][0]); | 
|  | 49 |  | 
|  | 50 | if (!strncmp(prom_argv(actr), used_arc[i][0], len)) { | 
|  | 51 | /* Ok, we want it. First append the replacement... */ | 
|  | 52 | strcat(cp, used_arc[i][1]); | 
|  | 53 | cp += strlen(used_arc[i][1]); | 
|  | 54 | /* ... and now the argument */ | 
|  | 55 | s = strstr(prom_argv(actr), "="); | 
|  | 56 | if (s) { | 
|  | 57 | s++; | 
|  | 58 | strcpy(cp, s); | 
|  | 59 | cp += strlen(s); | 
|  | 60 | } | 
|  | 61 | *cp++ = ' '; | 
|  | 62 | break; | 
|  | 63 | } | 
|  | 64 | } | 
|  | 65 | actr++; | 
|  | 66 | } | 
|  | 67 |  | 
|  | 68 | return cp; | 
|  | 69 | } | 
|  | 70 |  | 
|  | 71 | void __init prom_init_cmdline(void) | 
|  | 72 | { | 
|  | 73 | char *cp; | 
|  | 74 | int actr, i; | 
|  | 75 |  | 
|  | 76 | actr = 1; /* Always ignore argv[0] */ | 
|  | 77 |  | 
|  | 78 | cp = arcs_cmdline; | 
|  | 79 | /* | 
|  | 80 | * Move ARC variables to the beginning to make sure they can be | 
|  | 81 | * overridden by later arguments. | 
|  | 82 | */ | 
|  | 83 | cp = move_firmware_args(cp); | 
|  | 84 |  | 
|  | 85 | while (actr < prom_argc) { | 
|  | 86 | for (i = 0; i < ARRAY_SIZE(ignored); i++) { | 
|  | 87 | int len = strlen(ignored[i]); | 
|  | 88 |  | 
|  | 89 | if (!strncmp(prom_argv(actr), ignored[i], len)) | 
|  | 90 | goto pic_cont; | 
|  | 91 | } | 
|  | 92 | /* Ok, we want it. */ | 
|  | 93 | strcpy(cp, prom_argv(actr)); | 
|  | 94 | cp += strlen(prom_argv(actr)); | 
|  | 95 | *cp++ = ' '; | 
|  | 96 |  | 
|  | 97 | pic_cont: | 
|  | 98 | actr++; | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | if (cp != arcs_cmdline)		/* get rid of trailing space */ | 
|  | 102 | --cp; | 
|  | 103 | *cp = '\0'; | 
|  | 104 |  | 
|  | 105 | #ifdef DEBUG_CMDLINE | 
|  | 106 | printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline); | 
|  | 107 | #endif | 
|  | 108 | } |