Beispiel #1
0
/*
 * munmap() system call -- executed by subject process
 */
int
pr_munmap(struct ps_prochandle *Pr, void *addr, size_t len)
{
	sysret_t rval;			/* return value from munmap() */
	argdes_t argd[2];		/* arg descriptors for munmap() */
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (munmap(addr, len));

	adp = &argd[0];		/* addr argument */
	adp->arg_value = (long)addr;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* len argument */
	adp->arg_value = (long)len;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_munmap, 2, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
	return (rval.sys_rval1);
}
Beispiel #2
0
/*
 * lwp_exit() system call -- executed by subject lwp.
 */
int
pr_lwp_exit(struct ps_prochandle *Pr)
{
	sysret_t rval;			/* return value from lwp_exit() */
	int error;

	if (Pr == NULL) {		/* no subject process */
		(void) syscall(SYS_lwp_exit);
		return (0);		/* not reached */
	}

	error = Psyscall(Pr, &rval, SYS_lwp_exit, 0, NULL);
	/* actually -- never returns.  Expect ENOENT */

	if (error < 0) {
		if (errno == ENOENT)	/* expected case */
			error = ENOENT;
		else
			error = ENOSYS;
	}

	if (error == 0)		/* can't happen? */
		return (rval.sys_rval1);

	if (error == ENOENT)	/* expected case */
		return (0);

	errno = error;
	return (-1);
}
Beispiel #3
0
projid_t
pr_getprojid(struct ps_prochandle *Pr)
{
	sysret_t rval;
	argdes_t argd[1];
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (getprojid());

	adp = &argd[0];
	adp->arg_value = 2;	/* switch for getprojid in tasksys */
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_tasksys, 1, &argd[0]);

	if (error) {
		errno = (error > 0) ? error : ENOSYS;
		return (-1);
	}
	return (rval.sys_rval1);
}
Beispiel #4
0
zoneid_t
pr_getzoneid(struct ps_prochandle *Pr)
{
	sysret_t rval;
	argdes_t argd[2];
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (getzoneid());

	adp = &argd[0];
	adp->arg_value = 6;	/* switch for zone_lookup in zone */
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp = &argd[1];
	adp->arg_value = 0;	/* arguement for zone_lookup in zone */
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_zone, 2, &argd[0]);

	if (error) {
		errno = (error > 0) ? error : ENOSYS;
		return (-1);
	}
	return (rval.sys_rval1);
}
Beispiel #5
0
int
pr_door_info(struct ps_prochandle *Pr, int did, door_info_t *di)
{
	sysret_t rval;			/* return value from door_info() */
	argdes_t argd[6];		/* arg descriptors for door_info() */
	argdes_t *adp = &argd[0];	/* first argument */
	int error;

	if (Pr == NULL)		/* no subject process */
		return (door_info(did, di));

	adp->arg_value = did;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to door_info_t argument */

	adp->arg_value = 0;
	adp->arg_object = di;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_OUTPUT;
	adp->arg_size = sizeof (door_info_t);
	adp++;			/* move to unused argument */

	adp->arg_value = 0;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to unused argument */

	adp->arg_value = 0;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to unused argument */

	adp->arg_value = 0;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to subcode argument */

	adp->arg_value = DOOR_INFO;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_door, 6, &argd[0]);

	if (error) {
		errno = (error < 0)? ENOSYS : error;
		return (-1);
	}
	return (0);
}
int
pr_getsockopt(struct ps_prochandle *Pr,
	int sock, int level, int optname, void *optval, int *optlen)
{
	sysret_t rval;		/* return value from getsockopt() */
	argdes_t argd[5];	/* arg descriptors for getsockopt() */
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (_so_getsockopt(sock, level, optname, optval, optlen));

	adp = &argd[0];		/* sock argument */
	adp->arg_value = sock;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* level argument */
	adp->arg_value = level;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* optname argument */
	adp->arg_value = optname;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* optval argument */
	adp->arg_value = 0;
	adp->arg_object = optval;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_OUTPUT;
	adp->arg_size = optlen == NULL ? 0 : *optlen;

	adp++;			/* optlen argument */
	adp->arg_value = 0;
	adp->arg_object = optlen;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_INOUT;
	adp->arg_size = sizeof (*optlen);

	error = Psyscall(Pr, &rval, SYS_getsockopt, 5, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
	return (0);
}
Beispiel #7
0
int
pr_processor_bind(struct ps_prochandle *Pr, idtype_t idtype, id_t id,
                  int processorid, int *obind)
{
    sysret_t rval;			/* return value */
    argdes_t argd[4];		/* arg descriptors */
    argdes_t *adp = &argd[0];	/* first argument */
    int error;

    if (Pr == NULL)		/* no subject process */
        return (processor_bind(idtype, id, processorid, obind));

    adp->arg_value = idtype;	/* idtype */
    adp->arg_object = NULL;
    adp->arg_type = AT_BYVAL;
    adp->arg_inout = AI_INPUT;
    adp->arg_size = 0;
    adp++;

    adp->arg_value = id;		/* id */
    adp->arg_object = NULL;
    adp->arg_type = AT_BYVAL;
    adp->arg_inout = AI_INPUT;
    adp->arg_size = 0;
    adp++;

    adp->arg_value = processorid;	/* processorid */
    adp->arg_object = NULL;
    adp->arg_type = AT_BYVAL;
    adp->arg_inout = AI_INPUT;
    adp->arg_size = 0;
    adp++;

    if (obind == NULL) {
        adp->arg_value = 0;	/* obind */
        adp->arg_object = NULL;
        adp->arg_type = AT_BYVAL;
        adp->arg_inout = AI_INPUT;
        adp->arg_size = 0;
    } else {
        adp->arg_value = 0;
        adp->arg_object = obind;
        adp->arg_type = AT_BYREF;
        adp->arg_inout = AI_INOUT;
        adp->arg_size = sizeof (int);
    }

    error = Psyscall(Pr, &rval, SYS_processor_bind, 4, &argd[0]);

    if (error) {
        errno = (error < 0)? ENOSYS : error;
        return (-1);
    }
    return (rval.sys_rval1);
}
Beispiel #8
0
/*
 * statvfs() system call -- executed by subject process
 */
int
pr_statvfs(struct ps_prochandle *Pr, const char *path, statvfs_t *buf)
{
	sysret_t rval;			/* return value from statvfs() */
	argdes_t argd[2];		/* arg descriptors for statvfs() */
	argdes_t *adp = &argd[0];	/* first argument */
	int error;
#ifdef _LP64
	statvfs32_t statvfs32;
#endif	/* _LP64 */

	if (Pr == NULL)		/* no subject process */
		return (statvfs(path, buf));

	adp->arg_value = 0;
	adp->arg_object = (void *)path;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = strlen(path)+1;
	adp++;			/* move to buffer argument */

	adp->arg_value = 0;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_OUTPUT;
#ifdef _LP64
	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_ILP32) {
		adp->arg_object = &statvfs32;
		adp->arg_size = sizeof (statvfs32);
	} else {
		adp->arg_object = buf;
		adp->arg_size = sizeof (*buf);
	}
#else	/* _LP64 */
	adp->arg_object = buf;
	adp->arg_size = sizeof (*buf);
#endif	/* _LP64 */

	error = Psyscall(Pr, &rval, SYS_statvfs, 2, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
#ifdef _LP64
	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_ILP32)
		statvfs_32_to_n(&statvfs32, buf);
#endif	/* _LP64 */
	return (0);
}
Beispiel #9
0
/*
 * ioctl() system call -- executed by subject process.
 */
int
pr_ioctl(struct ps_prochandle *Pr, int fd, int code, void *buf, size_t size)
{
	sysret_t rval;			/* return value from ioctl() */
	argdes_t argd[3];		/* arg descriptors for ioctl() */
	argdes_t *adp = &argd[0];	/* first argument */
	int error;

	if (Pr == NULL)		/* no subject process */
		return (ioctl(fd, code, buf));

	adp->arg_value = fd;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to code argument */

	adp->arg_value = code;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to buffer argument */

	if (size == 0) {
		adp->arg_value = (long)buf;
		adp->arg_object = NULL;
		adp->arg_type = AT_BYVAL;
		adp->arg_inout = AI_INPUT;
		adp->arg_size = 0;
	} else {
		adp->arg_value = 0;
		adp->arg_object = buf;
		adp->arg_type = AT_BYREF;
		adp->arg_inout = AI_INOUT;
		adp->arg_size = size;
	}

	error = Psyscall(Pr, &rval, SYS_ioctl, 3, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
	return (rval.sys_rval1);
}
Beispiel #10
0
static int
get_sock_peer_name(struct ps_prochandle *Pr,
	int syscall, int sock, struct sockaddr *name, socklen_t *namelen)
{
	sysret_t rval;		/* return value from get{sock|peer}name() */
	argdes_t argd[4];	/* arg descriptors for get{sock|peer}name() */
	argdes_t *adp;
	int error;

	adp = &argd[0];		/* sock argument */
	adp->arg_value = sock;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* name argument */
	adp->arg_value = 0;
	adp->arg_object = name;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_OUTPUT;
	adp->arg_size = *namelen;

	adp++;			/* namelen argument */
	adp->arg_value = 0;
	adp->arg_object = namelen;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_INOUT;
	adp->arg_size = sizeof (*namelen);

	adp++;			/* version argument */
	adp->arg_value = SOV_DEFAULT;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, syscall, 4, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
	return (0);
}
Beispiel #11
0
taskid_t
pr_settaskid(struct ps_prochandle *Pr, projid_t project, int flags)
{
	sysret_t rval;
	argdes_t argd[3];
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* No subject process */
		return (settaskid(project, flags));

	adp = &argd[0];
	adp->arg_value = 0;	/* switch for settaskid in tasksys */
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;
	adp->arg_value = project;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = sizeof (project);

	adp++;
	adp->arg_value = flags;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_tasksys, 3, &argd[0]);

	if (error) {
		errno = (error > 0) ? error : ENOSYS;
		return (-1);
	}
	return (rval.sys_rval1);
}
Beispiel #12
0
/*
 * exit() system call -- executed by subject process.
 */
int
pr_exit(struct ps_prochandle *Pr, int status)
{
	sysret_t rval;			/* return value from exit() */
	argdes_t argd[1];		/* arg descriptors for exit() */
	argdes_t *adp;
	int error;

	if (Pr == NULL) {		/* no subject process */
		exit(status);
		return (0);		/* not reached */
	}

	adp = &argd[0];		/* status argument */
	adp->arg_value = status;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_exit, 1, &argd[0]);
	/* actually -- never returns.  Expect ENOENT */

	if (error < 0) {
		if (errno == ENOENT)	/* expected case */
			error = ENOENT;
		else
			error = ENOSYS;
	}

	if (error == 0)		/* can't happen? */
		return (rval.sys_rval1);

	if (error == ENOENT)	/* expected case */
		return (0);

	errno = error;
	return (-1);
}
Beispiel #13
0
/*
 * mmap() system call -- executed by subject process
 */
void *
pr_mmap(struct ps_prochandle *Pr,
	void *addr, size_t len, int prot, int flags, int fd, off_t off)
{
	sysret_t rval;			/* return value from mmap() */
	argdes_t argd[6];		/* arg descriptors for mmap() */
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (mmap(addr, len, prot, flags, fd, off));

	adp = &argd[0];		/* addr argument */
	adp->arg_value = (long)addr;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* len argument */
	adp->arg_value = (long)len;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* prot argument */
	adp->arg_value = (long)prot;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* flags argument */
	adp->arg_value = (long)(_MAP_NEW|flags);
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* fd argument */
	adp->arg_value = (long)fd;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* off argument */
	adp->arg_value = (long)off;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_mmap, 6, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return ((void *)(-1));
	}
	return ((void *)rval.sys_rval1);
}
Beispiel #14
0
/*
 * lseek() system call -- executed by subject process.
 */
off_t
pr_lseek(struct ps_prochandle *Pr, int filedes, off_t offset, int whence)
{
	int syscall;		/* SYS_lseek or SYS_llseek */
	int nargs;		/* 3 or 4, depending on syscall */
	offsets_t off;
	sysret_t rval;		/* return value from lseek() */
	argdes_t argd[4];	/* arg descriptors for lseek() */
	argdes_t *adp;
	int error;

	if (Pr == NULL)
		return (lseek(filedes, offset, whence));

	adp = &argd[0];		/* filedes argument */
	adp->arg_value = filedes;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* offset argument */
	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_NATIVE) {
		syscall = SYS_lseek;
		nargs = 3;
		adp->arg_value = offset;
		adp->arg_object = NULL;
		adp->arg_type = AT_BYVAL;
		adp->arg_inout = AI_INPUT;
		adp->arg_size = 0;
	} else {
		syscall = SYS_llseek;
		nargs = 4;
		off.full = offset;
		adp->arg_value = off.half[0];	/* first 32 bits */
		adp->arg_object = NULL;
		adp->arg_type = AT_BYVAL;
		adp->arg_inout = AI_INPUT;
		adp->arg_size = 0;
		adp++;
		adp->arg_value = off.half[1];	/* second 32 bits */
		adp->arg_object = NULL;
		adp->arg_type = AT_BYVAL;
		adp->arg_inout = AI_INPUT;
		adp->arg_size = 0;
	}

	adp++;			/* whence argument */
	adp->arg_value = whence;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, syscall, nargs, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return ((off_t)(-1));
	}

	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_NATIVE)
		offset = rval.sys_rval1;
	else {
		off.half[0] = (uint32_t)rval.sys_rval1;
		off.half[1] = (uint32_t)rval.sys_rval2;
		offset = (off_t)off.full;
	}

	return (offset);
}
Beispiel #15
0
int
pr_memcntl(struct ps_prochandle *Pr,
	caddr_t addr, size_t len, int cmd, caddr_t arg, int attr, int mask)
{
	sysret_t rval;			/* return value from memcntl() */
	argdes_t argd[6];		/* arg descriptors for memcntl() */
	argdes_t *adp;
	int error;

	if (Pr == NULL)		/* no subject process */
		return (memcntl(addr, len, cmd, arg, attr, mask));

	adp = &argd[0];		/* addr argument */
	adp->arg_value = (uintptr_t)addr;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* len argument */
	adp->arg_value = len;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* cmd argument */
	adp->arg_value = cmd;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* arg argument */
	if (cmd == MC_HAT_ADVISE) {
		adp->arg_value = 0;
		adp->arg_object = arg;
		adp->arg_type = AT_BYREF;
		adp->arg_inout = AI_INPUT;
#ifdef _LP64
		if (Pstatus(Pr)->pr_dmodel == PR_MODEL_ILP32)
			adp->arg_size = sizeof (struct memcntl_mha32);
		else
			adp->arg_size = sizeof (struct memcntl_mha);
#else
		adp->arg_size = sizeof (struct memcntl_mha);
#endif
	} else {
		adp->arg_value = (uintptr_t)arg;
		adp->arg_object = NULL;
		adp->arg_type = AT_BYVAL;
		adp->arg_inout = AI_INPUT;
		adp->arg_size = 0;
	}

	adp++;			/* attr argument */
	adp->arg_value = attr;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	adp++;			/* mask argument */
	adp->arg_value = mask;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, SYS_memcntl, 6, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
	return (0);
}
Beispiel #16
0
/*
 * stat() system call -- executed by subject process
 */
int
pr_stat(struct ps_prochandle *Pr, const char *path, struct stat *buf)
{
	sysret_t rval;			/* return value from stat() */
	argdes_t argd[4];		/* arg descriptors for fstatat() */
	argdes_t *adp = &argd[0];	/* first argument */
	int syscall;			/* SYS_fstatat or SYS_fstatat64 */
	int error;
#ifdef _LP64
	struct stat64_32 statb64_32;
#endif	/* _LP64 */

	if (Pr == NULL)		/* no subject process */
		return (stat(path, buf));

	if (Pstatus(Pr)->pr_dmodel != PR_MODEL_NATIVE) {
		/* 64-bit process controls 32-bit subject process */
		syscall = SYS_fstatat64;
	} else {
		syscall = SYS_fstatat;
	}

	adp->arg_value = AT_FDCWD;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;
	adp++;			/* move to path argument */

	adp->arg_value = 0;
	adp->arg_object = (void *)path;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = strlen(path) + 1;
	adp++;			/* move to buffer argument */

	adp->arg_value = 0;
	adp->arg_type = AT_BYREF;
	adp->arg_inout = AI_OUTPUT;
#ifdef _LP64
	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_ILP32) {
		adp->arg_object = &statb64_32;
		adp->arg_size = sizeof (statb64_32);
	} else {
		adp->arg_object = buf;
		adp->arg_size = sizeof (*buf);
	}
#else	/* _LP64 */
	adp->arg_object = buf;
	adp->arg_size = sizeof (*buf);
#endif	/* _LP64 */
	adp++;			/* move to flags argument */

	adp->arg_value = 0;
	adp->arg_object = NULL;
	adp->arg_type = AT_BYVAL;
	adp->arg_inout = AI_INPUT;
	adp->arg_size = 0;

	error = Psyscall(Pr, &rval, syscall, 4, &argd[0]);

	if (error) {
		errno = (error > 0)? error : ENOSYS;
		return (-1);
	}
#ifdef _LP64
	if (Pstatus(Pr)->pr_dmodel == PR_MODEL_ILP32)
		stat64_32_to_n(&statb64_32, buf);
#endif	/* _LP64 */
	return (0);
}