[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] libxl: save/restore qemu's physmap
On Fri, 2012-01-20 at 11:18 +0000, Stefano Stabellini wrote: > Read Qemu's physmap from xenstore and save it using toolstack_save. > Restore Qemu's physmap using toolstack_restore. Shall we have a version field now so we don't dig ourselves a hole we can't get out of? > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > --- > tools/libxl/libxl_dom.c | 132 > ++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 131 insertions(+), 1 deletions(-) > > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c > index fd2b051..3d60a35 100644 > --- a/tools/libxl/libxl_dom.c > +++ b/tools/libxl/libxl_dom.c > @@ -347,6 +347,62 @@ out: > return rc; > } > > +static int libxl__toolstack_restore(uint32_t domid, uint8_t *buf, > + uint32_t size, void *data) > +{ > + libxl__gc *gc = (libxl__gc *) data; > + int i, ret; > + uint8_t *ptr = buf; > + uint32_t namelen = 0; > + char *name = NULL; > + uint32_t count = 0; > + uint64_t phys_offset_v = 0, start_addr_v = 0, size_v = 0; > + > + if (size < sizeof(count)) > + return -1; > + > + memcpy(&count, ptr, sizeof(count)); > + ptr += sizeof(count); > + > + if (size < > + sizeof(count) + count * (sizeof(uint64_t) * 3 + > sizeof(uint32_t))) > + return -1; > + > + for (i = 0; i < count; i++) { > + memcpy(&namelen, ptr, sizeof(namelen)); > + ptr += sizeof(namelen); > + if (namelen > 0) { > + name = (char *)ptr; > + ptr += namelen; > + } > + memcpy(&phys_offset_v, ptr, sizeof(uint64_t)); > + ptr += sizeof(uint64_t); > + memcpy(&start_addr_v, ptr, sizeof(uint64_t)); > + ptr += sizeof(uint64_t); > + memcpy(&size_v, ptr, sizeof(uint64_t)); > + ptr += sizeof(uint64_t); Why not define a struct libxl__physmap_info for these three? You could even do the trick with the "char name[]" at the end and incorporate namelen too if you wanted. The maximum size of the allocation is sizeof(count) + count * (sizeof(uint64_t) * 3 + sizeof(uint32_t))) here but in the save it is allocating: sizeof(count) + count * (sizeof(val) * 3 + sizeof(namelen)); these work out the same but it would be more obviously correct if it were "count * sizeof(struct)" Actually, hang on where is the space for name itself allocated? I see, you are reallocing. If you have to do that anyway you may as well start off with just sizeof(count) and realloc namelen + sizeof(struct) at each stage. > + > + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc, > + > "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr", > + domid, phys_offset_v), "%"PRIx64, start_addr_v); > + if (ret) > + return -1; > + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc, > + "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size", > + domid, phys_offset_v), "%"PRIx64, size_v); > + if (ret) > + return -1; > + if (namelen > 0) { > + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc, > + > "/local/domain/0/device-model/%d/physmap/%"PRIx64"/name", > + domid, phys_offset_v), "%s", name); > + if (ret) > + return -1; > + } > + } > + return 0; > +} > + > int libxl__domain_restore_common(libxl__gc *gc, uint32_t domid, > libxl_domain_build_info *info, > libxl__domain_build_state *state, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |