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