[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC XEN v1 05/14] xen: arm: Implement basic XEN_DOMCTL_{set, get}hvmcontext support
On Wed, 9 Dec 2015, Ian Campbell wrote: > This is just the minimally required basic infra and header, no actual > useful data is saved yet. > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > --- > xen/arch/arm/Makefile | 1 + > xen/arch/arm/domctl.c | 74 > ++++++++++++++++++++++++++++++++++ > xen/arch/arm/save.c | 53 ++++++++++++++++++++++++ > xen/common/Makefile | 2 + > xen/include/asm-arm/hvm/support.h | 25 ++++++++++++ > xen/include/public/arch-arm/hvm/save.h | 17 ++++++++ > 6 files changed, 172 insertions(+) > create mode 100644 xen/arch/arm/save.c > create mode 100644 xen/include/asm-arm/hvm/support.h > > diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile > index 4ac5edd..5a96486 100644 > --- a/xen/arch/arm/Makefile > +++ b/xen/arch/arm/Makefile > @@ -40,6 +40,7 @@ obj-y += device.o > obj-y += decode.o > obj-y += processor.o > obj-y += smc.o > +obj-y += save.o > > #obj-bin-y += ....o > > diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c > index d3459ee..3403e23 100644 > --- a/xen/arch/arm/domctl.c > +++ b/xen/arch/arm/domctl.c > @@ -12,6 +12,7 @@ > #include <xen/hypercall.h> > #include <xen/iocap.h> > #include <xsm/xsm.h> > +#include <xen/hvm/save.h> > #include <xen/guest_access.h> > #include <public/domctl.h> > > @@ -134,6 +135,79 @@ long arch_do_domctl(struct xen_domctl *domctl, struct > domain *d, > break; > } > > + case XEN_DOMCTL_sethvmcontext: > + { > + struct hvm_domain_context c = { .size = domctl->u.hvmcontext.size }; if ( d == currend->domain ) return some_kind_of_error; ? > + if ( (c.data = xmalloc_bytes(c.size)) == NULL ) > + { > + rc = -ENOMEM; > + goto sethvmcontext_out; > + } > + > + if ( copy_from_guest(c.data, domctl->u.hvmcontext.buffer, c.size) != > 0 ) > + { > + rc = -EFAULT; > + goto sethvmcontext_out; > + } > + > + domain_pause(d); > + rc = hvm_load(d, &c); > + domain_unpause(d); > + > + sethvmcontext_out: > + if ( c.data != NULL ) > + xfree(c.data); > + > + break; > + > + } > + case XEN_DOMCTL_gethvmcontext: > + { > + struct hvm_domain_context c = { 0 }; again: if ( d == currend->domain ) return some_kind_of_error; ? > + c.size = hvm_save_size(d); > + > + if ( guest_handle_is_null(domctl->u.hvmcontext.buffer) ) > + { > + /* Client is querying for the correct buffer size */ > + domctl->u.hvmcontext.size = c.size; > + rc = 0; > + goto gethvmcontext_out; > + } > + > + /* Check that the client has a big enough buffer */ > + if ( domctl->u.hvmcontext.size < c.size ) > + { > + rc = -ENOSPC; > + goto gethvmcontext_out; > + } > + > + /* Allocate our own marshalling buffer */ > + if ( (c.data = xmalloc_bytes(c.size)) == NULL ) > + { > + rc = -ENOMEM; > + goto gethvmcontext_out; > + } > + > + domain_pause(d); > + rc = hvm_save(d, &c); > + domain_unpause(d); > + > + domctl->u.hvmcontext.size = c.cur; > + if ( copy_to_guest(domctl->u.hvmcontext.buffer, c.data, c.size) != 0 > ) > + rc = -EFAULT; > + else > + rc = 0; > + > + gethvmcontext_out: > + copyback = 1; > + > + if ( c.data != NULL ) > + xfree(c.data); > + } > + break; Actually now that I have read the patch, I think that rather than duplicating the code, we should just move the x86 implementation of XEN_DOMCTL_sethvmcontext and XEN_DOMCTL_gethvmcontext to common code. The differences are negligible. > case XEN_DOMCTL_getpageframeinfo3: > { > unsigned int i; > diff --git a/xen/arch/arm/save.c b/xen/arch/arm/save.c > new file mode 100644 > index 0000000..6a1934b > --- /dev/null > +++ b/xen/arch/arm/save.c > @@ -0,0 +1,53 @@ > +/* > + * hvm/save.c: Save and restore HVM guest's emulated hardware state for ARM. > + * > + * Copyright (c) 2013, Samsung Electronics. > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along > with > + * this program; If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <asm/hvm/support.h> > +#include <public/hvm/save.h> > + > +void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr) > +{ > +} > + > +int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr) > +{ > + if ( hdr->magic != HVM_FILE_MAGIC ) > + { > + printk(XENLOG_G_ERR "HVM%d restore: bad magic number %#"PRIx32"\n", > + d->domain_id, hdr->magic); > + return -1; > + } > + > + if ( hdr->version != HVM_FILE_VERSION ) > + { > + printk(XENLOG_G_ERR "HVM%d restore: unsupported version %u\n", > + d->domain_id, hdr->version); > + return -1; > + } > + > + return 0; > +} > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/xen/common/Makefile b/xen/common/Makefile > index 3547c8e..ce8078f 100644 > --- a/xen/common/Makefile > +++ b/xen/common/Makefile > @@ -67,6 +67,8 @@ obj-$(CONFIG_COMPAT) += $(addprefix compat/,domain.o > kernel.o memory.o multicall > > subdir-$(x86_64) += hvm > > +subdir-$(CONFIG_ARM) += hvm > + > subdir-$(coverage) += gcov > > subdir-y += libelf > diff --git a/xen/include/asm-arm/hvm/support.h > b/xen/include/asm-arm/hvm/support.h > new file mode 100644 > index 0000000..842d8a3 > --- /dev/null > +++ b/xen/include/asm-arm/hvm/support.h > @@ -0,0 +1,25 @@ > +/* > + * support.h: HVM support routines used by ARM. > + * > + * Copyright (c) 2013, Samsung Electronics > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along > with > + * this program; If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#ifndef __ASM_ARM_HVM_SUPPORT_H__ > +#define __ASM_ARM_HVM_SUPPORT_H__ > + > +#include <xen/sched.h> > +#include <xen/hvm/save.h> > + > +#endif /* __ASM_ARM_HVM_SUPPORT_H__ */ Interestingly I can compile Xen on x86_64 just fine removing the #include <asm/hvm/support.h> in xen/common/hvm/save.c. I think that is a better option than introducing this empty header file. > diff --git a/xen/include/public/arch-arm/hvm/save.h > b/xen/include/public/arch-arm/hvm/save.h > index 75b8e65..5f4de94 100644 > --- a/xen/include/public/arch-arm/hvm/save.h > +++ b/xen/include/public/arch-arm/hvm/save.h > @@ -26,6 +26,23 @@ > #ifndef __XEN_PUBLIC_HVM_SAVE_ARM_H__ > #define __XEN_PUBLIC_HVM_SAVE_ARM_H__ > > +#define HVM_FILE_MAGIC 0x92385520 Out of curiousity, how did you come up with the number? Just making sure there is no secret message in there. > +#define HVM_FILE_VERSION 0x00000001 > + > +struct hvm_save_header > +{ > + uint32_t magic; /* Must be HVM_FILE_MAGIC */ > + uint32_t version; /* File format version */ > + uint64_t changeset; /* Version of Xen that saved this file */ > +}; > + > +DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header); > + > +/* > + * Largest type-code in use > + */ > +#define HVM_SAVE_CODE_MAX 1 > + > #endif > > /* > -- > 2.6.1 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |