[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 10/18] tools/misc: introduce helper to initialise Dom0
This small helper is responsible for generating Dom0 JSON config stub and writing Dom0 xenstore entries. This helpers subsumes two calls to xenstore-write in xencommons script. Dom0 UUID is intentionally left untouched, so it is always all zeros. This makes sure that we don't leak Dom0 stubs across rebooting. Modify tools/Makefile to move "misc" after "libxl" as it now depends on libxl to build. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- .gitignore | 1 + tools/Makefile | 2 +- tools/hotplug/Linux/init.d/xencommons | 5 +- tools/misc/Makefile | 8 +- tools/misc/xen-init-dom0.c | 130 +++++++++++++++++++++++++++++++++ 5 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 tools/misc/xen-init-dom0.c diff --git a/.gitignore b/.gitignore index fefe13c..a6370d8 100644 --- a/.gitignore +++ b/.gitignore @@ -183,6 +183,7 @@ tools/misc/gtracestat tools/misc/xenlockprof tools/misc/lowmemd tools/misc/xencov +tools/misc/xen-init-dom0 tools/pygrub/build/* tools/python/build/* tools/python/xen/util/path.py diff --git a/tools/Makefile b/tools/Makefile index b6476c9..89fc698 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -6,7 +6,6 @@ SUBDIRS-y += include SUBDIRS-y += libxc SUBDIRS-$(FLASK_ENABLE) += flask SUBDIRS-y += xenstore -SUBDIRS-y += misc SUBDIRS-y += examples SUBDIRS-y += hotplug SUBDIRS-y += xentrace @@ -30,6 +29,7 @@ endif SUBDIRS-y += xenpmd SUBDIRS-y += libxl +SUBDIRS-y += misc SUBDIRS-$(CONFIG_X86) += xenpaging SUBDIRS-$(CONFIG_X86) += debugger/gdbsx SUBDIRS-$(CONFIG_X86) += debugger/kdd diff --git a/tools/hotplug/Linux/init.d/xencommons b/tools/hotplug/Linux/init.d/xencommons index 4ebd636..1811eee 100644 --- a/tools/hotplug/Linux/init.d/xencommons +++ b/tools/hotplug/Linux/init.d/xencommons @@ -108,9 +108,8 @@ do_start () { exit 1 fi - echo Setting domain 0 name and domid... - ${BINDIR}/xenstore-write "/local/domain/0/name" "Domain-0" - ${BINDIR}/xenstore-write "/local/domain/0/domid" 0 + echo Setting domain 0 name, domid and JSON config... + ${PRIVATE_BINDIR}/xen-init-dom0 fi echo Starting xenconsoled... diff --git a/tools/misc/Makefile b/tools/misc/Makefile index 69b1817..1223e19 100644 --- a/tools/misc/Makefile +++ b/tools/misc/Makefile @@ -6,10 +6,11 @@ CFLAGS += -Werror CFLAGS += $(CFLAGS_libxenctrl) CFLAGS += $(CFLAGS_xeninclude) CFLAGS += $(CFLAGS_libxenstore) +CFLAGS += $(CFLAGS_libxenlight) HDRS = $(wildcard *.h) -TARGETS-y := xenperf xenpm xen-tmem-list-parse gtraceview gtracestat xenlockprof xenwatchdogd xencov +TARGETS-y := xenperf xenpm xen-tmem-list-parse gtraceview gtracestat xenlockprof xenwatchdogd xencov xen-init-dom0 TARGETS-$(CONFIG_X86) += xen-detect xen-hvmctx xen-hvmcrash xen-lowmemd xen-mfndump TARGETS-$(CONFIG_MIGRATE) += xen-hptool TARGETS := $(TARGETS-y) @@ -26,7 +27,7 @@ INSTALL_SBIN-$(CONFIG_X86) += xen-hvmctx xen-hvmcrash xen-lowmemd xen-mfndump INSTALL_SBIN-$(CONFIG_MIGRATE) += xen-hptool INSTALL_SBIN := $(INSTALL_SBIN-y) -INSTALL_PRIVBIN-y := xenpvnetboot +INSTALL_PRIVBIN-y := xenpvnetboot xen-init-dom0 INSTALL_PRIVBIN := $(INSTALL_PRIVBIN-y) # Include configure output (config.h) to headers search path @@ -90,4 +91,7 @@ gtraceview: gtraceview.o xencov: xencov.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) +xen-init-dom0: xen-init-dom0.o + $(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(APPEND_LDFLAGS) + -include $(DEPS) diff --git a/tools/misc/xen-init-dom0.c b/tools/misc/xen-init-dom0.c new file mode 100644 index 0000000..4bb1a96 --- /dev/null +++ b/tools/misc/xen-init-dom0.c @@ -0,0 +1,130 @@ +#include <err.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> +#include <stdio.h> + +#include <xenctrl.h> +#include <xenstore.h> +#include <libxl.h> + +#define DOMNAME_PATH "/local/domain/0/name" +#define DOMID_PATH "/local/domain/0/domid" + +static libxl_ctx *ctx; +static xentoollog_logger_stdiostream *logger; +static xc_interface *xch; +static struct xs_handle *xsh; + +static void ctx_alloc(void) +{ + if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, + (xentoollog_logger *)logger)) { + fprintf(stderr, "cannot init libxl context\n"); + exit(1); + } + xch = xc_interface_open(0, 0, 0); + if (!xch) { + fprintf(stderr, "cannot open libxc handle\n"); + exit(1); + } + xsh = xs_open(0); + if (!xsh) { + fprintf(stderr, "cannot open xenstore connection\n"); + exit(1); + } +} + +static void ctx_free(void) +{ + if (ctx) { + libxl_ctx_free(ctx); + ctx = NULL; + } + if (logger) { + xtl_logger_destroy((xentoollog_logger *)logger); + logger = NULL; + } + if (xch) { + xc_interface_close(xch); + xch = NULL; + } + if (xsh) { + xs_close(xsh); + xsh = NULL; + } +} + +int main(int argc, char **argv) +{ + int rc; + libxl_domain_config dom0_config; + char *domname_string = NULL, *domid_string = NULL; + char *json = NULL;; + + logger = xtl_createlogger_stdiostream(stderr, XTL_ERROR, 0); + if (!logger) exit(1); + + atexit(ctx_free); + + ctx_alloc(); + + libxl_domain_config_init(&dom0_config); + + /* Sanity check: this program can only be run once. */ + domid_string = xs_read(xsh, XBT_NULL, DOMID_PATH, NULL); + domname_string = xs_read(xsh, XBT_NULL, DOMNAME_PATH, NULL); + if (domid_string && domname_string) { + fprintf(stderr, "Dom0 is already set up\n"); + rc = 0; + goto out; + } + + /* Generate stub JSON config. */ + dom0_config.c_info.type = LIBXL_DOMAIN_TYPE_PV; + libxl_domain_build_info_init_type(&dom0_config.b_info, + LIBXL_DOMAIN_TYPE_PV); + + json = libxl_domain_config_to_json(ctx, &dom0_config); + /* libxl-json format requires the string ends with '\0'. Code + * snippet taken from libxl. + */ + rc = libxl_userdata_store(ctx, 0, "libxl-json", + (const uint8_t *)json, + strlen(json) + 1 /* inlcude '\0' */); + if (rc) { + fprintf(stderr, "cannot store stub json config for Dom0\n"); + goto out; + } + + /* Write xenstore entries. */ + if (!xs_write(xsh, XBT_NULL, DOMID_PATH, "0", strlen("0"))) { + fprintf(stderr, "cannot set domid for Dom0\n"); + rc = 1; + goto out; + } + + if (!xs_write(xsh, XBT_NULL, DOMNAME_PATH, "Domain-0", + strlen("Domain-0"))) { + fprintf(stderr, "cannot set domain name for Dom0\n"); + rc = 1; + goto out; + } + + printf("Done setting up Dom0\n"); + +out: + libxl_domain_config_dispose(&dom0_config); + free(domid_string); + free(domname_string); + free(json); + return rc; +} + +/* + * Local variables: + * mode: C + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |