Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/fw/arc/cmdline.c
26481 views
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 ([email protected])
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
}
111
112