Merge branch 'x86-boot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 boot updates from Ingo Molnar: "Early command line options parsing enhancements from Dave Hansen, plus minor cleanups and enhancements" * 'x86-boot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/boot: Remove unused 'is_big_kernel' variable x86/boot: Use proper array element type in memset() size calculation x86/boot: Pass in size to early cmdline parsing x86/boot: Simplify early command line parsing x86/boot: Fix early command-line parsing when partial word matches x86/boot: Fix early command-line parsing when matching at end x86/boot: Simplify kernel load address alignment check x86/boot: Micro-optimize reset_early_page_tables()
This commit is contained in:
@@ -21,12 +21,16 @@ static inline int myisspace(u8 c)
|
||||
* @option: option string to look for
|
||||
*
|
||||
* Returns the position of that @option (starts counting with 1)
|
||||
* or 0 on not found.
|
||||
* or 0 on not found. @option will only be found if it is found
|
||||
* as an entire word in @cmdline. For instance, if @option="car"
|
||||
* then a cmdline which contains "cart" will not match.
|
||||
*/
|
||||
int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
static int
|
||||
__cmdline_find_option_bool(const char *cmdline, int max_cmdline_size,
|
||||
const char *option)
|
||||
{
|
||||
char c;
|
||||
int len, pos = 0, wstart = 0;
|
||||
int pos = 0, wstart = 0;
|
||||
const char *opptr = NULL;
|
||||
enum {
|
||||
st_wordstart = 0, /* Start of word/after whitespace */
|
||||
@@ -37,11 +41,11 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
if (!cmdline)
|
||||
return -1; /* No command line */
|
||||
|
||||
len = min_t(int, strlen(cmdline), COMMAND_LINE_SIZE);
|
||||
if (!len)
|
||||
return 0;
|
||||
|
||||
while (len--) {
|
||||
/*
|
||||
* This 'pos' check ensures we do not overrun
|
||||
* a non-NULL-terminated 'cmdline'
|
||||
*/
|
||||
while (pos < max_cmdline_size) {
|
||||
c = *(char *)cmdline++;
|
||||
pos++;
|
||||
|
||||
@@ -58,18 +62,35 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
/* fall through */
|
||||
|
||||
case st_wordcmp:
|
||||
if (!*opptr)
|
||||
if (!*opptr) {
|
||||
/*
|
||||
* We matched all the way to the end of the
|
||||
* option we were looking for. If the
|
||||
* command-line has a space _or_ ends, then
|
||||
* we matched!
|
||||
*/
|
||||
if (!c || myisspace(c))
|
||||
return wstart;
|
||||
else
|
||||
state = st_wordskip;
|
||||
else if (!c)
|
||||
/*
|
||||
* We hit the end of the option, but _not_
|
||||
* the end of a word on the cmdline. Not
|
||||
* a match.
|
||||
*/
|
||||
} else if (!c) {
|
||||
/*
|
||||
* Hit the NULL terminator on the end of
|
||||
* cmdline.
|
||||
*/
|
||||
return 0;
|
||||
else if (c != *opptr++)
|
||||
state = st_wordskip;
|
||||
else if (!len) /* last word and is matching */
|
||||
return wstart;
|
||||
break;
|
||||
} else if (c == *opptr++) {
|
||||
/*
|
||||
* We are currently matching, so continue
|
||||
* to the next character on the cmdline.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
state = st_wordskip;
|
||||
/* fall through */
|
||||
|
||||
case st_wordskip:
|
||||
if (!c)
|
||||
@@ -82,3 +103,8 @@ int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
|
||||
return 0; /* Buffer overrun */
|
||||
}
|
||||
|
||||
int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
{
|
||||
return __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
|
||||
}
|
||||
|
Verwijs in nieuw issue
Block a user