|
From: <sv...@va...> - 2005-08-28 05:10:55
|
Author: njn
Date: 2005-08-28 06:10:48 +0100 (Sun, 28 Aug 2005)
New Revision: 4547
Log:
Save some informative emails about Darwin from Greg Parker.
Added:
trunk/docs/internals/darwin-notes.txt
trunk/docs/internals/darwin-syscalls.txt
Modified:
trunk/docs/internals/Makefile.am
Modified: trunk/docs/internals/Makefile.am
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/docs/internals/Makefile.am 2005-08-28 04:48:12 UTC (rev 4546)
+++ trunk/docs/internals/Makefile.am 2005-08-28 05:10:48 UTC (rev 4547)
@@ -1,5 +1,7 @@
EXTRA_DIST =3D \
- 3_0_BUGSTATUS 64-bit-cleanness.txt directory-structure.txt \
+ 3_0_BUGSTATUS 64-bit-cleanness.txt \
+ darwin-notes.txt darwin-syscalls.txt \
+ directory-structure.txt \
m_replacemalloc.txt \
m_syswrap.txt module-structure.txt notes.txt porting-HOWTO.txt \
porting-to-ARM.txt \
Added: trunk/docs/internals/darwin-notes.txt
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/docs/internals/darwin-notes.txt 2005-08-28 04:48:12 UTC (rev 45=
46)
+++ trunk/docs/internals/darwin-notes.txt 2005-08-28 05:10:48 UTC (rev 45=
47)
@@ -0,0 +1,78 @@
+[Julian replying to Greg Parker's notes about darwin/ppc32]
+
+
+> Some notes about porting Valgrind 3.x to Mac OS X / PowerPC:
+>
+> * Darwin always uses a 64-bit off_t, even on 32-bit architectures.
+> (FreeBSD may also do this.) Valgrind currently allows off_t to
+> be pointer sized only, but it doesn't look like there is any
+> strong dependence on this anywhere.
+
+Ok. This sounds fairly harmless.
+
+> * dispatch.S should be platform-specific instead of arch-specific.
+> In particular, Darwin's assembler is not GNU as, so the file's
+> syntax would be wrong even if everything else were the same.
+> It should be reasonable to change dispatch-$VG_ARCH.S to
+> dispatch-$VG_OS-$VG_ARCH.S .
+
+True.
+
+> * Some Darwin syscalls take 7 arguments (in particular, mmap()
+> with 64-bit off_t offset). Valgrind currently provides
+> arg1..arg6. I don't see any obvious 8-argument syscalls.
+> Do other architectures define a 7th syscall argument and
+> just never use it, or do they have a 6 argument max?
+
+6 args is as many as Linux uses, it seems, and that's why the
+m_syswrap abstractions stop at 6. But clearly that could be
+extended to 7 with minimal effort.
+
+> * Darwin syscalls return a full 64-bit result, even on 32-bit
+> architectures. In particular, the lseek() syscall returns
+> a 64-bit off_t in registers r3 and r4. For syscalls that
+> return a 32-bit int, the kernel sets the other return
+> register to zero (or the appropriate sign extension for
+> signed return types). I don't know how much of an effect
+> changing this would have.
+
+I think the m_syswrap abstractions should be able to hide that OK.
+
+> * Darwin/PPC syscalls indicate success and failure in an unusual
+> way: successful calls and failed calls return to different
+> points. A syscall call usually looks like this:
+>
+> // ...set up parameters here...
+> sc // make the syscall
+> b BAD // failed calls return here
+> GOOD:
+> nop // successful calls return here
+> // ...handle success case here...
+> blr
+> BAD:
+> // ...handle failure case here...
+> blr
+
+So you're saying that after sc, execution continues either at
+CIA+4 or CIA+8 depending on outcome. Right?
+
+> Handling this in VG_(do_syscall_for_client) isn't too bad.
+> One option is to store the PC of the last simulated `sc`
+> in the thread state, updating it before each call. Another
+> is to store a "sc failed" bit in each thread state, updating
+> it after each call. In either case, the simulated PC after
+> completion of the simulated `sc` would be adjusted based on
+> the result of the real `sc` or the syscall wrapper. The
+> syscall restarter would use the extra thread state to decide
+> whether to back up on instruction or two.
+>
+> Handling this in VEX might be more difficult, because VEX
+> might need to know that `sc` looks like a conditional branch
+> in basic block analysis.
+
+Probably pretty harmless. There's all sorts of tricks that can
+be played. I think it's a non-problem.
+
+> (Of course, Mach traps use `sc` but don't use the PC-modifying
+> calling convention. However, Mach traps are an entirely different
+> ball of wax, and much will be said about them later.)
Added: trunk/docs/internals/darwin-syscalls.txt
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/docs/internals/darwin-syscalls.txt 2005-08-28 04:48:12 UTC (rev=
4546)
+++ trunk/docs/internals/darwin-syscalls.txt 2005-08-28 05:10:48 UTC (rev=
4547)
@@ -0,0 +1,479 @@
+[Master list of Darwin syscalls, courtesy of Greg Parker]
+
+
+xnu-792.2.4:bsd/kern/syscalls.master
+
+; derived from: FreeBSD @(#)syscalls.master 8.2 (Berkeley) 1/13/94
+;
+; System call name/number master file.
+; This is file processed by .../xnu/bsd/kern/makesyscalls.sh and creates=
:
+; .../xnu/bsd/kern/init_sysent.c=20
+; .../xnu/bsd/kern/syscalls.c=20
+; .../xnu/bsd/sys/syscall.h=20
+; .../xnu/bsd/sys/sysproto.h=20
+;
+; Columns -> | Number | Cancel | Funnel | Files | { Name and Args } | { =
Comments }
+; Number: system call number, must be in order
+; Cancel: type of thread cancel - "PRE", "POST" or "NONE"
+; Funnel: type of funnel - "KERN" or "NONE"
+; Files: with files to generate - "ALL" or any combo of:
+; "T" for syscall table (in init_sysent.c)
+; "N" for syscall names (in syscalls.c)
+; "H" for syscall headers (in syscall.h)
+; "P" for syscall prototypes (in sysproto.h)
+; Comments: additional comments about the sys call copied to output fil=
es
+;
+; #ifdef's, #include's, #if's etc. are copied to all output files.
+
+#include <sys/appleapiopts.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/sysent.h>
+#include <sys/sysproto.h>
+
+e NONE NONE ALL { int nosys(void); } { indirect syscal=
l }
+1 NONE KERN ALL { void exit(int rval); }=20
+2 NONE KERN ALL { int fork(void); }=20
+3 PRE NONE ALL { user_ssize_t read(int fd, user_addr_t =
cbuf, user_size_t nbyte); }=20
+4 PRE NONE ALL { user_ssize_t write(int fd, user_addr_t=
cbuf, user_size_t nbyte); }=20
+5 PRE NONE ALL { int open(user_addr_t path, int flags, =
int mode); }=20
+6 PRE NONE ALL { int close(int fd); }=20
+7 PRE KERN ALL { int wait4(int pid, user_addr_t status,=
int options, user_addr_t rusage); }=20
+8 NONE NONE ALL { int nosys(void); } { old creat }
+9 NONE NONE ALL { int link(user_addr_t path, user_addr_t=
link); }=20
+10 NONE NONE ALL { int unlink(user_addr_t path); }=20
+11 NONE NONE ALL { int nosys(void); } { old execv }
+12 NONE NONE ALL { int chdir(user_addr_t path); }=20
+13 NONE NONE ALL { int fchdir(int fd); }=20
+14 NONE NONE ALL { int mknod(user_addr_t path, int mode, =
int dev); }=20
+15 NONE NONE ALL { int chmod(user_addr_t path, int mode);=
}=20
+16 NONE NONE ALL { int chown(user_addr_t path, int uid, i=
nt gid); }=20
+17 NONE NONE UALL { int obreak(char *nsize); } { old bre=
ak }
+
+#if COMPAT_GETFSSTAT
+18 NONE NONE ALL { int ogetfsstat(user_addr_t buf, int bu=
fsize, int flags); }=20
+#else
+18 NONE NONE ALL { int getfsstat(user_addr_t buf, int buf=
size, int flags); }=20
+#endif
+
+19 NONE NONE ALL { int nosys(void); } { old lseek }
+20 NONE NONE ALL { int getpid(void); }=20
+21 NONE NONE ALL { int nosys(void); } { old mount }
+22 NONE NONE ALL { int nosys(void); } { old umount }
+23 NONE KERN ALL { int setuid(uid_t uid); }=20
+24 NONE KERN ALL { int getuid(void); }=20
+25 NONE KERN ALL { int geteuid(void); }=20
+26 NONE KERN ALL { int ptrace(int req, pid_t pid, caddr_t=
addr, int data); }=20
+27 PRE NONE ALL { int recvmsg(int s, struct msghdr *msg,=
int flags); }=20
+28 PRE NONE ALL { int sendmsg(int s, caddr_t msg, int fl=
ags); }=20
+29 PRE NONE ALL { int recvfrom(int s, void *buf, size_t =
len, int flags, struct sockaddr *from, int *fromlenaddr); }=20
+30 PRE NONE ALL { int accept(int s, caddr_t name, sockle=
n_t *anamelen); }=20
+31 NONE NONE ALL { int getpeername(int fdes, caddr_t asa,=
socklen_t *alen); }=20
+32 NONE NONE ALL { int getsockname(int fdes, caddr_t asa,=
socklen_t *alen); }=20
+33 NONE NONE ALL { int access(user_addr_t path, int flags=
); }=20
+34 NONE NONE ALL { int chflags(char *path, int flags); }=20
+35 NONE NONE ALL { int fchflags(int fd, int flags); }=20
+36 NONE NONE ALL { int sync(void); }=20
+37 NONE KERN ALL { int kill(int pid, int signum); }=20
+38 NONE NONE ALL { int nosys(void); } { old stat }
+39 NONE KERN ALL { int getppid(void); }=20
+40 NONE NONE ALL { int nosys(void); } { old lstat }
+41 NONE NONE ALL { int dup(u_int fd); }=20
+42 NONE NONE ALL { int pipe(void); }=20
+43 NONE KERN ALL { int getegid(void); }=20
+44 NONE KERN ALL { int profil(short *bufbase, size_t bufs=
ize, u_long pcoffset, u_int pcscale); }=20
+45 NONE KERN ALL { int ktrace(const char *fname, int ops,=
int facs, int pid); }=20
+46 NONE KERN ALL { int sigaction(int signum, struct __sig=
action *nsa, struct sigaction *osa); }=20
+47 NONE KERN ALL { int getgid(void); }=20
+48 NONE KERN ALL { int sigprocmask(int how, user_addr_t m=
ask, user_addr_t omask); }=20
+49 NONE KERN ALL { int getlogin(char *namebuf, u_int name=
len); }=20
+50 NONE KERN ALL { int setlogin(char *namebuf); }=20
+51 NONE KERN ALL { int acct(char *path); }=20
+52 NONE KERN ALL { int sigpending(struct sigvec *osv); }=20
+53 NONE KERN ALL { int sigaltstack(struct sigaltstack *ns=
s, struct sigaltstack *oss); }=20
+54 NONE NONE ALL { int ioctl(int fd, u_long com, caddr_t =
data); }=20
+55 NONE KERN ALL { int reboot(int opt, char *command); }=20
+56 NONE NONE ALL { int revoke(char *path); }=20
+57 NONE NONE ALL { int symlink(char *path, char *link); }=
=20
+58 NONE NONE ALL { int readlink(char *path, char *buf, in=
t count); }=20
+59 NONE KERN ALL { int execve(char *fname, char **argp, c=
har **envp); }=20
+60 NONE KERN ALL { int umask(int newmask); }=20
+61 NONE KERN ALL { int chroot(user_addr_t path); }=20
+62 NONE NONE ALL { int nosys(void); } { old fstat }
+63 NONE NONE ALL { int nosys(void); } { used internally=
, reserved }
+64 NONE NONE ALL { int nosys(void); } { old getpagesize=
}
+65 PRE NONE ALL { int msync(caddr_t addr, size_t len, in=
t flags); }=20
+66 NONE KERN ALL { int vfork(void); }=20
+67 NONE NONE ALL { int nosys(void); } { old vread }
+68 NONE NONE ALL { int nosys(void); } { old vwrite }
+69 NONE NONE ALL { int sbrk(int incr); }=20
+70 NONE NONE ALL { int sstk(int incr); }=20
+71 NONE NONE ALL { int nosys(void); } { old mmap }
+72 NONE NONE ALL { int ovadvise(void); } { old vadvise =
}
+73 NONE NONE ALL { int munmap(caddr_t addr, size_t len); =
}=20
+74 NONE NONE ALL { int mprotect(caddr_t addr, size_t len,=
int prot); }=20
+75 NONE NONE ALL { int madvise(caddr_t addr, size_t len, =
int behav); }=20
+76 NONE NONE ALL { int nosys(void); } { old vhangup }
+77 NONE NONE ALL { int nosys(void); } { old vlimit }
+78 NONE NONE ALL { int mincore(user_addr_t addr, user_siz=
e_t len, user_addr_t vec); }=20
+79 NONE KERN ALL { int getgroups(u_int gidsetsize, gid_t =
*gidset); }=20
+80 NONE KERN ALL { int setgroups(u_int gidsetsize, gid_t =
*gidset); }=20
+81 NONE KERN ALL { int getpgrp(void); }=20
+82 NONE KERN ALL { int setpgid(int pid, int pgid); }=20
+83 NONE KERN ALL { int setitimer(u_int which, struct itim=
erval *itv, struct itimerval *oitv); }=20
+84 NONE NONE ALL { int nosys(void); } { old wait }
+85 NONE NONE ALL { int swapon(void); }=20
+86 NONE KERN ALL { int getitimer(u_int which, struct itim=
erval *itv); }=20
+87 NONE NONE ALL { int nosys(void); } { old gethostname=
}
+88 NONE NONE ALL { int nosys(void); } { old sethostname=
}
+89 NONE NONE ALL { int getdtablesize(void); }=20
+90 NONE NONE ALL { int dup2(u_int from, u_int to); }=20
+91 NONE NONE ALL { int nosys(void); } { old getdopt }
+92 PRE NONE ALL { int fcntl(int fd, int cmd, long arg); =
}=20
+93 PRE KERN ALL { int select(int nd, u_int32_t *in, u_in=
t32_t *ou, u_int32_t *ex, struct timeval *tv); }=20
+94 NONE NONE ALL { int nosys(void); } { old setdopt }
+95 PRE NONE ALL { int fsync(int fd); }=20
+96 NONE KERN ALL { int setpriority(int which, int who, in=
t prio); }=20
+97 NONE NONE ALL { int socket(int domain, int type, int p=
rotocol); }=20
+98 PRE NONE ALL { int connect(int s, caddr_t name, sockl=
en_t namelen); }=20
+99 NONE NONE ALL { int nosys(void); } { old accept }
+100 NONE KERN ALL { int getpriority(int which, int who); }=
=20
+101 NONE NONE ALL { int nosys(void); } { old send }
+102 NONE NONE ALL { int nosys(void); } { old recv }
+
+#ifdef __ppc__
+103 NONE NONE ALL { int nosys(void); } { old sigreturn }
+#else
+103 NONE KERN UALL { int sigreturn(struct sigcontext *sigcn=
txp); }=20
+#endif
+
+104 NONE NONE ALL { int bind(int s, caddr_t name, socklen_=
t namelen); }=20
+105 NONE NONE ALL { int setsockopt(int s, int level, int n=
ame, caddr_t val, socklen_t valsize); }=20
+106 NONE NONE ALL { int listen(int s, int backlog); }=20
+107 NONE NONE ALL { int nosys(void); } { old vtimes }
+108 NONE NONE ALL { int nosys(void); } { old sigvec }
+109 NONE NONE ALL { int nosys(void); } { old sigblock }
+110 NONE NONE ALL { int nosys(void); } { old sigsetmask =
}
+111 PRE KERN ALL { int sigsuspend(sigset_t mask); }=20
+112 NONE NONE ALL { int nosys(void); } { old sigstack }
+113 NONE NONE ALL { int nosys(void); } { old recvmsg }
+114 NONE NONE ALL { int nosys(void); } { old sendmsg } =20
+115 NONE NONE ALL { int nosys(void); } { old vtrace }
+
+#ifdef __ppc__
+116 NONE NONE ALL { int ppc_gettimeofday(struct timeval *t=
p, struct timezone *tzp); }=20
+#else
+116 NONE NONE ALL { int gettimeofday(struct timeval *tp, s=
truct timezone *tzp); }=20
+#endif
+
+117 NONE KERN ALL { int getrusage(int who, struct rusage *=
rusage); }=20
+118 NONE NONE ALL { int getsockopt(int s, int level, int n=
ame, caddr_t val, socklen_t *avalsize); }=20
+119 NONE NONE ALL { int nosys(void); } { old resuba }
+120 PRE NONE ALL { user_ssize_t readv(int fd, struct iove=
c *iovp, u_int iovcnt); }=20
+121 PRE NONE ALL { user_ssize_t writev(int fd, struct iov=
ec *iovp, u_int iovcnt); }=20
+122 NONE KERN ALL { int settimeofday(struct timeval *tv, s=
truct timezone *tzp); }=20
+123 NONE NONE ALL { int fchown(int fd, int uid, int gid); =
}=20
+124 NONE NONE ALL { int fchmod(int fd, int mode); }=20
+125 NONE NONE ALL { int nosys(void); } { old recvfrom }
+126 NONE NONE ALL { int nosys(void); } { old setreuid }
+127 NONE NONE ALL { int nosys(void); } { old setregid }
+128 NONE NONE ALL { int rename(char *from, char *to); }=20
+129 NONE NONE ALL { int nosys(void); } { old truncate }
+130 NONE NONE ALL { int nosys(void); } { old ftruncate }
+131 NONE NONE ALL { int flock(int fd, int how); }=20
+132 NONE NONE ALL { int mkfifo(user_addr_t path, int mode)=
; }=20
+133 PRE NONE ALL { int sendto(int s, caddr_t buf, size_t =
len, int flags, caddr_t to, socklen_t tolen); }=20
+134 NONE NONE ALL { int shutdown(int s, int how); }=20
+135 NONE NONE ALL { int socketpair(int domain, int type, i=
nt protocol, int *rsv); }=20
+136 NONE NONE ALL { int mkdir(user_addr_t path, int mode);=
}=20
+137 NONE NONE ALL { int rmdir(char *path); }=20
+138 NONE NONE ALL { int utimes(char *path, struct timeval =
*tptr); }=20
+139 NONE NONE ALL { int futimes(int fd, struct timeval *tp=
tr); }=20
+140 NONE KERN ALL { int adjtime(struct timeval *delta, str=
uct timeval *olddelta); }=20
+141 NONE NONE ALL { int nosys(void); } { old getpeername=
}
+142 NONE NONE ALL { int nosys(void); } { old gethostid }
+143 NONE NONE ALL { int nosys(void); } { old sethostid =
}
+144 NONE NONE ALL { int nosys(void); } { old getrlimit }
+145 NONE NONE ALL { int nosys(void); } { old setrlimit }
+146 NONE NONE ALL { int nosys(void); } { old killpg }
+147 NONE KERN ALL { int setsid(void); }=20
+148 NONE NONE ALL { int nosys(void); } { old setquota }
+149 NONE NONE ALL { int nosys(void); } { old qquota }
+150 NONE NONE ALL { int nosys(void); } { old getsockname=
}
+151 NONE KERN ALL { int getpgid(pid_t pid); }=20
+152 NONE KERN ALL { int setprivexec(int flag); }=20
+153 PRE NONE ALL { user_ssize_t pread(int fd, user_addr_t=
buf, user_size_t nbyte, off_t offset); }=20
+154 PRE NONE ALL { user_ssize_t pwrite(int fd, user_addr_=
t buf, user_size_t nbyte, off_t offset); }=20
+
+#if NFSSERVER
+155 NONE KERN ALL { int nfssvc(int flag, caddr_t argp); }=20
+#else
+155 NONE NONE ALL { int nosys(void); }=20
+#endif
+
+156 NONE NONE ALL { int nosys(void); } { old getdirentri=
es }
+157 NONE NONE ALL { int statfs(char *path, struct statfs *=
buf); }=20
+158 NONE NONE ALL { int fstatfs(int fd, struct statfs *buf=
); }=20
+159 NONE NONE ALL { int unmount(user_addr_t path, int flag=
s); }=20
+160 NONE NONE ALL { int nosys(void); } { old async_daemo=
n }
+
+#if NFSCLIENT
+161 NONE KERN ALL { int getfh(char *fname, fhandle_t *fhp)=
; }=20
+#else
+161 NONE NONE ALL { int nosys(void); }=20
+#endif
+
+162 NONE NONE ALL { int nosys(void); } { old getdomainna=
me }
+163 NONE NONE ALL { int nosys(void); } { old setdomainna=
me }
+164 NONE NONE ALL { int nosys(void); }=20
+165 NONE KERN ALL { int quotactl(char *path, int cmd, int =
uid, caddr_t arg); }=20
+166 NONE NONE ALL { int nosys(void); } { old exportfs }
+167 NONE NONE ALL { int mount(char *type, char *path, int =
flags, caddr_t data); }=20
+168 NONE NONE ALL { int nosys(void); } { old ustat }
+169 NONE NONE ALL { int nosys(void); }=20
+170 NONE NONE HN { int table(void); } { old table }
+171 NONE NONE ALL { int nosys(void); } { old wait3 }
+172 NONE NONE ALL { int nosys(void); } { old rpause =
} =20
+173 PRE KERN ALL { int waitid(idtype_t idtype, id_t id, s=
iginfo_t *infop, int options); }=20
+174 NONE NONE ALL { int nosys(void); } { old getdents }
+175 NONE NONE ALL { int nosys(void); } { old gc_control =
}
+176 NONE KERN ALL { int add_profil(short *bufbase, size_t =
bufsize, u_long pcoffset, u_int pcscale); }=20
+177 NONE NONE ALL { int nosys(void); }=20
+178 NONE NONE ALL { int nosys(void); }=20
+179 NONE NONE ALL { int nosys(void); }=20
+180 NONE NONE UALL { int kdebug_trace(int code, int arg1, int =
arg2, int arg3, int arg4, int arg5); }=20
+181 NONE KERN ALL { int setgid(gid_t gid); }=20
+182 NONE KERN ALL { int setegid(gid_t egid); }=20
+183 NONE KERN ALL { int seteuid(uid_t euid); }=20
+
+#ifdef __ppc__
+184 NONE KERN ALL { int sigreturn(struct ucontext *uctx, i=
nt infostyle); }=20
+#else
+184 NONE NONE ALL { int nosys(void); }=20
+#endif
+
+185 NONE NONE ALL { int nosys(void); }=20
+186 NONE NONE ALL { int nosys(void); }=20
+187 NONE NONE ALL { int nosys(void); }=20
+188 NONE NONE ALL { int stat(user_addr_t path, user_addr_t=
ub); }=20
+189 NONE NONE ALL { int fstat(int fd, user_addr_t ub); }=20
+190 NONE NONE ALL { int lstat(user_addr_t path, user_addr_=
t ub); }=20
+191 NONE NONE ALL { int pathconf(char *path, int name); }=20
+192 NONE NONE ALL { int fpathconf(int fd, int name); }=20
+
+#if COMPAT_GETFSSTAT
+193 NONE NONE ALL { int getfsstat(user_addr_t buf, user_lo=
ng_t bufsize, int flags); }=20
+#else
+193 NONE NONE ALL { int nosys(void); }=20
+#endif
+
+194 NONE KERN ALL { int getrlimit(u_int which, struct rlim=
it *rlp); }=20
+195 NONE KERN ALL { int setrlimit(u_int which, struct rlim=
it *rlp); }=20
+196 NONE NONE ALL { int getdirentries(int fd, char *buf, u=
_int count, long *basep); }=20
+197 NONE NONE ALL { user_addr_t mmap(caddr_t addr, size_t =
len, int prot, int flags, int fd, off_t pos); }=20
+198 NONE NONE ALL { int nosys(void); } { __syscall }
+199 NONE NONE ALL { off_t lseek(int fd, off_t offset, int =
whence); }=20
+200 NONE NONE ALL { int truncate(char *path, off_t length)=
; }=20
+201 NONE NONE ALL { int ftruncate(int fd, off_t length); }=
=20
+202 NONE KERN ALL { int __sysctl(int *name, u_int namelen, voi=
d *old, size_t *oldlenp, void *new, size_t newlen); }=20
+203 NONE NONE ALL { int mlock(caddr_t addr, size_t len); }=20
+204 NONE NONE ALL { int munlock(caddr_t addr, size_t len); }=20
+205 NONE NONE ALL { int undelete(user_addr_t path); }=20
+
+#ifdef __ppc__
+206 NONE NONE ALL { int ATsocket(int proto); }=20
+207 NONE NONE UALL { int ATgetmsg(int fd, void *ctlptr, voi=
d *datptr, int *flags); }=20
+208 NONE NONE UALL { int ATputmsg(int fd, void *ctlptr, voi=
d *datptr, int flags); }=20
+209 NONE NONE UALL { int ATPsndreq(int fd, unsigned char *b=
uf, int len, int nowait); }=20
+210 NONE NONE UALL { int ATPsndrsp(int fd, unsigned char *r=
espbuff, int resplen, int datalen); }=20
+211 NONE NONE UALL { int ATPgetreq(int fd, unsigned char *b=
uf, int buflen); }=20
+212 NONE NONE UALL { int ATPgetrsp(int fd, unsigned char *b=
dsp); }=20
+213 NONE NONE ALL { int nosys(void); } { Reserved for A=
ppleTalk }
+#else
+206 NONE NONE HN { int ATsocket(int proto); }=20
+207 NONE NONE UHN { int ATgetmsg(int fd, void *ctlptr, voi=
d *datptr, int *flags); }=20
+208 NONE NONE UHN { int ATputmsg(int fd, void *ctlptr, voi=
d *datptr, int flags); }=20
+209 NONE NONE UHN { int ATPsndreq(int fd, unsigned char *b=
uf, int len, int nowait); }=20
+210 NONE NONE UHN { int ATPsndrsp(int fd, unsigned char *r=
espbuff, int resplen, int datalen); }=20
+211 NONE NONE UHN { int ATPgetreq(int fd, unsigned char *b=
uf, int buflen); }=20
+212 NONE NONE UHN { int ATPgetrsp(int fd, unsigned char *b=
dsp); }=20
+213 NONE NONE ALL { int nosys(void); } { Reserved for A=
ppleTalk }
+#endif /* __ppc__ */
+
+214 NONE KERN ALL { int kqueue_from_portset_np(int portset=
); }=20
+215 NONE KERN ALL { int kqueue_portset_np(int fd); }=20
+
+; System Calls 216 - 230 are reserved for calls to support HFS/HFS Plus
+; file system semantics. Currently, we only use 215-227. The rest is=20
+; for future expansion in anticipation of new MacOS APIs for HFS Plus.
+; These calls are not conditionalized becuase while they are specific
+; to HFS semantics, they are not specific to the HFS filesystem.
+; We expect all filesystems to recognize the call and report that it is
+; not supported or to actually implement it.
+216 NONE NONE UHN { int mkcomplex(const char *path, mode_t =
mode, u_long type); } { soon to be obsolete }
+217 NONE NONE UHN { int statv(const char *path, struct vsta=
t *vsb); } { soon to be obsolete }
+218 NONE NONE UHN { int lstatv(const char *path, struct vst=
at *vsb); } { soon to be obsolete }
+219 NONE NONE UHN { int fstatv(int fd, struct vstat *vsb); =
} { soon to be obsolete }
+220 NONE NONE ALL { int getattrlist(const char *path, struc=
t attrlist *alist, void *attributeBuffer, size_t bufferSize, u_long optio=
ns); }=20
+221 NONE NONE ALL { int setattrlist(const char *path, struc=
t attrlist *alist, void *attributeBuffer, size_t bufferSize, u_long optio=
ns); }=20
+222 NONE NONE ALL { int getdirentriesattr(int fd, struct at=
trlist *alist, void *buffer, size_t buffersize, u_long *count, u_long *ba=
sep, u_long *newstate, u_long options); }=20
+223 NONE NONE ALL { int exchangedata(const char *path1, con=
st char *path2, u_long options); }=20
+
+#ifdef __APPLE_API_OBSOLETE
+224 NONE NONE UALL { int checkuseraccess(const char *path, =
uid_t userid, gid_t *groups, int ngroups, int accessrequired, u_long opti=
ons); }=20
+#else
+224 NONE NONE ALL { int nosys(void); } { HFS checkusera=
ccess check access to a file }
+#endif /* __APPLE_API_OBSOLETE */
+225 NONE KERN ALL { int searchfs(const cha=
r *path, struct fssearchblock *searchblock, u_long *nummatches, u_long sc=
riptcode, u_long options, struct searchstate *state); }=20
+226 NONE NONE ALL { int delete(user_addr_t=
path); } { private delete (Carbon semantics) }
+227 NONE NONE ALL { int copyfile(char *fro=
m, char *to, int mode, int flags); }=20
+228 NONE NONE ALL { int nosys(void); }=20
+229 NONE NONE ALL { int nosys(void); }=20
+230 PRE NONE ALL { int poll(struct pollfd=
*fds, u_int nfds, int timeout); }=20
+231 NONE NONE UALL { int watchevent(struct =
eventreq *u_req, int u_eventmask); }=20
+232 NONE NONE UALL { int waitevent(struct e=
ventreq *u_req, struct timeval *tv); }=20
+233 NONE NONE UALL { int modwatch(struct ev=
entreq *u_req, int u_eventmask); }=20
+234 NONE NONE ALL { user_ssize_t getxattr(=
user_addr_t path, user_addr_t attrname, user_addr_t value, size_t size, u=
int32_t position, int options); }=20
+235 NONE NONE ALL { user_ssize_t fgetxattr=
(int fd, user_addr_t attrname, user_addr_t value, size_t size, uint32_t p=
osition, int options); }=20
+236 NONE NONE ALL { int setxattr(user_addr=
_t path, user_addr_t attrname, user_addr_t value, size_t size, uint32_t p=
osition, int options); }=20
+237 NONE NONE ALL { int fsetxattr(int fd, =
user_addr_t attrname, user_addr_t value, size_t size, uint32_t position, =
int options); }=20
+238 NONE NONE ALL { int removexattr(user_a=
ddr_t path, user_addr_t attrname, int options); }=20
+239 NONE NONE ALL { int fremovexattr(int f=
d, user_addr_t attrname, int options); }=20
+240 NONE NONE ALL { user_ssize_t listxattr=
(user_addr_t path, user_addr_t namebuf, size_t bufsize, int options); }=20
+241 NONE NONE ALL { user_ssize_t flistxatt=
r(int fd, user_addr_t namebuf, size_t bufsize, int options); }=20
+242 NONE KERN ALL { int fsctl(const char *=
path, u_long cmd, caddr_t data, u_long options); }=20
+243 NONE KERN ALL { int initgroups(u_int g=
idsetsize, gid_t *gidset, int gmuid); }=20
+244 NONE NONE ALL { int nosys(void); }=20
+245 NONE NONE ALL { int nosys(void); }=20
+246 NONE NONE ALL { int nosys(void); }=20
+
+#if NFSCLIENT
+247 NONE KERN ALL { int nfsclnt(int flag, caddr_t argp); }=
=20
+248 NONE KERN ALL { int fhopen(const struct fhandle *u_fhp=
, int flags); }=20
+#else
+247 NONE NONE ALL { int nosys(void); }=20
+248 NONE NONE ALL { int nosys(void); }=20
+#endif
+
+249 NONE NONE ALL { int nosys(void); }=20
+250 NONE NONE ALL { int minherit(void *addr, size_t len, i=
nt inherit); }=20
+251 NONE NONE ALL { int semsys(u_int which, int a2, int a3=
, int a4, int a5); }=20
+252 NONE NONE ALL { int msgsys(u_int which, int a2, int a3=
, int a4, int a5); }
+253 NONE NONE ALL { int shmsys(u_int which, int a2, int a3=
, int a4); }=20
+254 NONE NONE ALL { int semctl(int semid, int semnum, int =
cmd, semun_t arg); }=20
+255 NONE NONE ALL { int semget(key_t key, int nsems, int s=
emflg); }=20
+256 NONE NONE ALL { int semop(int semid, struct sembuf *so=
ps, int nsops); }=20
+257 NONE NONE ALL { int semconfig(semconfig_ctl_t fla=
g); }=20
+258 NONE NONE ALL { int msgctl(int msqid, int cmd, struct =
msqid_ds *buf); }=20
+259 NONE NONE ALL { int msgget(key_t key, int msgflg); }=20
+260 PRE NONE ALL { int msgsnd(int msqid, void *msgp, size=
_t msgsz, int msgflg); }=20
+261 PRE NONE ALL { user_ssize_t msgrcv(int msqid, void *m=
sgp, size_t msgsz, long msgtyp, int msgflg); }=20
+262 NONE NONE ALL { int shmat(int shmid, void *shmaddr, in=
t shmflg); }=20
+263 NONE NONE ALL { int shmctl(int shmid, int cmd, struct =
shmid_ds *buf); }=20
+264 NONE NONE ALL { int shmdt(void *shmaddr); }=20
+265 NONE NONE ALL { int shmget(key_t key, size_t size, int=
shmflg); }=20
+266 NONE NONE ALL { int shm_open(const char *name, int ofl=
ag, int mode); }=20
+267 NONE NONE ALL { int shm_unlink(const char *name); }=20
+268 NONE NONE ALL { user_addr_t sem_open(const char *name,=
int oflag, int mode, int value); }=20
+269 NONE NONE ALL { int sem_close(sem_t *sem); }=20
+270 NONE NONE ALL { int sem_unlink(const char *name); }=20
+271 PRE NONE ALL { int sem_wait(sem_t *sem); }=20
+272 NONE NONE ALL { int sem_trywait(sem_t *sem); }=20
+273 NONE NONE ALL { int sem_post(sem_t *sem); }=20
+274 NONE NONE ALL { int sem_getvalue(sem_t *sem, int *sval=
); }=20
+275 NONE NONE ALL { int sem_init(sem_t *sem, int phsared, =
u_int value); }=20
+276 NONE NONE ALL { int sem_destroy(sem_t *sem); }=20
+277 NONE NONE ALL { int open_extended(user_addr_t path, in=
t flags, uid_t uid, gid_t gid, int mode, user_addr_t xsecurity); }=20
+278 NONE KERN ALL { int umask_extended(int newmask, user_a=
ddr_t xsecurity); }=20
+279 NONE NONE ALL { int stat_extended(user_addr_t path, us=
er_addr_t ub, user_addr_t xsecurity, user_addr_t xsecurity_size); }=20
+280 NONE NONE ALL { int lstat_extended(user_addr_t path, u=
ser_addr_t ub, user_addr_t xsecurity, user_addr_t xsecurity_size); }=20
+281 NONE NONE ALL { int fstat_extended(int fd, user_addr_t=
ub, user_addr_t xsecurity, user_addr_t xsecurity_size); }=20
+282 NONE NONE ALL { int chmod_extended(user_addr_t path, u=
id_t uid, gid_t gid, int mode, user_addr_t xsecurity); }=20
+283 NONE NONE ALL { int fchmod_extended(int fd, uid_t uid,=
gid_t gid, int mode, user_addr_t xsecurity); }=20
+284 NONE NONE ALL { int access_extended(user_addr_t entrie=
s, size_t size, user_addr_t results, uid_t uid); }=20
+285 NONE NONE ALL { int settid(uid_t uid, gid_t gid); }=20
+286 NONE NONE ALL { int gettid(uid_t *uidp, gid_t *gidp); =
}=20
+287 NONE NONE ALL { int setsgroups(int setlen, user_addr_t=
guidset); }=20
+288 NONE NONE ALL { int getsgroups(user_addr_t setlen, use=
r_addr_t guidset); }=20
+289 NONE NONE ALL { int setwgroups(int setlen, user_addr_t=
guidset); }=20
+290 NONE NONE ALL { int getwgroups(user_addr_t setlen, use=
r_addr_t guidset); }
+291 NONE NONE ALL { int mkfifo_extended(user_addr_t path, =
uid_t uid, gid_t gid, int mode, user_addr_t xsecurity); }=20
+292 NONE NONE ALL { int mkdir_extended(user_addr_t path, u=
id_t uid, gid_t gid, int mode, user_addr_t xsecurity); }=20
+293 NONE NONE ALL { int identitysvc(int opcode, user_addr_=
t message); }=20
+294 NONE NONE ALL { int nosys(void); }=20
+295 NONE NONE ALL { int nosys(void); }=20
+296 NONE KERN UALL { int load_shared_file(char *filename, c=
addr_t mfa, u_long mfs, caddr_t *ba, int map_cnt, sf_mapping_t *mappings,=
int *flags); }=20
+297 NONE KERN UALL { int reset_shared_file(caddr_t *ba, int=
map_cnt, sf_mapping_t *mappings); }=20
+298 NONE KERN ALL { int new_system_shared_regions(void); }=
=20
+299 NONE KERN UALL { int shared_region_map_file_np(int fd, =
uint32_t mappingCount, user_addr_t mappings, user_addr_t slide_p); }=20
+300 NONE KERN UALL { int shared_region_make_private_np(uint=
32_t rangeCount, user_addr_t ranges); }=20
+301 NONE NONE ALL { int nosys(void); }=20
+302 NONE NONE ALL { int nosys(void); }=20
+303 NONE NONE ALL { int nosys(void); }=20
+304 NONE NONE ALL { int nosys(void); }=20
+305 NONE NONE ALL { int nosys(void); }=20
+306 NONE NONE ALL { int nosys(void); }=20
+307 NONE NONE ALL { int nosys(void); }=20
+308 NONE NONE ALL { int nosys(void); }=20
+309 NONE NONE ALL { int nosys(void); }=20
+310 NONE KERN ALL { int getsid(pid_t pid); }=20
+311 NONE NONE ALL { int settid_with_pid(pid_t pid, int ass=
ume); }=20
+312 NONE NONE ALL { int nosys(void); }=20
+313 NONE NONE ALL { int aio_fsync(int op, user_addr_t aioc=
bp); }=20
+314 NONE NONE ALL { user_ssize_t aio_return(user_addr_t ai=
ocbp); }=20
+315 PRE NONE ALL { int aio_suspend(user_addr_t aiocblist,=
int nent, user_addr_t timeoutp); }=20
+316 NONE NONE ALL { int aio_cancel(int fd, user_addr_t aio=
cbp); }=20
+317 NONE NONE ALL { int aio_error(user_addr_t aiocbp); }=20
+318 NONE NONE ALL { int aio_read(user_addr_t aiocbp); }=20
+319 NONE NONE ALL { int aio_write(user_addr_t aiocbp); }=20
+320 NONE NONE ALL { int lio_listio(int mode, user_addr_t a=
iocblist, int nent, user_addr_t sigp); }=20
+321 NONE NONE ALL { int nosys(void); }=20
+322 NONE NONE ALL { int nosys(void); }=20
+323 NONE NONE ALL { int nosys(void); }=20
+324 NONE NONE ALL { int mlockall(int how); }=20
+325 NONE NONE ALL { int munlockall(int how); }=20
+326 NONE NONE ALL { int nosys(void); }=20
+327 NONE KERN ALL { int issetugid(void); }=20
+328 NONE KERN ALL { int __pthread_kill(int thread_port, in=
t sig); }=20
+329 NONE KERN ALL { int pthread_sigmask(int how, user_addr=
_t set, user_addr_t oset); }=20
+330 PRE KERN ALL { int sigwait(user_addr_t set, user_addr=
_t sig); }=20
+331 NONE KERN ALL { int __disable_threadsignal(int value);=
}=20
+332 NONE NONE ALL { int __pthread_markcancel(int thread_po=
rt); }=20
+333 NONE NONE ALL { int __pthread_canceled(int action); }=
=20
+334 POST NONE ALL { int __semwait_signal(int cond_sem, int=
mutex_sem, int timeout, int relative, time_t tv_sec, int32_t tv_nsec); }=
=20
+335 NONE KERN ALL { int utrace(const void *addr, size_t le=
n); }=20
+336 NONE NONE ALL { int nosys(void); }=20
+337 NONE NONE ALL { int nosys(void); }=20
+338 NONE NONE ALL { int nosys(void); }=20
+339 NONE NONE ALL { int nosys(void); }=20
+340 NONE NONE ALL { int nosys(void); }=20
+341 NONE NONE ALL { int nosys(void); }=20
+342 NONE NONE ALL { int nosys(void); }=20
+343 NONE NONE ALL { int nosys(void); }=20
+344 NONE NONE ALL { int nosys(void); }=20
+345 NONE NONE ALL { int nosys(void); }=20
+346 NONE NONE ALL { int nosys(void); }=20
+347 NONE NONE ALL { int nosys(void); }=20
+348 NONE NONE ALL { int nosys(void); }=20
+349 NONE NONE ALL { int nosys(void); }=20
+350 NONE KERN ALL { int audit(void *record, int length); }=
=20
+351 NONE KERN ALL { int auditon(int cmd, void *data, int l=
ength); }=20
+352 NONE KERN ALL { int nosys(void); }=20
+353 NONE KERN ALL { int getauid(au_id_t *auid); }=20
+354 NONE KERN ALL { int setauid(au_id_t *auid); }=20
+355 NONE KERN ALL { int getaudit(struct auditinfo *auditin=
fo); }=20
+356 NONE KERN ALL { int setaudit(struct auditinfo *auditin=
fo); }=20
+357 NONE KERN ALL { int getaudit_addr(struct auditinfo_add=
r *auditinfo_addr, int length); }=20
+358 NONE KERN ALL { int setaudit_addr(struct auditinfo_add=
r *auditinfo_addr, int length); }=20
+359 NONE KERN ALL { int auditctl(char *path); }=20
+360 NONE NONE ALL { int nosys(void); }=20
+361 NONE NONE ALL { int nosys(void); }=20
+362 NONE NONE ALL { int kqueue(void); }=20
+363 NONE NONE ALL { int kevent(int fd, const struct kevent=
*changelist, int nchanges, struct kevent *eventlist, int nevents, const =
struct timespec *timeout); }=20
+364 NONE NONE ALL { int lchown(user_addr_t path, uid_t own=
er, gid_t group); }
+365 NONE NONE ALL { int nosys(void); }=20
+366 NONE NONE ALL { int nosys(void); }=20
+367 NONE NONE ALL { int nosys(void); }=20
+368 NONE NONE ALL { int nosys(void); }=20
+369 NONE NONE ALL { int nosys(void); }=20
|