[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 7/8] libxl: allow a generation ID to be specified at domain creation
Toolstacks may specify a VM generation ID using the u.hvm.generation_id field in the libxl_domain_build_info structure, when creating a domain. The toolstack is responsible for providing the correct generation ID according to the Microsoft specification (e.g., generating new random ones as appropriate when restoring). Although the specification requires that a ACPI Notify event is raised if the generation ID is changed, the generation ID is never changed when the domain is in a state to receive such an event (it's either newly created or suspended). Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> --- tools/libxl/Makefile | 1 + tools/libxl/libxl.h | 5 +++ tools/libxl/libxl_dom.c | 10 +++++ tools/libxl/libxl_internal.h | 4 ++ tools/libxl/libxl_types.idl | 1 + tools/libxl/libxl_vm_genid.c | 87 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 108 insertions(+) create mode 100644 tools/libxl/libxl_vm_genid.c diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 4cfa275..5d0e2ec 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -77,6 +77,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ libxl_json.o libxl_aoutils.o libxl_numa.o \ libxl_save_callout.o _libxl_save_msgs_callout.o \ libxl_qmp.o libxl_event.o libxl_fork.o $(LIBXL_OBJS-y) +LIBXL_OBJS += libxl_vm_genid.o LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o LIBXL_TESTS += timedereg diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 80947c3..9dd57fd 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -95,6 +95,11 @@ #define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1 /* + * libxl_domain_build_info has the u.hvm.generation_id field. + */ +#define LIBXL_HAVE_BUILDINFO_HVM_GENERATION_ID 1 + +/* * LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE indicates that a * 'direct_io_safe' field (of boolean type) is present in * libxl_device_disk. diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 8485488..9c018a6 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -314,6 +314,16 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, if (info->cpuid != NULL) libxl_cpuid_set(ctx, domid, info->cpuid); + if (info->type == LIBXL_DOMAIN_TYPE_HVM + && !libxl_uuid_is_nil(&info->u.hvm.generation_id)) { + rc = libxl__vm_generation_id_set(gc, domid, + &info->u.hvm.generation_id); + if (rc) { + LOG(ERROR, "Failed to set VM Generation ID"); + return rc; + } + } + ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *)); ents[0] = "memory/static-max"; ents[1] = GCSPRINTF("%"PRId64, info->max_memkb); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 457424f..e68167e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3052,6 +3052,10 @@ void libxl__numa_candidate_put_nodemap(libxl__gc *gc, libxl_bitmap_copy(CTX, &cndt->nodemap, nodemap); } +_hidden int libxl__vm_generation_id_set(libxl__gc *gc, uint32_t domid, + const libxl_uuid *uuid); + + /* Som handy macros for defbool type. */ #define LIBXL__DEFBOOL_DEFAULT (0) #define LIBXL__DEFBOOL_FALSE (-1) diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 52f1aa9..7800509 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -373,6 +373,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("xen_platform_pci", libxl_defbool), ("usbdevice_list", libxl_string_list), ("vendor_device", libxl_vendor_device), + ("generation_id", libxl_uuid), ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), diff --git a/tools/libxl/libxl_vm_genid.c b/tools/libxl/libxl_vm_genid.c new file mode 100644 index 0000000..5a0142f --- /dev/null +++ b/tools/libxl/libxl_vm_genid.c @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2014 Citrix Systems R&D Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +#include "libxl_osdeps.h" /* must come before any other headers */ + +#include "libxl_internal.h" + +#include <xenctrl.h> +#include <xen/hvm/params.h> + +/* + * Set a HVM domain's VM Generation ID. + * + * For further details, refer to the "Virtual Machine Generation ID" + * document from Microsoft. + * + * http://www.microsoft.com/en-us/download/details.aspx?id=30707 + */ +int libxl__vm_generation_id_set(libxl__gc *gc, uint32_t domid, + const libxl_uuid *uuid) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + const char *dom_path; + uint64_t genid[2]; + uint64_t paddr = 0; + int rc; + + memcpy(genid, libxl_uuid_bytearray_const(uuid), 16); + + /* + * Set the "platform/generation-id" XenStore key to pass the ID to + * hvmloader. + */ + dom_path = libxl__xs_get_dompath(gc, domid); + if (!dom_path) { + rc = ERROR_FAIL; + goto out; + } + rc = libxl__xs_write(gc, XBT_NULL, + GCSPRINTF("%s/platform/generation-id", dom_path), + "%"PRIu64 ":%" PRIu64, genid[0], genid[1]); + if (rc < 0) + goto out; + + /* + * Update the ID in guest memory (if available). + */ + xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_VM_GENERATION_ID_ADDR, &paddr); + if (paddr) { + void *vaddr; + + vaddr = xc_map_foreign_range(ctx->xch, domid, XC_PAGE_SIZE, + PROT_READ | PROT_WRITE, + paddr >> XC_PAGE_SHIFT); + if (vaddr == NULL) { + rc = ERROR_FAIL; + goto out; + } + memcpy(vaddr + (paddr & ~XC_PAGE_MASK), genid, 2 * sizeof(*genid)); + munmap(vaddr, XC_PAGE_SIZE); + + /* + * The spec requires an ACPI Notify event is injected into the + * guest when the generation ID is changed. + * + * This is only called for domains that are suspended or newly + * created and they won't be in a state to receive such an + * event. + */ + } + + rc = 0; + + out: + return rc; +} -- 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 |