]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
common: allow a default compiled-in command line using Kconfig
authorZhongze Liu <blackskygg@gmail.com>
Tue, 21 Mar 2017 14:14:21 +0000 (15:14 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 21 Mar 2017 14:20:30 +0000 (15:20 +0100)
This allows downstreams to set their defaults without modifying the source code
all over the place. Also probably useful for the embedded space.
(See Also: https://xenproject.atlassian.net/browse/XEN-41)

If CMDLINE is set, it will be parsed prior to the bootloader command line.
This order of parsing implies that if any non-cumulative options are set in
both CMDLINE and the bootloader command line, only the ones in the latter will
take effect. Furthermore, if CMDLINE_OVERRIDE is set to y, the whole
bootloader command line will be ignored, which will be useful to work around
broken bootloaders. A wrapper to the original common/kernel.c:cmdline_parse()
was introduced to complete this task.

Signed-off-by: Zhongze Liu <blackskygg@gmail.com>
[jb: fix non-EXPERT build]
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
xen/common/Kconfig
xen/common/kernel.c

index f2ecbc43d6157b2bd6908706a52e320d1b61c21f..5334be38a9cf538e2966e04a34181cdcd5d8b870 100644 (file)
@@ -237,4 +237,25 @@ config FAST_SYMBOL_LOOKUP
          The only user of this is Live patching.
 
          If unsure, say Y.
+
+config CMDLINE
+       string "Built-in hypervisor command string" if EXPERT = "y"
+       default ""
+       ---help---
+         Enter arguments here that should be compiled into the hypervisor
+         image and used at boot time. When the system boots, this string
+         will be parsed prior to the bootloader command line. So if a
+         non-cumulative option is set both in this string and in the
+         bootloader command line, only the latter one will take effect.
+
+config CMDLINE_OVERRIDE
+       bool "Built-in command line overrides bootloader arguments"
+       default n
+       depends on CMDLINE != ""
+       ---help---
+         Set this option to 'Y' to have the hypervisor ignore the bootloader
+         command line, and use ONLY the built-in command line.
+
+         This is used to work around broken bootloaders. This should
+         be set to 'N' under normal conditions.
 endmenu
index a4ae6122c35bd31376a15b67105c3f3b85f77dba..84618715dc333372e80e4a3c4174a85835b6a21d 100644 (file)
@@ -23,6 +23,7 @@
 enum system_state system_state = SYS_STATE_early_boot;
 
 xen_commandline_t saved_cmdline;
+static const char __initconst opt_builtin_cmdline[] = CONFIG_CMDLINE;
 
 static void __init assign_integer_param(
     const struct kernel_param *param, uint64_t val)
@@ -46,18 +47,13 @@ static void __init assign_integer_param(
     }
 }
 
-void __init cmdline_parse(const char *cmdline)
+static void __init _cmdline_parse(const char *cmdline)
 {
     char opt[100], *optval, *optkey, *q;
     const char *p = cmdline;
     const struct kernel_param *param;
     int bool_assert;
 
-    if ( cmdline == NULL )
-        return;
-
-    safe_strcpy(saved_cmdline, cmdline);
-
     for ( ; ; )
     {
         /* Skip whitespace. */
@@ -147,6 +143,28 @@ void __init cmdline_parse(const char *cmdline)
     }
 }
 
+/**
+ *    cmdline_parse -- parses the xen command line.
+ * If CONFIG_CMDLINE is set, it would be parsed prior to @cmdline.
+ * But if CONFIG_CMDLINE_OVERRIDE is set to y, @cmdline will be ignored.
+ */
+void __init cmdline_parse(const char *cmdline)
+{
+    if ( opt_builtin_cmdline[0] )
+    {
+        printk("Built-in command line: %s\n", opt_builtin_cmdline);
+        _cmdline_parse(opt_builtin_cmdline);
+    }
+
+#ifndef CONFIG_CMDLINE_OVERRIDE
+    if ( cmdline == NULL )
+        return;
+
+    safe_strcpy(saved_cmdline, cmdline);
+    _cmdline_parse(cmdline);
+#endif
+}
+
 int __init parse_bool(const char *s)
 {
     if ( !strcmp("no", s) ||