diff options
author | devzero@web.de <devzero@web.de> | 2008-01-30 07:33:02 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:33:02 -0500 |
commit | 32d0b9898029b7b3c7f161d31f57c4831d9049eb (patch) | |
tree | 3423478d043a18042590d494876ae7d0223bcea5 /arch | |
parent | 811a0fff5d6e80e18e06be88e0fb685f3924bf8f (diff) |
x86 setup: early cmdline parser handle boolean options
This patch extends the early commandline parser to support boolean options.
The current version in mainline only supports parsing "option=arg" value pairs.
With this it should be easy making other messages like "Uncompressing kernel"
honour the "quiet" parameter, too.
Signed-off-by: Roland Kletzing <devzero@web.de>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/boot/cmdline.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/arch/x86/boot/cmdline.c b/arch/x86/boot/cmdline.c index 34bb778c4357..cc65a33bf65c 100644 --- a/arch/x86/boot/cmdline.c +++ b/arch/x86/boot/cmdline.c | |||
@@ -95,3 +95,68 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize) | |||
95 | 95 | ||
96 | return len; | 96 | return len; |
97 | } | 97 | } |
98 | |||
99 | /* | ||
100 | * Find a boolean option (like quiet,noapic,nosmp....) | ||
101 | * | ||
102 | * Returns the position of that option (starts counting with 1) | ||
103 | * or 0 on not found | ||
104 | */ | ||
105 | int cmdline_find_option_bool(const char *option) | ||
106 | { | ||
107 | u32 cmdline_ptr = boot_params.hdr.cmd_line_ptr; | ||
108 | addr_t cptr; | ||
109 | char c; | ||
110 | int pos =0 , wstart = 0; | ||
111 | const char *opptr = NULL; | ||
112 | enum { | ||
113 | st_wordstart, /* Start of word/after whitespace */ | ||
114 | st_wordcmp, /* Comparing this word */ | ||
115 | st_wordskip, /* Miscompare, skip */ | ||
116 | } state = st_wordstart; | ||
117 | |||
118 | if (!cmdline_ptr || cmdline_ptr >= 0x100000) | ||
119 | return -1; /* No command line, or inaccessible */ | ||
120 | |||
121 | cptr = cmdline_ptr & 0xf; | ||
122 | set_fs(cmdline_ptr >> 4); | ||
123 | |||
124 | while (cptr < 0x10000) { | ||
125 | c = rdfs8(cptr++); | ||
126 | pos++; | ||
127 | |||
128 | switch (state) { | ||
129 | case st_wordstart: | ||
130 | if (!c) | ||
131 | return 0; | ||
132 | else if (myisspace(c)) | ||
133 | break; | ||
134 | |||
135 | state = st_wordcmp; | ||
136 | opptr = option; | ||
137 | wstart = pos; | ||
138 | /* fall through */ | ||
139 | |||
140 | case st_wordcmp: | ||
141 | if (!*opptr) | ||
142 | if (!c || myisspace(c)) | ||
143 | return wstart; | ||
144 | else | ||
145 | state = st_wordskip; | ||
146 | else if (!c) | ||
147 | return 0; | ||
148 | else if (c != *opptr++) | ||
149 | state = st_wordskip; | ||
150 | break; | ||
151 | |||
152 | case st_wordskip: | ||
153 | if (!c) | ||
154 | return 0; | ||
155 | else if (myisspace(c)) | ||
156 | state = st_wordstart; | ||
157 | break; | ||
158 | } | ||
159 | } | ||
160 | |||
161 | return 0; /* Buffer overrun */ | ||
162 | } | ||