From: Andrew Cooper <andrew.cooper3@citrix.com>
To: David Vrabel <david.vrabel@citrix.com>
Cc: xen-devel@lists.xenproject.org,
Ian Jackson <ian.jackson@eu.citrix.com>,
Ian Campbell <ian.campbell@citrix.com>,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [PATCH 5/6] libxl: allow a generation ID to be specified at domain creation
Date: Tue, 3 Jun 2014 14:28:10 +0100 [thread overview]
Message-ID: <538DCD6A.90800@citrix.com> (raw)
In-Reply-To: <1401801340-6196-6-git-send-email-david.vrabel@citrix.com>
On 03/06/14 14:15, David Vrabel wrote:
> Toolstacks may specify a VM generation ID using the
> u.hvm.generation_id field into 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@citrix.com>
> ---
> 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 | 89 ++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 110 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 4804fdf..80bc9ff 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(CTX, 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..d938b90 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_ctx *ctx, 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..378dcf2
> --- /dev/null
> +++ b/tools/libxl/libxl_vm_genid.c
> @@ -0,0 +1,89 @@
> +/*
> + * 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_ctx *ctx, uint32_t domid,
> + const libxl_uuid *uuid)
> +{
> + GC_INIT(ctx);
> + char *dom_path;
> + char *key;
> + uint64_t genid[2];
> + uint64_t paddr = 0;
> + int rc;
> +
> + memcpy(genid, libxl_uuid_bytearray((libxl_uuid *)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;
> + }
> + key = libxl__sprintf(gc, "%s/platform/generation-id", dom_path);
> + rc = libxl__xs_write(gc, XBT_NULL, key, "%"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);
This will break 32bit toolstack builds, because xc_get_hvm_param() takes
a pointer to an unsigned long pointer rather than a uint64_t pointer.
It appears that it will also silently truncate the 64bit hvm param to
32bits for a 32bit toolstack...
~Andrew
> + 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 requries 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:
> + GC_FREE;
> + return rc;
> +}
next prev parent reply other threads:[~2014-06-03 13:28 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-03 13:15 [PATCHv3 0/6] tools: rework VM Generation ID David Vrabel
2014-06-03 13:15 ` [PATCH 1/6] docs: update docs for the ~/platform/generation-id key David Vrabel
2014-06-10 10:25 ` Ian Campbell
2014-06-03 13:15 ` [PATCH 2/6] hvm: add HVM_PARAM_VM_GENERATION_ID_ADDR David Vrabel
2014-06-03 13:19 ` Andrew Cooper
2014-06-10 10:27 ` Ian Campbell
2014-06-10 10:40 ` Jan Beulich
2014-06-10 10:44 ` Andrew Cooper
2014-06-10 10:49 ` Jan Beulich
2014-06-03 13:15 ` [PATCH 3/6] hvmloader: add helper functions to get/set HVM params David Vrabel
2014-06-03 19:43 ` Konrad Rzeszutek Wilk
2014-06-10 10:39 ` Ian Campbell
2014-06-03 13:15 ` [PATCH 4/6] libxc, libxl, hvmloader: strip out outdated VM generation ID implementation David Vrabel
2014-06-10 10:42 ` Ian Campbell
2014-06-03 13:15 ` [PATCH 5/6] libxl: allow a generation ID to be specified at domain creation David Vrabel
2014-06-03 13:28 ` Andrew Cooper [this message]
2014-06-03 14:14 ` David Vrabel
2014-06-10 11:01 ` Ian Campbell
2014-06-10 12:35 ` David Vrabel
2014-06-10 13:37 ` Ian Campbell
2014-06-10 13:41 ` David Vrabel
2014-06-10 14:18 ` Ian Campbell
2014-06-10 17:59 ` David Vrabel
2014-06-11 8:22 ` Ian Campbell
2014-06-11 10:53 ` David Vrabel
2014-06-11 11:01 ` Ian Campbell
2014-06-11 11:47 ` David Vrabel
2014-06-11 11:53 ` Ian Campbell
2014-06-03 13:15 ` [PATCH 6/6] xl: generate a new random VM generation ID if requested David Vrabel
2014-06-10 11:02 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=538DCD6A.90800@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=david.vrabel@citrix.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.