Commit 763baca7 authored by Stefano Stabellini's avatar Stefano Stabellini Committed by Juergen Gross
Browse files

xen: introduce xen_console_io option



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: default avatarStefano Stabellini <stefano.stabellini@amd.com>
Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
Message-ID: <alpine.DEB.2.22.394.2601131522540.992863@ubuntu-linux-20-04-desktop>
parent dc8ea871
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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]
+24 −5
Original line number Diff line number Diff line
@@ -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;