From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wen Congyang Subject: Re: [Patch v6 11/13] tools/libxc: x86 HVM restore code Date: Fri, 18 Jul 2014 22:38:50 +0800 Message-ID: <53C9317A.9090701@gmail.com> References: <1404754682-28379-1-git-send-email-andrew.cooper3@citrix.com> <1404754682-28379-12-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1404754682-28379-12-git-send-email-andrew.cooper3@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Andrew Cooper , Xen-devel List-Id: xen-devel@lists.xenproject.org At 2014/7/8 1:38, Andrew Cooper Wrote: > Restore the x86 HVM specific parts of a domain. This is the HVM_CONTEXT and > HVM_PARAMS records. > > There is no need for any page localisation. > > This also includes writing the trailing qemu save record to a file because > this is what libxc currently does. This is intended to be moved into libxl > proper in the future. > > Signed-off-by: Andrew Cooper > --- > tools/libxc/saverestore/common.h | 1 + > tools/libxc/saverestore/restore_x86_hvm.c | 336 +++++++++++++++++++++++++++++ > 2 files changed, 337 insertions(+) > create mode 100644 tools/libxc/saverestore/restore_x86_hvm.c > > diff --git a/tools/libxc/saverestore/common.h b/tools/libxc/saverestore/common.h > index 8d125f9..4894cac 100644 > --- a/tools/libxc/saverestore/common.h > +++ b/tools/libxc/saverestore/common.h > @@ -241,6 +241,7 @@ extern struct xc_sr_save_ops save_ops_x86_pv; > extern struct xc_sr_save_ops save_ops_x86_hvm; > > extern struct xc_sr_restore_ops restore_ops_x86_pv; > +extern struct xc_sr_restore_ops restore_ops_x86_hvm; > > struct xc_sr_record > { > diff --git a/tools/libxc/saverestore/restore_x86_hvm.c b/tools/libxc/saverestore/restore_x86_hvm.c > new file mode 100644 > index 0000000..0004dee > --- /dev/null > +++ b/tools/libxc/saverestore/restore_x86_hvm.c > @@ -0,0 +1,336 @@ > +#include > +#include > + > +#include "common_x86.h" > + > +/* TODO: remove */ > +static int handle_toolstack(struct xc_sr_context *ctx, struct xc_sr_record *rec) > +{ > + xc_interface *xch = ctx->xch; > + int rc; > + > + if ( !ctx->restore.callbacks || !ctx->restore.callbacks->toolstack_restore ) > + return 0; > + > + rc = ctx->restore.callbacks->toolstack_restore(ctx->domid, rec->data, rec->length, > + ctx->restore.callbacks->data); > + if ( rc < 0 ) > + PERROR("restoring toolstack"); > + return rc; > +} > + > +/* > + * Process an HVM_CONTEXT record from the stream. > + */ > +static int handle_hvm_context(struct xc_sr_context *ctx, struct xc_sr_record *rec) > +{ > + xc_interface *xch = ctx->xch; > + int rc; > + > + rc = xc_domain_hvm_setcontext(xch, ctx->domid, rec->data, rec->length); > + if ( rc < 0 ) > + PERROR("Unable to restore HVM context"); > + return rc; > +} > + > +/* > + * Process an HVM_PARAMS record from the stream. > + */ > +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; > + unsigned int i; > + int rc; > + > + if ( rec->length < sizeof(*hdr) > + || rec->length < sizeof(*hdr) + hdr->count * sizeof(*entry) ) > + { > + ERROR("hvm_params record is too short"); > + return -1; > + } > + > + for ( i = 0; i < hdr->count; i++, entry++ ) > + { > + switch ( entry->index ) > + { > + case HVM_PARAM_CONSOLE_PFN: > + ctx->restore.console_mfn = entry->value; > + xc_clear_domain_page(xch, ctx->domid, entry->value); > + break; > + case HVM_PARAM_STORE_PFN: > + ctx->restore.xenstore_mfn = entry->value; > + xc_clear_domain_page(xch, ctx->domid, entry->value); > + break; > + case HVM_PARAM_IOREQ_PFN: > + case HVM_PARAM_BUFIOREQ_PFN: > + xc_clear_domain_page(xch, ctx->domid, entry->value); ioreq page may contain pending i/o request, so I think we should not clear them. Thanks Wen Congyang > + break; > + } > + > + rc = xc_set_hvm_param(xch, ctx->domid, entry->index, entry->value); > + if ( rc < 0 ) > + { > + PERROR("set HVM param %"PRId64" = 0x%016"PRIx64, > + entry->index, entry->value); > + return rc; > + } > + } > + return 0; > +} > +