The use of rcu_lock_domain_by_id() right in switch_serial_input() makes
assumptions about domain IDs which don't hold when in shim mode: The
sole (initial) domain there has a non-zero ID. Obtain the real domain ID
in that case (generalized as get_initial_domain_id() returns zero when
not in shim mode).
Note that console_input_domain() isn't altered, for not being used when
in shim mode (or more generally on x86).
Fixes: c2581c58bec9 ("xen/console: skip switching serial input to non existing domains")
Signed-off-by: Manuel Bouyer <bouyer@antioche.eu.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Release-acked-by: Henry Wang <Henry.Wang@arm.com>
#define switch_code (opt_conswitch[0]-'a'+1)
/*
* console_rx=0 => input to xen
- * console_rx=1 => input to dom0
+ * console_rx=1 => input to dom0 (or the sole shim domain)
* console_rx=N => input to dom(N-1)
*/
static unsigned int __read_mostly console_rx = 0;
*/
for ( ; ; )
{
+ domid_t domid;
struct domain *d;
if ( next_rx++ >= max_console_rx )
break;
}
- d = rcu_lock_domain_by_id(next_rx - 1);
+#ifdef CONFIG_PV_SHIM
+ if ( next_rx == 1 )
+ domid = get_initial_domain_id();
+ else
+#endif
+ domid = next_rx - 1;
+ d = rcu_lock_domain_by_id(domid);
if ( d )
{
rcu_unlock_domain(d);
console_rx = next_rx;
- printk("*** Serial input to DOM%u", next_rx - 1);
+ printk("*** Serial input to DOM%u", domid);
break;
}
}