/* * 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); }
/* * 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); }
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); }
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); }
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); }
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); }
/* * 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); }
/* * 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); }
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); }
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); }
/* * 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); }
/* * 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); }
/* * 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); }
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); }
/* * 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); }