You could use curpsinfo->pr_dmodel is a predicate.

probe
/ curpsinfo->pr_dmodel == 1/
{
    32-bit process
}

probe
/ curpsinfo->pr_dmodel == 2/
{
    64-bit process
}


/jim


Bruce Chapman wrote:
> I had a simple D script that looks for use of the DP_POLL ioctl with a long 
> timeout for any process on the system, but I could not find an easy way to 
> determine whether to use dvpoll or dvpoll32 structures to do so.  An ugly 
> hack based upon pointer location/value works, but is clearly unacceptable 
> (this was in a single probe syscall::ioctl:entry/arg1==0xd001/ ):
>
> nfds = (dvpoll->dp_nfds > 1000000) ?    dvpoll32->dp_nfds : dvpoll->dp_nfds;
>
> Since I could find no way for DTrace to help me out here I looked at source 
> code and found that dpioctl takes a mode argument that has a bitmask which 
> will indicate DATA_MODEL, so I modified the script to use that, which works 
> and should be stable, but it seems DTrace should provide coders with it's own 
> way of determining the data_model to save people such gyrations.  Also, 
> though this script works fine on S10 FCS SPARC/x86 up to snv_86 (Indiana), it 
> fails on snv_93 (image updated Indiana - it works on a 32 kernel snv_95 
> machine but I haven't found a 64 bit snv_95 to try it on) with :
>
> dtrace: failed to compile script ./ioctl_DP_POLL.d: line 25: operands have 
> incompatible types: "dblk_t" != "union"
>
> Is this a known DTrace bug in snv_93 or just more restrictive type checking 
> (seems like a bug...if not, can someone get the script to work in snv_93?)
>
> Anyway, here's the script that works on all S10 versions through snv_86 but 
> is more complicated than it would be if DTrace had a mechanism of letting me 
> know if the binary being traced was 32 or 64 bit :
>
> #!/usr/sbin/dtrace -s
> #pragma D option quiet
>
> struct dvpoll    *      dvpoll;
> struct dvpoll32  *      dvpoll32;
>
> BEGIN {
>      printf("If timeout is -1 or big, you could get hit by bugid 6724237\n");
>      prev_timeout = -2;
>      prev_fd = prev_nfds = prev_pid = -1;
> }
> syscall::ioctl:entry /arg1 == 0xd001/ {
>      self->fd=arg0;
> }
> fbt:poll:dpioctl:entry {
>        self->bitsize64 = (arg3 & 0x00200000); /* model.h: DATA_MODEL_LP64 */
> }
> fbt:poll:dpioctl:entry /self->bitsize64/ {
>        dvpoll=copyin(arg2, sizeof(*dvpoll));
>        self->nfds = dvpoll->dp_nfds;
>        self->timeout = dvpoll->dp_timeout;
> }
> fbt:poll:dpioctl:entry /!(self->bitsize64)/ {
>        dvpoll32=copyin(arg2, sizeof(*dvpoll32));
>        self->nfds = dvpoll32->dp_nfds;     /* DTrace broken in SNV_93? */
>        self->timeout = dvpoll32->dp_timeout;
> }
> fbt:poll:dpioctl:entry
> / (self->fd != prev_fd) || (self->nfds != prev_nfds) ||
>  (self->timeout != prev_timeout) || (prev_pid != pid) /{
>        printf("%s pid=%d/%d calling ioctl(%d, DP_POLL, nfds=%d timeout=%d)\n",
>               execname, pid, tid, self->fd, self->nfds, self->timeout);
>        prev_pid = pid;
>        prev_fd = self->fd;
>        prev_nfds = self->nfds;
>        prev_timeout = self->timeout;
>        self->fd = self->nfds = self->timeout = self->bitsize64 = 0;
> }
>
>
> --
> This message posted from opensolaris.org
> _______________________________________________
> dtrace-discuss mailing list
> dtrace-discuss@opensolaris.org
>   
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to