[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 |