@@ -932,26 +932,8 @@ u64 efi_mem_attributes(unsigned long phys_addr)
static int __init parse_efi_cmdline(char *str)
{
- if (*str == '=')
- str++;
-
- while (*str) {
- if (!strncmp(str, "old_map", 7)) {
- set_bit(EFI_OLD_MEMMAP, &efi.flags);
- str += strlen("old_map");
- }
-
- /*
- * Skip any options we don't understand. Presumably
- * they apply to the EFI boot stub.
- */
- while (*str && *str != ',')
- str++;
-
- /* If we hit a delimiter, skip it */
- if (*str == ',')
- str++;
- }
+ if (parse_option_str(str, "old_map"))
+ set_bit(EFI_OLD_MEMMAP, &efi.flags);
return 0;
}
@@ -407,6 +407,7 @@ int vsscanf(const char *, const char *, va_list);
extern int get_option(char **str, int *pint);
extern char *get_options(const char *str, int nints, int *ints);
extern unsigned long long memparse(const char *ptr, char **retptr);
+extern bool parse_option_str(const char *str, const char *option);
extern int core_kernel_text(unsigned long addr);
extern int core_kernel_data(unsigned long addr);
@@ -155,3 +155,32 @@ unsigned long long memparse(const char *ptr, char **retptr)
return ret;
}
EXPORT_SYMBOL(memparse);
+
+/**
+ * parse_option_str - Parse a string and check an option is set or not
+ * @str: String to be parsed
+ * @option: the option name
+ *
+ * This function parses a string containing a comma-separated
+ * list of strings like a=b,c.
+ *
+ * Return true if there's such option in the string, or return false.
+ */
++bool parse_option_str(const char *str, const char *option)
+{
+ while (*str) {
+ if (!strncmp(str, option, strlen(option))) {
+ str += strlen(option);
+ if (!*str || *str == ',')
+ return true;
+ }
+
+ while (*str && *str != ',')
+ str++;
+
+ if (*str == ',')
+ str++;
+ }
+
+ return false;
+}