mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 06:04:44 +01:00
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: 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>
This commit is contained in:
parent
dc8ea87143
commit
763baca7bf
2 changed files with 29 additions and 5 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue