]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xen: introduce xen_console_io option
authorStefano Stabellini <sstabellini@kernel.org>
Tue, 13 Jan 2026 23:24:20 +0000 (15:24 -0800)
committerJuergen Gross <jgross@suse.com>
Wed, 14 Jan 2026 13:43:57 +0000 (14:43 +0100)
Xen can support console_io hypercalls for any domains, not just dom0,
depending on DEBUG and XSM policies. These hypercalls can be very useful
for development and debugging.

Introduce a kernel command line option xen_console_io to enable the
usage of console_io hypercalls for any domain upon request. When
xen_console_io is not specified, the current behavior is retained.

Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Message-ID: <alpine.DEB.2.22.394.2601131522540.992863@ubuntu-linux-20-04-desktop>

Documentation/admin-guide/kernel-parameters.txt
drivers/tty/hvc/hvc_xen.c

index a8d0afde7f85a506b827ae31d48fc5d9dbabc095..68ab6fa72b685416a271f99b68fd56dc47dd3bd9 100644 (file)
@@ -8414,6 +8414,11 @@ Kernel parameters
                        save/restore/migration must be enabled to handle larger
                        domains.
 
+       xen_console_io  [XEN,EARLY]
+                       Boolean option to enable/disable the usage of the Xen
+                       console_io hypercalls to read and write to the console.
+                       Mostly useful for debugging and development.
+
        xen_emul_unplug=                [HW,X86,XEN,EARLY]
                        Unplug Xen emulated devices
                        Format: [unplug0,][unplug1]
index 388a71afd6efe76db5ef1d54c0fc8c575f6d7243..95ec01b1aacf0464b77e17ed8ccaa68b4114122f 100644 (file)
@@ -51,6 +51,22 @@ static DEFINE_SPINLOCK(xencons_lock);
 
 /* ------------------------------------------------------------------ */
 
+static bool xen_console_io = false;
+static int __initdata opt_console_io = -1;
+
+static int __init parse_xen_console_io(char *arg)
+{
+       bool val;
+       int ret;
+
+       ret = kstrtobool(arg, &val);
+       if (ret == 0)
+               opt_console_io = (int)val;
+
+       return ret;
+}
+early_param("xen_console_io", parse_xen_console_io);
+
 static struct xencons_info *vtermno_to_xencons(int vtermno)
 {
        struct xencons_info *entry, *ret = NULL;
@@ -331,7 +347,7 @@ static int xen_initial_domain_console_init(void)
        struct xencons_info *info;
        unsigned long flags;
 
-       if (!xen_initial_domain())
+       if (!xen_console_io)
                return -ENODEV;
 
        info = vtermno_to_xencons(HVC_COOKIE);
@@ -369,7 +385,7 @@ void xen_console_resume(void)
 {
        struct xencons_info *info = vtermno_to_xencons(HVC_COOKIE);
        if (info != NULL && info->irq) {
-               if (!xen_initial_domain())
+               if (!xen_console_io)
                        xen_console_update_evtchn(info);
                rebind_evtchn_irq(info->evtchn, info->irq);
        }
@@ -601,7 +617,7 @@ static int __init xen_hvc_init(void)
        if (!xen_domain())
                return -ENODEV;
 
-       if (xen_initial_domain()) {
+       if (xen_console_io) {
                ops = &dom0_hvc_ops;
                r = xen_initial_domain_console_init();
                if (r < 0)
@@ -647,14 +663,17 @@ static int __init xen_hvc_init(void)
 }
 device_initcall(xen_hvc_init);
 
-static int xen_cons_init(void)
+static int __init xen_cons_init(void)
 {
        const struct hv_ops *ops;
 
+       xen_console_io = opt_console_io >= 0 ? opt_console_io :
+                                              xen_initial_domain();
+
        if (!xen_domain())
                return 0;
 
-       if (xen_initial_domain())
+       if (xen_console_io)
                ops = &dom0_hvc_ops;
        else {
                int r;