From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean Guyader Subject: Re: [PATCH 4/5] xen: Enforce casting for guest_handle_cast Date: Thu, 14 Jun 2012 16:39:13 +0100 Message-ID: <20120614153913.GC24063@spongy> References: <1338476832-26653-1-git-send-email-jean.guyader@citrix.com> <1338476832-26653-5-git-send-email-jean.guyader@citrix.com> <4FC7AEBD020000780008774C@nat28.tlf.novell.com> <20120614140815.GB22025@spongy> <20120614142614.GE90181@ocelot.phlegethon.org> <20120614142751.GF90181@ocelot.phlegethon.org> <20120614144008.GA24063@spongy> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <20120614144008.GA24063@spongy> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: "Tim (Xen.org)" Cc: Jan Beulich , "xen-devel@lists.xen.org" List-Id: xen-devel@lists.xenproject.org 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