|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [BUGFIX][PATCH 4/4] hvm_save_one: allow the 2nd instance to be fetched for PIC.
>>> On 15.12.13 at 02:38, Don Slutz <dslutz@xxxxxxxxxxx> wrote:
> On 12/13/13 09:38, Jan Beulich wrote:
>>>>> On 12.12.13 at 01:56, Don Slutz <dslutz@xxxxxxxxxxx> wrote:
>>> @@ -114,20 +111,20 @@ int hvm_save_one(struct domain *d, uint16_t typecode,
> uint16_t instance,
>>> }
>>> else
>>> {
>>> - uint32_t off;
>>> + uint32_t off, add;
>> "add" is a pretty odd name for what this is being used for. Why
>> don't you use desc->length directly?
> I picked the name when the 3rd part of the "for" was "off += add".
> During unit
> testing that did not work and so did not try and pick a new one. I
> could have added add2:
>
> const uint32_t add2 = sizeof (struct hvm_save_descriptor);
>
> And then the last part of the for becomes "off += add + add2".
>
> I can not use desc->length because:
>
> save.c: In function 'hvm_save_one':
> save.c:120:47: error: 'desc' undeclared (first use in this function)
> save.c:120:47: note: each undeclared identifier is reported only once
> for each function it appears in
>
> (It is only defined in the body of the for).
Right - so simply move it into the next surrounding scope.
>> Which shows another shortcoming of the interface: There's no
>> buffer size being passed in from the caller, yet we have variable
>> size records. Which means latent data corruption in the caller.
> This is not 100% correct. The libxl code for
> xc_domain_hvm_getcontext_partial does take a length:
>
> /* Get just one element of the HVM guest context.
> * size must be >= HVM_SAVE_LENGTH(type) */
> int xc_domain_hvm_getcontext_partial(xc_interface *xch,
> uint32_t domid,
> uint16_t typecode,
> uint16_t instance,
> void *ctxt_buf,
> uint32_t size)
> {
Which doesn't mean anything for the hypervisor interface. Yet
that's the one I said has the limitation.
> and it gets embeded in
>
>
> DECLARE_HYPERCALL_BOUNCE(ctxt_buf, size,
> XC_HYPERCALL_BUFFER_BOUNCE_OUT);
>
> which is handle. I do not know that much about
> "XEN_GUEST_HANDLE_64(uint8) handle" and DECLARE_HYPERCALL_BOUNCE, but
> what my unit testing has shown me is that copy_to_guest(handle, <ptr>,
> <nr>) does only copy up to the size stored in handle. It looks to zero
> an unknown amount more (looks to be page sized). So there is more
> needed here.
Again, you need to split the way libxc works from the actual
hypercall: A handle _never_ tells you to how many items it
refers, there's always a second parameter required to pass
the element count (unless known by other means).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |