|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/5] xen: Enforce casting for guest_handle_cast
On 14/06 03:40, Jean Guyader wrote:
> On 14/06 03:27, Tim Deegan wrote:
> > At 15:26 +0100 on 14 Jun (1339687574), Tim Deegan wrote:
> > > At 15:08 +0100 on 14 Jun (1339686495), Jean Guyader wrote:
> > > > Maybe I should put here the reason that led me to do something
> > > > like that. Here is what I'm trying to do:
> > > >
> > > > XEN_GUEST_HANDLE (uint8_t) slop_hnd =
> > > > guest_handle_cast (pfn_list_hnd, uint8_t);
> > > > guest_handle_add_offset (slop_hnd, sizeof (v4v_pfn_list_t));
> > > > pfn_hnd = guest_handle_cast (slop_hnd, v4v_pfn_t);
> > > >
> > > > I need to cast to uint8_t first to get the add_offset to behave
> > > > correctly. Maybe what I need would need a new macro that would
> > > > do those two operations.
> > > >
> > > > What would be the proper way to doing something like this?
> > >
> > > You could avoid it altogether by dropping struct v4v_ring_data, and
> > > passing a v4v_pfn_t array directly with the 'npage' as a separate
> > > hypercall argument. AFAICS struct v4v_ring_data has no other useful
> > > fields.
> >
> > Excuse me, I meant struct v4v_pfn_list_t.
> >
>
> You probably mean both, because we doing the same thing with
> v4v_ring_data_t and v4v_ring_data_ent_t.
>
Actually I don't want to get rid of the v4v_ring_data_t struct.
The idea being this struct is that we might want to extend it in the future
so having a wrapper arround with a magic is important to detect which
version of the struct is being used.
Here are the structs:
typedef struct v4v_ring_data_ent
{
struct v4v_addr ring;
uint16_t flags;
uint16_t pad0;
uint32_t space_required;
uint32_t max_message_size;
} v4v_ring_data_ent_t;
DEFINE_XEN_GUEST_HANDLE (v4v_ring_data_ent_t);
typedef struct v4v_ring_data
{
uint64_t magic;
uint32_t nent;
uint32_t padding;
uint64_t reserved[4];
v4v_ring_data_ent_t ring[0];
} v4v_ring_data_t;
DEFINE_XEN_GUEST_HANDLE (v4v_ring_data_t);
I get a XEN_GUEST_HANDLE(v4v_ring_data_t) as argument of my hypercall and I
would
like to access the ring data inside it which is a XEN_GUEST_HANDLE as well.
Here is the code that I use for doing that (with explicte cast in
guest_handle_cast):
XEN_GUEST_HANDLE (v4v_ring_data_ent_t) ring_data_ent_hnd;
XEN_GUEST_HANDLE (uint8_t) slop_hnd =
guest_handle_cast (ring_data_hnd, uint8_t);
guest_handle_add_offset (slop_hnd, sizeof (v4v_ring_data_t));
ring_data_ent_hnd =
guest_handle_cast (slop_hnd, v4v_ring_data_ent_t);
ret = v4v_fill_ring_datas (d, ring_data.nent, ring_data_ent_hnd);
Thanks for your help.
Jean
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |