[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen/console: introduce a 'w' debug-key that dumps the console ring


  • To: Matt Wilson <msw@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>
  • From: Keir Fraser <keir.xen@xxxxxxxxx>
  • Date: Sat, 29 Sep 2012 06:55:41 +0100
  • Cc: xen-devel@xxxxxxxxxxxxx
  • Delivery-date: Sat, 29 Sep 2012 05:56:11 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac2eBw6RMcJ+wQ4MAke2CEW+0v3qbA==
  • Thread-topic: [PATCH] xen/console: introduce a 'w' debug-key that dumps the console ring

On 29/09/2012 06:02, "Matt Wilson" <msw@xxxxxxxxxx> wrote:

> This patch adds a new 'w' debug-key, chosen from the limited remaining
> keys only due to its proximity to 'q', that dumps the console ring to
> configured console devices. It's useful to for tracking down how an
> unresponsive system got into a broken state via serial console.

Why wouldn't everything on the ring already have been sent to the configured
console devices?

 -- Keir

> Signed-off-by: Matt Wilson <msw@xxxxxxxxxx>
> 
> diff -r bd953fda6106 -r 20f6976e28a1 xen/drivers/char/console.c
> --- a/xen/drivers/char/console.c Fri Sep 28 10:59:41 2012 +0200
> +++ b/xen/drivers/char/console.c Sat Sep 29 05:00:05 2012 +0000
> @@ -264,6 +264,49 @@ static void sercon_puts(const char *s)
>          serial_puts(sercon_handle, s);
>  }
>  
> +static void dump_console_ring_key(unsigned char key)
> +{
> +    uint32_t idx, len, sofar, c;
> +    unsigned int order;
> +    char *buf;
> +
> +    printk("'%c' pressed -> dumping console ring buffer (dmesg)\n", key);
> +
> +    /* create a buffer in which we'll copy the ring in the correct
> +       order and NUL terminate */
> +    order = get_order_from_bytes(conring_size + 1);
> +    buf = alloc_xenheap_pages(order, 0);
> +    if ( buf == NULL )
> +    {
> +        printk("unable to allocate memory!\n");
> +        return;
> +    }
> +
> +    c = conringc;
> +    sofar = 0;
> +    while ( (c != conringp) )
> +    {
> +        idx = CONRING_IDX_MASK(c);
> +        len = conringp - c;
> +        if ( (idx + len) > conring_size )
> +            len = conring_size - idx;
> +        memcpy(buf + sofar, &conring[idx], len);
> +        sofar += len;
> +        c += len;
> +    }
> +    buf[sofar] = '\0';
> +
> +    sercon_puts(buf);
> +    vga_puts(buf);
> +
> +    free_xenheap_pages(buf, order);
> +}
> +
> +static struct keyhandler dump_console_ring_keyhandler = {
> +    .u.fn = dump_console_ring_key,
> +    .desc = "synchronously dump console ring buffer (dmesg)"
> +};
> +
>  /* CTRL-<switch_char> switches input direction between Xen and DOM0. */
>  #define switch_code (opt_conswitch[0]-'a'+1)
>  static int __read_mostly xen_rx = 1; /* FALSE => serial input passed to
> domain 0. */
> @@ -661,6 +704,8 @@ void __init console_endboot(void)
>      if ( opt_conswitch[1] == 'x' )
>          xen_rx = !xen_rx;
>  
> +    register_keyhandler('w', &dump_console_ring_keyhandler);
> +
>      /* Serial input is directed to DOM0 by default. */
>      switch_serial_input();
>  }



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.