|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 21/25] xen: support console_switching between Dom0 and DomUs on ARM
On Wed, 24 Oct 2018, Oleksandr Andrushchenko wrote:
> On 10/23/2018 05:03 AM, Stefano Stabellini 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.
> >
> > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> > CC: andrew.cooper3@xxxxxxxxxx
> > CC: George.Dunlap@xxxxxxxxxxxxx
> > CC: ian.jackson@xxxxxxxxxxxxx
> > CC: jbeulich@xxxxxxxx
> > CC: konrad.wilk@xxxxxxxxxx
> > CC: tim@xxxxxxx
> > CC: wei.liu2@xxxxxxxxxx
> > ---
> > Changes in v5:
> > - move patch earlier and disable code that calls vpl011_rx_char_xen (not
> > defined yet)
> > - improve comments
> > - replace ifs with a switch
> > - code style
> >
> > Changes in v4:
> > - handle console_rx == 0 in console_input_domain
> > - use rcu_lock_by_domain instead of get_domain_by_id
> > - handle the case where the returned domain is NULL
> > - send_global_virq(VIRQ_CONSOLE) only when chars are for Dom0
> > - make console_rx unsigned int
> > - fix comment
> > - code readability improvement
> > - fix opt_conswitch[1] == 'x' case
> > - move console_input_domain to next patch
> >
> > Changes in v3:
> > - only call vpl011 functions ifdef CONFIG_SBSA_VUART_CONSOLE
> > - add blank line and spaces
> > - remove xen_rx from print messages
> > - rename xen_rx to console_rx
> > - keep switch_serial_input() at boot
> > - add better comments
> > - fix existing comment
> > - add warning if no guests console/uart is available
> > - add console_input_domain function
> >
> > Changes in v2:
> > - only call vpl011_rx_char if the vpl011 has been initialized
> > ---
> > xen/drivers/char/console.c | 79
> > ++++++++++++++++++++++++++++++++++++++--------
> > 1 file changed, 65 insertions(+), 14 deletions(-)
> >
> > diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
> > index 3b75f7a..75172e7 100644
> > --- a/xen/drivers/char/console.c
> > +++ b/xen/drivers/char/console.c
> > @@ -31,10 +31,13 @@
> > #include <xen/early_printk.h>
> > #include <xen/warning.h>
> > #include <xen/pv_console.h>
> > +#include <asm/setup.h>
> > #ifdef CONFIG_X86
> > #include <xen/consoled.h>
> > #include <asm/guest.h>
> > +#else
> > +#include <asm/vpl011.h>
> > #endif
> > /* console: comma-separated list of console outputs. */
> > @@ -391,31 +394,79 @@ 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 DomUs.
> > + */
> > #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 )
> > + console_rx = 0;
> > +
> > + if ( console_rx == 0 )
> > + printk("*** Serial input to Xen");
> > + else
> > + printk("*** Serial input to DOM%d", console_rx - 1);
> > +
> > if ( switch_code )
> > - printk(" (type 'CTRL-%c' three times to switch input to %s)",
> > - opt_conswitch[0], input_str[!xen_rx]);
> > + printk(" (type 'CTRL-%c' three times to switch input)",
> > + opt_conswitch[0]);
> > printk("\n");
> > }
> > static void __serial_rx(char c, struct cpu_user_regs *regs)
> > {
> > - if ( xen_rx )
> > + switch ( console_rx )
> > + {
> > + case 0:
> > return handle_keypress(c, regs);
> > + 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;
> > + }
> + * console_rx=0 => input to xen
> + * console_rx=1 => input to dom0
> + * console_rx=N => input to dom(N-1)
> So, why do you only handle case 0/1?
> > +#if 0
> Do you need this #if 0?
To make the series fully bisectable: the code below requires
functionalities introduced by later patches.
> > + 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);
> > - /* 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);
> > + if ( d != NULL )
> > + rcu_unlock_domain(d);
> > + }
> > +#endif
> > + }
> > #ifdef CONFIG_X86
> > if ( pv_shim && pv_console )
> > @@ -943,7 +994,7 @@ void __init console_endboot(void)
> > * a useful 'how to switch' message.
> > */
> > if ( opt_conswitch[1] == 'x' )
> > - xen_rx = !xen_rx;
> > + console_rx = max_init_domid + 1;
> > register_keyhandler('w', dump_console_ring_key,
> > "synchronously dump console ring buffer (dmesg)",
> > 0);
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |