[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] libxc: migrate migration stream definitions into Xen public headers



> -----Original Message-----
> From: David Woodhouse <dwmw2@xxxxxxxxxxxxx>
> Sent: 01 February 2020 00:40
> To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; Andrew
> Cooper <andrew.cooper3@xxxxxxxxxx>; George Dunlap
> <George.Dunlap@xxxxxxxxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; Julien
> Grall <julien@xxxxxxx>; Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>;
> Stefano Stabellini <sstabellini@xxxxxxxxxx>; Gautam, Varad
> <vrd@xxxxxxxxx>; Durrant, Paul <pdurrant@xxxxxxxxxxxx>
> Subject: [PATCH] libxc: migrate migration stream definitions into Xen
> public headers
> 
> From: David Woodhouse <dwmw@xxxxxxxxxxxx>
> 
> These data structures will be used for live update, which is basically
> just live migration from one Xen to the next on the same machine via
> in-memory data structures, instead of across the network.
> 
> Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
> Well-excellent-carry-on-then-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Go-with-that-for-now-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

This is probably fine but may need some re-structuring when we consider 
non-cooperative migration. I have not yet had time to post a design document 
but my thoughts are along the lines of generalising the idea of 'hvm_context' 
records into 'domain_context' (or some suitable name). Then we can add the 
necessary 'PV' save records, such as event channel state, grant table state, 
etc. We may then want to consider using the same mechanism for PV shared info 
and maybe some of the other records that are currently 'top level' in the XC 
migration stream.

  Paul 

> ---
>  tools/libxc/xc_sr_common.c            |  20 ++---
>  tools/libxc/xc_sr_common_x86.c        |   4 +-
>  tools/libxc/xc_sr_restore.c           |   2 +-
>  tools/libxc/xc_sr_restore_x86_hvm.c   |   4 +-
>  tools/libxc/xc_sr_restore_x86_pv.c    |   8 +-
>  tools/libxc/xc_sr_save.c              |   2 +-
>  tools/libxc/xc_sr_save_x86_hvm.c      |   4 +-
>  tools/libxc/xc_sr_save_x86_pv.c       |  12 +--
>  tools/libxc/xc_sr_stream_format.h     |  97 +-------------------
>  xen/include/Makefile                  |   2 +-
>  xen/include/public/migration_stream.h | 125 ++++++++++++++++++++++++++
>  11 files changed, 156 insertions(+), 124 deletions(-)
>  create mode 100644 xen/include/public/migration_stream.h
> 
> diff --git a/tools/libxc/xc_sr_common.c b/tools/libxc/xc_sr_common.c
> index dd9a11b4b5..92f9332e73 100644
> --- a/tools/libxc/xc_sr_common.c
> +++ b/tools/libxc/xc_sr_common.c
> @@ -91,7 +91,7 @@ int write_split_record(struct xc_sr_context *ctx, struct
> xc_sr_record *rec,
>  int read_record(struct xc_sr_context *ctx, int fd, struct xc_sr_record
> *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rhdr rhdr;
> +    struct mr_rhdr rhdr;
>      size_t datasz;
> 
>      if ( read_exact(fd, &rhdr, sizeof(rhdr)) )
> @@ -142,15 +142,15 @@ static void __attribute__((unused))
> build_assertions(void)
>  {
>      BUILD_BUG_ON(sizeof(struct xc_sr_ihdr) != 24);
>      BUILD_BUG_ON(sizeof(struct xc_sr_dhdr) != 16);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rhdr) != 8);
> -
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_page_data_header)  != 8);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_x86_pv_info)       != 8);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_x86_pv_p2m_frames) != 8);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_x86_pv_vcpu_hdr)   != 8);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_x86_tsc_info)      != 24);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_hvm_params_entry)  != 16);
> -    BUILD_BUG_ON(sizeof(struct xc_sr_rec_hvm_params)        != 8);
> +    BUILD_BUG_ON(sizeof(struct mr_rhdr) != 8);
> +
> +    BUILD_BUG_ON(sizeof(struct mr_page_data_header)  != 8);
> +    BUILD_BUG_ON(sizeof(struct mr_x86_pv_info)       != 8);
> +    BUILD_BUG_ON(sizeof(struct mr_x86_pv_p2m_frames) != 8);
> +    BUILD_BUG_ON(sizeof(struct mr_x86_pv_vcpu_hdr)   != 8);
> +    BUILD_BUG_ON(sizeof(struct mr_x86_tsc_info)      != 24);
> +    BUILD_BUG_ON(sizeof(struct mr_hvm_params_entry)  != 16);
> +    BUILD_BUG_ON(sizeof(struct mr_hvm_params)        != 8);
>  }
> 
>  /*
> diff --git a/tools/libxc/xc_sr_common_x86.c
> b/tools/libxc/xc_sr_common_x86.c
> index 011684df97..1627ff72d6 100644
> --- a/tools/libxc/xc_sr_common_x86.c
> +++ b/tools/libxc/xc_sr_common_x86.c
> @@ -3,7 +3,7 @@
>  int write_x86_tsc_info(struct xc_sr_context *ctx)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_tsc_info tsc = {};
> +    struct mr_x86_tsc_info tsc = {};
>      struct xc_sr_record rec = {
>          .type = REC_TYPE_X86_TSC_INFO,
>          .length = sizeof(tsc),
> @@ -23,7 +23,7 @@ int write_x86_tsc_info(struct xc_sr_context *ctx)
>  int handle_x86_tsc_info(struct xc_sr_context *ctx, struct xc_sr_record
> *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_tsc_info *tsc = rec->data;
> +    struct mr_x86_tsc_info *tsc = rec->data;
> 
>      if ( rec->length != sizeof(*tsc) )
>      {
> diff --git a/tools/libxc/xc_sr_restore.c b/tools/libxc/xc_sr_restore.c
> index 5e31908ca8..29c264ecc7 100644
> --- a/tools/libxc/xc_sr_restore.c
> +++ b/tools/libxc/xc_sr_restore.c
> @@ -335,7 +335,7 @@ static int process_page_data(struct xc_sr_context
> *ctx, unsigned int count,
>  static int handle_page_data(struct xc_sr_context *ctx, struct
> xc_sr_record *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_page_data_header *pages = rec->data;
> +    struct mr_page_data_header *pages = rec->data;
>      unsigned int i, pages_of_data = 0;
>      int rc = -1;
> 
> diff --git a/tools/libxc/xc_sr_restore_x86_hvm.c
> b/tools/libxc/xc_sr_restore_x86_hvm.c
> index 3f78248f32..e5b25f4280 100644
> --- a/tools/libxc/xc_sr_restore_x86_hvm.c
> +++ b/tools/libxc/xc_sr_restore_x86_hvm.c
> @@ -25,8 +25,8 @@ static int handle_hvm_params(struct xc_sr_context *ctx,
>                               struct xc_sr_record *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_hvm_params *hdr = rec->data;
> -    struct xc_sr_rec_hvm_params_entry *entry = hdr->param;
> +    struct mr_hvm_params *hdr = rec->data;
> +    struct mr_hvm_params_entry *entry = hdr->param;
>      unsigned int i;
>      int rc;
> 
> diff --git a/tools/libxc/xc_sr_restore_x86_pv.c
> b/tools/libxc/xc_sr_restore_x86_pv.c
> index 16e738884e..8e43ddcfd7 100644
> --- a/tools/libxc/xc_sr_restore_x86_pv.c
> +++ b/tools/libxc/xc_sr_restore_x86_pv.c
> @@ -585,7 +585,7 @@ static int update_guest_p2m(struct xc_sr_context *ctx)
>   * Cross-check the legitimate combinations.
>   */
>  static bool valid_x86_pv_info_combination(
> -    const struct xc_sr_rec_x86_pv_info *info)
> +    const struct mr_x86_pv_info *info)
>  {
>      switch ( info->guest_width )
>      {
> @@ -602,7 +602,7 @@ static int handle_x86_pv_info(struct xc_sr_context
> *ctx,
>                                struct xc_sr_record *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_pv_info *info = rec->data;
> +    struct mr_x86_pv_info *info = rec->data;
> 
>      if ( ctx->x86.pv.restore.seen_pv_info )
>      {
> @@ -675,7 +675,7 @@ static int handle_x86_pv_p2m_frames(struct
> xc_sr_context *ctx,
>                                      struct xc_sr_record *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_pv_p2m_frames *data = rec->data;
> +    struct mr_x86_pv_p2m_frames *data = rec->data;
>      unsigned int start, end, x, fpp = PAGE_SIZE / ctx->x86.pv.width;
>      int rc;
> 
> @@ -734,7 +734,7 @@ static int handle_x86_pv_vcpu_blob(struct
> xc_sr_context *ctx,
>                                     struct xc_sr_record *rec)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_pv_vcpu_hdr *vhdr = rec->data;
> +    struct mr_x86_pv_vcpu_hdr *vhdr = rec->data;
>      struct xc_sr_x86_pv_restore_vcpu *vcpu;
>      const char *rec_name;
>      size_t blobsz;
> diff --git a/tools/libxc/xc_sr_save.c b/tools/libxc/xc_sr_save.c
> index fa736a311f..41af26909e 100644
> --- a/tools/libxc/xc_sr_save.c
> +++ b/tools/libxc/xc_sr_save.c
> @@ -87,7 +87,7 @@ static int write_batch(struct xc_sr_context *ctx)
>      void *page, *orig_page;
>      uint64_t *rec_pfns = NULL;
>      struct iovec *iov = NULL; int iovcnt = 0;
> -    struct xc_sr_rec_page_data_header hdr = { 0 };
> +    struct mr_page_data_header hdr = { 0 };
>      struct xc_sr_record rec = {
>          .type = REC_TYPE_PAGE_DATA,
>      };
> diff --git a/tools/libxc/xc_sr_save_x86_hvm.c
> b/tools/libxc/xc_sr_save_x86_hvm.c
> index d99efe65e5..c4dc42479f 100644
> --- a/tools/libxc/xc_sr_save_x86_hvm.c
> +++ b/tools/libxc/xc_sr_save_x86_hvm.c
> @@ -80,8 +80,8 @@ static int write_hvm_params(struct xc_sr_context *ctx)
>      };
> 
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_hvm_params_entry entries[ARRAY_SIZE(params)];
> -    struct xc_sr_rec_hvm_params hdr = {
> +    struct mr_hvm_params_entry entries[ARRAY_SIZE(params)];
> +    struct mr_hvm_params hdr = {
>          .count = 0,
>      };
>      struct xc_sr_record rec = {
> diff --git a/tools/libxc/xc_sr_save_x86_pv.c
> b/tools/libxc/xc_sr_save_x86_pv.c
> index f3ccf5bb4b..916c5aad41 100644
> --- a/tools/libxc/xc_sr_save_x86_pv.c
> +++ b/tools/libxc/xc_sr_save_x86_pv.c
> @@ -485,7 +485,7 @@ static int write_one_vcpu_basic(struct xc_sr_context
> *ctx, uint32_t id)
>      unsigned int i, gdt_count;
>      int rc = -1;
>      vcpu_guest_context_any_t vcpu;
> -    struct xc_sr_rec_x86_pv_vcpu_hdr vhdr = {
> +    struct mr_x86_pv_vcpu_hdr vhdr = {
>          .vcpu_id = id,
>      };
>      struct xc_sr_record rec = {
> @@ -583,7 +583,7 @@ static int write_one_vcpu_basic(struct xc_sr_context
> *ctx, uint32_t id)
>  static int write_one_vcpu_extended(struct xc_sr_context *ctx, uint32_t
> id)
>  {
>      xc_interface *xch = ctx->xch;
> -    struct xc_sr_rec_x86_pv_vcpu_hdr vhdr = {
> +    struct mr_x86_pv_vcpu_hdr vhdr = {
>          .vcpu_id = id,
>      };
>      struct xc_sr_record rec = {
> @@ -620,7 +620,7 @@ static int write_one_vcpu_xsave(struct xc_sr_context
> *ctx, uint32_t id)
>      xc_interface *xch = ctx->xch;
>      int rc = -1;
>      DECLARE_HYPERCALL_BUFFER(void, buffer);
> -    struct xc_sr_rec_x86_pv_vcpu_hdr vhdr = {
> +    struct mr_x86_pv_vcpu_hdr vhdr = {
>          .vcpu_id = id,
>      };
>      struct xc_sr_record rec = {
> @@ -686,7 +686,7 @@ static int write_one_vcpu_msrs(struct xc_sr_context
> *ctx, uint32_t id)
>      int rc = -1;
>      size_t buffersz;
>      DECLARE_HYPERCALL_BUFFER(void, buffer);
> -    struct xc_sr_rec_x86_pv_vcpu_hdr vhdr = {
> +    struct mr_x86_pv_vcpu_hdr vhdr = {
>          .vcpu_id = id,
>      };
>      struct xc_sr_record rec = {
> @@ -793,7 +793,7 @@ static int write_all_vcpu_information(struct
> xc_sr_context *ctx)
>   */
>  static int write_x86_pv_info(struct xc_sr_context *ctx)
>  {
> -    struct xc_sr_rec_x86_pv_info info = {
> +    struct mr_x86_pv_info info = {
>          .guest_width = ctx->x86.pv.width,
>          .pt_levels = ctx->x86.pv.levels,
>      };
> @@ -816,7 +816,7 @@ static int write_x86_pv_p2m_frames(struct
> xc_sr_context *ctx)
>      int rc; unsigned int i;
>      size_t datasz = ctx->x86.pv.p2m_frames * sizeof(uint64_t);
>      uint64_t *data = NULL;
> -    struct xc_sr_rec_x86_pv_p2m_frames hdr = {
> +    struct mr_x86_pv_p2m_frames hdr = {
>          .end_pfn = ctx->x86.pv.max_pfn,
>      };
>      struct xc_sr_record rec = {
> diff --git a/tools/libxc/xc_sr_stream_format.h
> b/tools/libxc/xc_sr_stream_format.h
> index 37a7da6eab..0700cde54f 100644
> --- a/tools/libxc/xc_sr_stream_format.h
> +++ b/tools/libxc/xc_sr_stream_format.h
> @@ -1,6 +1,8 @@
>  #ifndef __STREAM_FORMAT__H
>  #define __STREAM_FORMAT__H
> 
> +#include <xen/migration_stream.h>
> +
>  /*
>   * C structures for the Migration v2 stream format.
>   * See docs/specs/libxc-migration-stream.pandoc
> @@ -41,101 +43,6 @@ struct xc_sr_dhdr
>      uint32_t xen_minor;
>  };
> 
> -#define DHDR_TYPE_X86_PV  0x00000001U
> -#define DHDR_TYPE_X86_HVM 0x00000002U
> -
> -/*
> - * Record Header
> - */
> -struct xc_sr_rhdr
> -{
> -    uint32_t type;
> -    uint32_t length;
> -};
> -
> -/* All records must be aligned up to an 8 octet boundary */
> -#define REC_ALIGN_ORDER               (3U)
> -/* Somewhat arbitrary - 128MB */
> -#define REC_LENGTH_MAX                (128U << 20)
> -
> -#define REC_TYPE_END                        0x00000000U
> -#define REC_TYPE_PAGE_DATA                  0x00000001U
> -#define REC_TYPE_X86_PV_INFO                0x00000002U
> -#define REC_TYPE_X86_PV_P2M_FRAMES          0x00000003U
> -#define REC_TYPE_X86_PV_VCPU_BASIC          0x00000004U
> -#define REC_TYPE_X86_PV_VCPU_EXTENDED       0x00000005U
> -#define REC_TYPE_X86_PV_VCPU_XSAVE          0x00000006U
> -#define REC_TYPE_SHARED_INFO                0x00000007U
> -#define REC_TYPE_X86_TSC_INFO               0x00000008U
> -#define REC_TYPE_HVM_CONTEXT                0x00000009U
> -#define REC_TYPE_HVM_PARAMS                 0x0000000aU
> -#define REC_TYPE_TOOLSTACK                  0x0000000bU
> -#define REC_TYPE_X86_PV_VCPU_MSRS           0x0000000cU
> -#define REC_TYPE_VERIFY                     0x0000000dU
> -#define REC_TYPE_CHECKPOINT                 0x0000000eU
> -#define REC_TYPE_CHECKPOINT_DIRTY_PFN_LIST  0x0000000fU
> -
> -#define REC_TYPE_OPTIONAL             0x80000000U
> -
> -/* PAGE_DATA */
> -struct xc_sr_rec_page_data_header
> -{
> -    uint32_t count;
> -    uint32_t _res1;
> -    uint64_t pfn[0];
> -};
> -
> -#define PAGE_DATA_PFN_MASK  0x000fffffffffffffULL
> -#define PAGE_DATA_TYPE_MASK 0xf000000000000000ULL
> -
> -/* X86_PV_INFO */
> -struct xc_sr_rec_x86_pv_info
> -{
> -    uint8_t guest_width;
> -    uint8_t pt_levels;
> -    uint8_t _res[6];
> -};
> -
> -/* X86_PV_P2M_FRAMES */
> -struct xc_sr_rec_x86_pv_p2m_frames
> -{
> -    uint32_t start_pfn;
> -    uint32_t end_pfn;
> -    uint64_t p2m_pfns[0];
> -};
> -
> -/* X86_PV_VCPU_{BASIC,EXTENDED,XSAVE,MSRS} */
> -struct xc_sr_rec_x86_pv_vcpu_hdr
> -{
> -    uint32_t vcpu_id;
> -    uint32_t _res1;
> -    uint8_t context[0];
> -};
> -
> -/* X86_TSC_INFO */
> -struct xc_sr_rec_x86_tsc_info
> -{
> -    uint32_t mode;
> -    uint32_t khz;
> -    uint64_t nsec;
> -    uint32_t incarnation;
> -    uint32_t _res1;
> -};
> -
> -/* HVM_PARAMS */
> -struct xc_sr_rec_hvm_params_entry
> -{
> -    uint64_t index;
> -    uint64_t value;
> -};
> -
> -struct xc_sr_rec_hvm_params
> -{
> -    uint32_t count;
> -    uint32_t _res1;
> -    struct xc_sr_rec_hvm_params_entry param[0];
> -};
> -
>  #endif
>  /*
>   * Local variables:
> diff --git a/xen/include/Makefile b/xen/include/Makefile
> index c3e0283d34..9161716e8f 100644
> --- a/xen/include/Makefile
> +++ b/xen/include/Makefile
> @@ -101,7 +101,7 @@ all: headers.chk headers99.chk headers++.chk
>  PUBLIC_HEADERS := $(filter-out public/arch-% public/dom0_ops.h,
> $(wildcard public/*.h public/*/*.h) $(public-y))
> 
>  PUBLIC_C99_HEADERS := public/io/9pfs.h public/io/pvcalls.h
> -PUBLIC_ANSI_HEADERS := $(filter-out public/%ctl.h public/xsm/%
> public/%hvm/save.h $(PUBLIC_C99_HEADERS), $(PUBLIC_HEADERS))
> +PUBLIC_ANSI_HEADERS := $(filter-out public/%ctl.h
> public/migration_stream.h public/xsm/% public/%hvm/save.h
> $(PUBLIC_C99_HEADERS), $(PUBLIC_HEADERS))
> 
>  public/io/9pfs.h-prereq := string
>  public/io/pvcalls.h-prereq := string
> diff --git a/xen/include/public/migration_stream.h
> b/xen/include/public/migration_stream.h
> new file mode 100644
> index 0000000000..de5b736362
> --- /dev/null
> +++ b/xen/include/public/migration_stream.h
> @@ -0,0 +1,125 @@
> +#ifndef __XEN_MIGRATION_STREAM_H__
> +#define __XEN_MIGRATION_STREAM_H__
> +
> +#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
> +#error "Migration stream definitions are intended for use by node control
> tools only"
> +#endif
> +
> +/*
> + * C structures for the Migration and Live Update.
> + * See docs/specs/libxc-migration-stream.pandoc
> + */
> +
> +#include "xen.h"
> +
> +/*
> + * The domain types are used in the libxc stream domain header and will
> also
> + * be used in corresponding records for live update.
> + */
> +#define DHDR_TYPE_X86_PV  0x00000001U
> +#define DHDR_TYPE_X86_HVM 0x00000002U
> +
> +/*
> + * Record Header
> + */
> +struct mr_rhdr
> +{
> +    uint32_t type;
> +    uint32_t length;
> +};
> +
> +/* All records must be aligned up to an 8 octet boundary */
> +#define REC_ALIGN_ORDER               (3U)
> +/* Somewhat arbitrary - 128MB */
> +#define REC_LENGTH_MAX                (128U << 20)
> +
> +#define REC_TYPE_END                        0x00000000U
> +#define REC_TYPE_PAGE_DATA                  0x00000001U
> +#define REC_TYPE_X86_PV_INFO                0x00000002U
> +#define REC_TYPE_X86_PV_P2M_FRAMES          0x00000003U
> +#define REC_TYPE_X86_PV_VCPU_BASIC          0x00000004U
> +#define REC_TYPE_X86_PV_VCPU_EXTENDED       0x00000005U
> +#define REC_TYPE_X86_PV_VCPU_XSAVE          0x00000006U
> +#define REC_TYPE_SHARED_INFO                0x00000007U
> +#define REC_TYPE_X86_TSC_INFO               0x00000008U
> +#define REC_TYPE_HVM_CONTEXT                0x00000009U
> +#define REC_TYPE_HVM_PARAMS                 0x0000000aU
> +#define REC_TYPE_TOOLSTACK                  0x0000000bU
> +#define REC_TYPE_X86_PV_VCPU_MSRS           0x0000000cU
> +#define REC_TYPE_VERIFY                     0x0000000dU
> +#define REC_TYPE_CHECKPOINT                 0x0000000eU
> +#define REC_TYPE_CHECKPOINT_DIRTY_PFN_LIST  0x0000000fU
> +
> +#define REC_TYPE_OPTIONAL             0x80000000U
> +#define REC_TYPE_LIVE_UPDATE          0x40000000U
> +
> +/* PAGE_DATA */
> +struct mr_page_data_header
> +{
> +    uint32_t count;
> +    uint32_t _res1;
> +    uint64_t pfn[0];
> +};
> +
> +#define PAGE_DATA_PFN_MASK  0x000fffffffffffffULL
> +#define PAGE_DATA_TYPE_MASK 0xf000000000000000ULL
> +
> +/* X86_PV_INFO */
> +struct mr_x86_pv_info
> +{
> +    uint8_t guest_width;
> +    uint8_t pt_levels;
> +    uint8_t _res[6];
> +};
> +
> +/* X86_PV_P2M_FRAMES */
> +struct mr_x86_pv_p2m_frames
> +{
> +    uint32_t start_pfn;
> +    uint32_t end_pfn;
> +    uint64_t p2m_pfns[0];
> +};
> +
> +/* X86_PV_VCPU_{BASIC,EXTENDED,XSAVE,MSRS} */
> +struct mr_x86_pv_vcpu_hdr
> +{
> +    uint32_t vcpu_id;
> +    uint32_t _res1;
> +    uint8_t context[0];
> +};
> +
> +/* X86_TSC_INFO */
> +struct mr_x86_tsc_info
> +{
> +    uint32_t mode;
> +    uint32_t khz;
> +    uint64_t nsec;
> +    uint32_t incarnation;
> +    uint32_t _res1;
> +};
> +
> +/* HVM_PARAMS */
> +struct mr_hvm_params_entry
> +{
> +    uint64_t index;
> +    uint64_t value;
> +};
> +
> +struct mr_hvm_params
> +{
> +    uint32_t count;
> +    uint32_t _res1;
> +    struct mr_hvm_params_entry param[0];
> +};
> +
> +#endif /* __XEN_MIGRATION_STREAM_H__ */
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * tab-width: 4
> + * indent-tabs-mode: nil
> + * End:
> + */

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.