[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
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |