Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | } |