On Mon, Mar 15, 2010 at 12:20:35PM -0700, tester wrote:
> #!/usr/sbin/dtrace -qs
> 
>      typedef struct door_arg {
>           char             *data_ptr;     /* Argument/result buf ptr*/
>           size_t           data_size;     /* Argument/result buf size */
>           door_desc_t      *desc_ptr;     /* Argument/result descriptors */
>           uint_t           desc_num;      /* Argument/result num desc */
>           char             *rbuf;         /* Result buffer */
>           size_t           rsize;         /* Result buffer size */
>      } door_arg_t;

These declarations will use the sizes of those types as these
declarations are to be used in kernel-land.  That means that data_ptr is
a 64-bit field in kernel-land and in DTrace context.  That disagrees
with 32-bit user-land.

Use door_arg32_t as Michael Bergknoff suggests.  You'll see that
door_arg32_t uses caddr32_t instead of "<base type> *":

typedef struct door_arg32 {
        caddr32_t       data_ptr;       /* Argument/result data */
        size32_t        data_size;      /* Argument/result data size */
        caddr32_t       desc_ptr;       /* Argument/result descriptors */
        uint32_t        desc_num;       /* Argument/result num descriptors */
        caddr32_t       rbuf;           /* Result area */
        size32_t        rsize;          /* Result size */
} door_arg32_t;

caddr32_t is (in 64-bit land) an unsigned integer type rather than a
pointer type, and its size matches that of 32-bit pointer types.

Nico
-- 
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to