>>> On 03.11.18 at 00:45, <sstabell...@kernel.org> wrote: > Today Ctrl-AAA is used to switch between Xen and Dom0. Extend the > mechanism to allow for switching between Xen, Dom0, and any of the > initial DomU created from Xen alongside Dom0 out of information provided > via device tree. > > Rename xen_rx to console_rx to match the new behavior. > > Clarify existing comment about "notify the guest", making it clear that > it is only about the hardware domain. > > Switching the console input to domUs started from Xen at boot is > #ifdef'ed to 0 in this patch. The code will be enabled when > vpl011_rx_char_xen is introduced. For now it is disabled for > bisectability. > > Signed-off-by: Stefano Stabellini <stefa...@xilinx.com>
Acked-by: Jan Beulich <jbeul...@suse.com> with two remarks (but the ack applies with or without either taken care of): > @@ -391,31 +394,82 @@ static void dump_console_ring_key(unsigned char key) > free_xenheap_pages(buf, order); > } > > -/* CTRL-<switch_char> switches input direction between Xen and DOM0. */ > +/* > + * CTRL-<switch_char> changes input direction, rotating among Xen, Dom0, > + * and the DomUs started from Xen at boot. > + */ > #define switch_code (opt_conswitch[0]-'a'+1) > -static int __read_mostly xen_rx = 1; /* FALSE => input passed to domain 0. */ > +/* > + * console_rx=0 => input to xen > + * console_rx=1 => input to dom0 > + * console_rx=N => input to dom(N-1) > + */ > +static unsigned int __read_mostly console_rx = 0; > > static void switch_serial_input(void) > { > - static char *input_str[2] = { "DOM0", "Xen" }; > - xen_rx = !xen_rx; > - printk("*** Serial input -> %s", input_str[xen_rx]); > + if ( console_rx == max_init_domid + 1 ) I generally consider it better to use >= in cases like this. > static void __serial_rx(char c, struct cpu_user_regs *regs) > { > - if ( xen_rx ) > + switch ( console_rx ) > + { > + case 0: > return handle_keypress(c, regs); > > - /* Deliver input to guest buffer, unless it is already full. */ > - if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE ) > - serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod++)] = c; > - /* Always notify the guest: prevents receive path from getting stuck. */ > - send_global_virq(VIRQ_CONSOLE); > + case 1: > + /* > + * Deliver input to the hardware domain buffer, unless it is > + * already full. > + */ > + if ( (serial_rx_prod - serial_rx_cons) != SERIAL_RX_SIZE ) > + serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod++)] = c; > + > + /* > + * Always notify the hardware domain: prevents receive path from > + * getting stuck. > + */ > + send_global_virq(VIRQ_CONSOLE); > + break; > + > +#if 0 > + default: > + { > + struct domain *d = rcu_lock_domain_by_any_id(console_rx - 1); > + > + /* > + * If we have a properly initialized vpl011 console for the > + * domain, without a full PV ring to Dom0 (in that case input > + * comes from the PV ring), then send the character to it. > + */ > + if ( d != NULL && > + !d->arch.vpl011.backend_in_domain && > + d->arch.vpl011.backend.xen != NULL ) > + vpl011_rx_char_xen(d, c); > + else > + printk("Cannot send chars to Dom%d: no UART available\n", > + console_rx - 1); > + > + if ( d != NULL ) > + rcu_unlock_domain(d); > + } > +#endif As said before, I would have preferred if this code block was introduced only with the patch making it usable, rather than with the #if 0 here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel