From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: [PATCH 4/5] xen: Enforce casting for guest_handle_cast Date: Mon, 18 Jun 2012 12:36:12 +0100 Message-ID: <4FDF2ECC020000780008A6AF@nat28.tlf.novell.com> 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> <20120614153913.GC24063@spongy> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20120614153913.GC24063@spongy> Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jean Guyader Cc: "Tim (Xen.org)" , "xen-devel@lists.xen.org" List-Id: xen-devel@lists.xenproject.org >>> On 14.06.12 at 17:39, Jean Guyader wrote: > 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); Something as simple as #define guest_handle_for_field(hnd, type, fld) \ ((XEN_GUEST_HANDLE(type)) { &(hnd).p->fld }) works quite fine for me is an example like int v4v_test(struct domain *d, XEN_GUEST_HANDLE(v4v_ring_data_t) urp) { v4v_ring_data_t ring_data; XEN_GUEST_HANDLE(v4v_ring_data_ent_t) ring_data_ent_hnd; copy_from_guest(&ring_data, urp, 1); ring_data_ent_hnd = guest_handle_for_field(urp, v4v_ring_data_ent_t, ring[0]); return v4v_fill_ring_datas(d, ring_data.nent, ring_data_ent_hnd); } Jan