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
[email protected]