[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 21/24] [xen-unstable.hg] utility for accessing xenstore stubdom console which doesn't use xenstore
Hi, I've attached an updated version of this patch which fixes a bug.xenconsole_dump was sending a notification on the console evtchn after reading from the console shared page, but this causes crashes in minios VMs such as the xenstore stubdomain. Removing the unnecessary xc_evtchn_notify() call in xenconsole_dump makes it possible to run "/etc/init.d/xenstored console" without crashing the xenstore stubdom. Alex Zeffertt wrote: This is a very dumb xenconsole backend that does not use xenstore. Signed-off-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx> Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx> --- diff -r 3d1e54a046d3 .hgignore --- a/.hgignore Mon Jun 08 14:13:00 2009 +0100 +++ b/.hgignore Wed Jun 10 16:11:09 2009 +0100 @@ -196,6 +196,7 @@ ^tools/misc/xen-tmem-list-parse$ ^tools/misc/xenperf$ ^tools/misc/xenpm$ +^tools/misc/xenconsole_dump$ ^tools/pygrub/build/.*$ ^tools/python/build/.*$ ^tools/python/xen/util/path\.py$ diff -r 3d1e54a046d3 tools/misc/Makefile --- a/tools/misc/Makefile Mon Jun 08 14:13:00 2009 +0100 +++ b/tools/misc/Makefile Wed Jun 10 16:11:09 2009 +0100 @@ -10,7 +10,7 @@ HDRS = $(wildcard *.h) -TARGETS-y := xenperf xenpm xen-tmem-list-parse +TARGETS-y := xenperf xenpm xen-tmem-list-parse xenconsole_dump TARGETS-$(CONFIG_X86) += xen-detect TARGETS := $(TARGETS-y) @@ -18,7 +18,7 @@ SUBDIRS-$(CONFIG_MINITERM) += miniterm SUBDIRS := $(SUBDIRS-y) -INSTALL_BIN-y := xencons +INSTALL_BIN-y := xencons xenconsole_dump INSTALL_BIN-$(CONFIG_X86) += xen-detect INSTALL_BIN := $(INSTALL_BIN-y) @@ -56,4 +56,7 @@ xenperf xenpm: %: %.o Makefile $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LDFLAGS_libxenctrl) +xenconsole_dump: %: %.o Makefile + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LDFLAGS_libxenctrl) + -include $(DEPS) diff -r 3d1e54a046d3 tools/misc/xenconsole_dump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/misc/xenconsole_dump.c Wed Jun 10 16:11:09 2009 +0100 @@ -0,0 +1,142 @@ +/* + * This is a very dumb xenconsole backend that does not use xenstore. + * + * Copyright 2008, Diego Ongaro <diego.ongaro@xxxxxxxxxx> + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of + * this archive for more details. + */ + +#include <getopt.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/select.h> + +#include <xenctrl.h> +#include <xen/grant_table.h> +#include <xen/io/console.h> + + +#define DIE() \ +do { \ + fprintf(stderr, "DIE in %s at %s:%d\n", __FUNCTION__, __FILE__, __LINE__); \ + exit(1); \ +} while (0) +#define DIE_ON(cond) \ +do { \ + if ((cond)) \ + DIE(); \ +} while (0) + + +static domid_t domid = -1; +static evtchn_port_or_error_t remote_port = -1; +static evtchn_port_or_error_t local_port = -1; +static struct xencons_interface *intf; + +static int xce_handle; +static int xcg_handle; + +static void +try_dump(void) +{ + static char buffer[sizeof(intf->out)]; + XENCONS_RING_IDX cons, prod, size; + int i = 0; + + cons = intf->out_cons; + prod = intf->out_prod; + xen_mb(); + + size = prod - cons; + if ((size == 0) || (size > sizeof(intf->out))) + return; + + while (cons != prod) + buffer[i++] = intf->out[MASK_XENCONS_IDX(cons++, intf->out)]; + + xen_mb(); + intf->out_cons = cons; + + DIE_ON(write(1, buffer, i) != i); +} + +static void +dump_ring(void) +{ + while (1) { + DIE_ON(xc_evtchn_pending(xce_handle) == -1); + try_dump(); + DIE_ON(xc_evtchn_unmask(xce_handle, local_port) == -1); + } +} + +static void +setup(void) +{ + xce_handle = xc_evtchn_open(); + DIE_ON(xce_handle == -1); + + xcg_handle = xc_gnttab_open(); + DIE_ON(xcg_handle == -1); + + intf = xc_gnttab_map_grant_ref(xcg_handle, + domid, + GNTTAB_RESERVED_CONSOLE, + PROT_READ|PROT_WRITE); + DIE_ON(intf == NULL); + + local_port = xc_evtchn_bind_interdomain(xce_handle, domid, remote_port); + DIE_ON(local_port == -1); + +} + +static void +usage(char *name) +{ + printf("Usage: %s [-h] --domid=DOMID --remote-port=PORT\n", name); +} + +int +main(int argc, char **argv) +{ + const char *sopts = "h"; + struct option lopts[] = { + { "help", 0, 0, 'h' }, + { "domid", 1, 0, 'D'}, + { "remote-port", 1, 0, 'P'}, + { 0 }, + }; + int ch; + int opt_ind = 0; + + while ((ch = getopt_long(argc, argv, sopts, lopts, &opt_ind)) != -1) { + switch (ch) { + case 'h': + usage(argv[0]); + exit(0); + case 'D': + domid = (domid_t) atoi(optarg); + break; + case 'P': + remote_port = (evtchn_port_or_error_t) atoi(optarg); + break; + } + } + + if (domid <= 0 || remote_port < 0) { + usage(argv[0]); + exit(1); + } + + setup(); + dump_ring(); + + return 0; +} _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |