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

Re: [Xen-devel] [PATCH 2/3] xenoprof: Handle 32-bit guest stacks properly in a 64-bit hypervisor

On 23/01/12 09:50, Jan Beulich wrote:
If you're adding a compat mode guest case here, then you should
also use compat mode accessors (compat_handle_okay(),
__copy_from_compat_offset()), implying that you also have a local
handle variable of the appropriate type (and perhaps moving the
native one down into the 'else' body).

I'm trying to understand the compat handle. It is not clear to me how to map one from head (a 64-bit pointer), since COMPAT_HANDLE seems to store a 32-bit compat_ptr_t value in its structure. Ideally, what I would like to do is

COMPAT_HANDLE(char) guest_head = map_guest_handle_to_compat_handle (guest_handle_from_ptr(head, char));
COMPAT_HANDLE(char) guest_head = compat_handle_from_ptr(head, char));
but I can't find any equivalent functions in any header.

The following line compiles,
COMPAT_HANDLE(char) guest_head = { (full_ptr_t)head };
but it looks like, in this case, the compat handle structure in compat.h will truncate the most significant bits from the head pointer, so compat_handle_okay(guest_head,...) and __copy_from_compat(...,guest_head,...) below will be using a truncated pointer:

     56 static struct frame_head *
     57 dump_guest_backtrace(struct domain *d, struct vcpu *vcpu,
     58                      struct frame_head * head, int mode)
     59 {
     60     struct frame_head bufhead[2];
     62 #ifdef CONFIG_X86_64
     63     if ( is_32bit_vcpu(vcpu) )
     64     {
     65         COMPAT_HANDLE(char) guest_head = { (full_ptr_t)head };
     66         struct frame_head_32bit bufhead32[2];
67 /* Also check accessibility of one struct frame_head beyond */
     68         if (!compat_handle_okay(guest_head, sizeof(bufhead32)))
     69             return 0;
     70         if (__copy_from_compat((char *)bufhead32, guest_head,
     71                                      sizeof(bufhead32)))
     72             return 0;
73 bufhead[0].ebp=(struct frame_head *)(full_ptr_t)bufhead32[0].ebp;
     74         bufhead[0].ret=bufhead32[0].ret;
     75     }
     76     else
     77 #endif

Any advice? Maybe the best option in this case is to avoid the compat* functions and to use the original guest* functions instead.


Xen-devel mailing list



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