diff options
Diffstat (limited to 'arch/mips/fw/arc/cmdline.c')
-rw-r--r-- | arch/mips/fw/arc/cmdline.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/arch/mips/fw/arc/cmdline.c b/arch/mips/fw/arc/cmdline.c new file mode 100644 index 000000000..155c5e911 --- /dev/null +++ b/arch/mips/fw/arc/cmdline.c | |||
@@ -0,0 +1,110 @@ | |||
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 (davem@davemloft.net) | ||
9 | */ | ||
10 | #include <linux/bug.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/string.h> | ||
14 | |||
15 | #include <asm/sgialib.h> | ||
16 | #include <asm/bootinfo.h> | ||
17 | |||
18 | #undef DEBUG_CMDLINE | ||
19 | |||
20 | /* | ||
21 | * A 32-bit ARC PROM pass arguments and environment as 32-bit pointer. | ||
22 | * These macro take care of sign extension. | ||
23 | */ | ||
24 | #define prom_argv(index) ((char *) (long)argv[(index)]) | ||
25 | |||
26 | static char *ignored[] = { | ||
27 | "ConsoleIn=", | ||
28 | "ConsoleOut=", | ||
29 | "SystemPartition=", | ||
30 | "OSLoader=", | ||
31 | "OSLoadPartition=", | ||
32 | "OSLoadFilename=", | ||
33 | "OSLoadOptions=" | ||
34 | }; | ||
35 | |||
36 | static char *used_arc[][2] = { | ||
37 | { "OSLoadPartition=", "root=" }, | ||
38 | { "OSLoadOptions=", "" } | ||
39 | }; | ||
40 | |||
41 | static char __init *move_firmware_args(int argc, LONG *argv, char *cp) | ||
42 | { | ||
43 | char *s; | ||
44 | int actr, i; | ||
45 | |||
46 | actr = 1; /* Always ignore argv[0] */ | ||
47 | |||
48 | while (actr < argc) { | ||
49 | for(i = 0; i < ARRAY_SIZE(used_arc); i++) { | ||
50 | int len = strlen(used_arc[i][0]); | ||
51 | |||
52 | if (!strncmp(prom_argv(actr), used_arc[i][0], len)) { | ||
53 | /* Ok, we want it. First append the replacement... */ | ||
54 | strcat(cp, used_arc[i][1]); | ||
55 | cp += strlen(used_arc[i][1]); | ||
56 | /* ... and now the argument */ | ||
57 | s = strchr(prom_argv(actr), '='); | ||
58 | if (s) { | ||
59 | s++; | ||
60 | strcpy(cp, s); | ||
61 | cp += strlen(s); | ||
62 | } | ||
63 | *cp++ = ' '; | ||
64 | break; | ||
65 | } | ||
66 | } | ||
67 | actr++; | ||
68 | } | ||
69 | |||
70 | return cp; | ||
71 | } | ||
72 | |||
73 | void __init prom_init_cmdline(int argc, LONG *argv) | ||
74 | { | ||
75 | char *cp; | ||
76 | int actr, i; | ||
77 | |||
78 | actr = 1; /* Always ignore argv[0] */ | ||
79 | |||
80 | cp = arcs_cmdline; | ||
81 | /* | ||
82 | * Move ARC variables to the beginning to make sure they can be | ||
83 | * overridden by later arguments. | ||
84 | */ | ||
85 | cp = move_firmware_args(argc, argv, cp); | ||
86 | |||
87 | while (actr < argc) { | ||
88 | for (i = 0; i < ARRAY_SIZE(ignored); i++) { | ||
89 | int len = strlen(ignored[i]); | ||
90 | |||
91 | if (!strncmp(prom_argv(actr), ignored[i], len)) | ||
92 | goto pic_cont; | ||
93 | } | ||
94 | /* Ok, we want it. */ | ||
95 | strcpy(cp, prom_argv(actr)); | ||
96 | cp += strlen(prom_argv(actr)); | ||
97 | *cp++ = ' '; | ||
98 | |||
99 | pic_cont: | ||
100 | actr++; | ||
101 | } | ||
102 | |||
103 | if (cp != arcs_cmdline) /* get rid of trailing space */ | ||
104 | --cp; | ||
105 | *cp = '\0'; | ||
106 | |||
107 | #ifdef DEBUG_CMDLINE | ||
108 | printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline); | ||
109 | #endif | ||
110 | } | ||