:p
atchew
Login
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> --- .../admin-guide/kernel-parameters.txt | 5 +++ drivers/tty/hvc/hvc_xen.c | 33 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index XXXXXXX..XXXXXXX 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -XXX,XX +XXX,XX @@ 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] diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c index XXXXXXX..XXXXXXX 100644 --- a/drivers/tty/hvc/hvc_xen.c +++ b/drivers/tty/hvc/hvc_xen.c @@ -XXX,XX +XXX,XX @@ 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) +{ + if (!arg) + return -EINVAL; + + if (strcmp(arg, "off") == 0 || + strcmp(arg, "disabled") == 0 || + strcmp(arg, "0") == 0) { + opt_console_io = 0; + } + else if (strcmp(arg, "on") == 0 || + strcmp(arg, "enabled") == 0 || + strcmp(arg, "1") == 0) { + opt_console_io = 1; + } + return 0; +} +early_param("xen_console_io", parse_xen_console_io); + static struct xencons_info *vtermno_to_xencons(int vtermno) { struct xencons_info *entry, *ret = NULL; @@ -XXX,XX +XXX,XX @@ 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); @@ -XXX,XX +XXX,XX @@ 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); } @@ -XXX,XX +XXX,XX @@ 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) @@ -XXX,XX +XXX,XX @@ static int 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; -- 2.25.1
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> --- Changes in v2: - use kstrtobool --- .../admin-guide/kernel-parameters.txt | 5 ++++ drivers/tty/hvc/hvc_xen.c | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index XXXXXXX..XXXXXXX 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -XXX,XX +XXX,XX @@ 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] diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c index XXXXXXX..XXXXXXX 100644 --- a/drivers/tty/hvc/hvc_xen.c +++ b/drivers/tty/hvc/hvc_xen.c @@ -XXX,XX +XXX,XX @@ 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; @@ -XXX,XX +XXX,XX @@ 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); @@ -XXX,XX +XXX,XX @@ 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); } @@ -XXX,XX +XXX,XX @@ 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) @@ -XXX,XX +XXX,XX @@ static int 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; -- 2.25.1