[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


 


Rackspace

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