Eigenstate : OSX

OSX System Calls

The sys package, when compiled for OSX, contained an interface to the OSX system calls. At the moment, this list is fairly incomplete. It is missing a large number of data structures, and is not wrapping a large number of useful calls.

Summary

Overall, this documentation will not attempt to summarize the full behavior of the system calls, but will instead attempt to highlight where system calls diverge from the libc interfaces, which are documented in section 2 of the system manpages.

The most notable divergence is that instead of returning -1 and putting an error code in errno, Myrddin's interface to the system call returns -errno directly from the functions. The kernel returns the error code with the overflow flag set in the CPU, and the system call wrappers check this and convert the return value to a negative error code.

The other notable divergence is that short zero terminated strings strings such as file names are wrapped up as a byte[:], but are generally converted to strings on the stack before being passed to the kernel. Long buffers that are exposed to C as a char* buf, size_t len pair are exposed to Myrddin code as simply accepting a byte[:].

There are a couple of symbols that aren't actually system calls, such as the clock_gettime functions. These are faked with gettimeofday for portability.

Exported Symbols

pkg sys =
        type scno   = int64 /* syscall */
        type fdopt  = int64 /* fd options */
        type fd     = int32 /* fd */
        type pid    = int64 /* pid */
        type mprot  = int64 /* memory protection */
        type mopt   = int64 /* memory mapping options */
        type socktype   = int64 /* socket type */
        type sockproto  = int64 /* socket protocol */
        type sockfam    = uint8 /* socket family */
        type filemode   = uint16    /* file permission bits */
        type kflags = uint16    /* kqueue flags */
        type whence = int64
        type fcntlcmd   = int64

        type timespec = struct
                sec : uint64
                nsec    : uint32
        ;;

        type timeval = struct
                sec : uint64
                usec    : uint32
        ;;

        type timezone = struct
                minwest : int32 /* of greenwich */
                dsttime : int32 /* nonzero if DST applies */
        ;;

        type clock = union
                `Clockrealtime
                `Clockmonotonic
        ;;

        type waitstatus = union
                `Waitexit int32
                `Waitsig  int32
                `Waitstop int32
                `Waitfail int32
        ;;

        type statbuf = struct
                dev : int32
                mode    : filemode
                nlink   : uint16
                ino : uint64
                uid : uint32
                gid : uint32
                rdev    : uint32
                atime   : timespec
                mtime   : timespec
                ctime   : timespec
                birthtimespec   : timespec
                size    : off
                blocks  : int64
                blksize : int32
                flags   : uint32
                gen : uint32
                _spare  : uint32
                _qspare : uint64[2]
        ;;

        type rusage = struct
                utime   : timeval   /* user time */
                stime   : timeval   /* system time */
                _opaque : uint64[14]    /* padding (darwin-specific data) */
        ;;

        type utsname = struct
                system  : byte[256]
                node    : byte[256]
                release : byte[256]
                version : byte[256]
                machine : byte[256]
        ;;

        type sockaddr = struct
                len : byte
                fam : sockfam
                data    : byte[14] /* what is the *actual* length? */
        ;;

        type sockaddr_in = struct
                len : byte
                fam : sockfam
                port    : uint16
                addr    : byte[4]
                zero    : byte[8]
        ;;

        type sockaddr_in6 = struct
                len : byte
                fam : sockfam
                port    : uint16
                flowinf : uint32
                addr    : byte[16]
                scope   : uint32
        ;;


        type sockaddr_storage = struct
                len : byte
                fam : sockfam
                __pad1  : byte[6]
                __align : uint64
                __pad2  : byte[112]
        ;;

        type dirent64 = struct
                ino : uint64
                seekoff : uint64    /* seek offset (optional, used by servers) */
                reclen  : uint16    /* length of this record */
                namlen  : uint16    /* length of string in d_name */
                typeid  : uint8     /* file type, see below */
                name    : byte[...]
        ;;

        type kevent = struct
                ident   : intptr    /* identifier for this event */
                filter  : int16     /* filter for event */
                flags   : uint16    /* general flags */
                fflags  : uint32    /* filter-specific flags */
                data    : intptr    /* filter-specific data */
                udata   : byte#     /* opaque user data identifier */
        ;;

        type kevent64 = struct
                ident   : uint64    /* identifier for this event */
                filter  : int16     /* filter for event */
                flags   : kflags    /* general flags */
                fflags  : uint32    /* filter-specific flags */
                data    : int64     /* filter-specific data */
                udata   : uint64    /* opaque user data identifier */
                ext : uint64[2] /* filter-specific extensions */
        ;;

        const Seekset   : whence = 0
        const Seekcur   : whence = 1
        const Seekend   : whence = 2

        /* system specific constants */
        const Maxpathlen    : size = 1024

        /* fcntl constants */
        const Fdupfd        : fcntlcmd = 0             /* duplicate file descriptor */
        const Fgetfd        : fcntlcmd = 1             /* get file descriptor flags */
        const Fsetfd        : fcntlcmd = 2             /* set file descriptor flags */
        const Fgetfl        : fcntlcmd = 3             /* get file status flags */
        const Fsetfl        : fcntlcmd = 4             /* set file status flags */
        const Fgetown       : fcntlcmd = 5             /* get SIGIO/SIGURG proc/pgrp */
        const Fsetown       : fcntlcmd = 6             /* set SIGIO/SIGURG proc/pgrp */
        const Fgetlk        : fcntlcmd = 7             /* get record locking information */
        const Fsetlk        : fcntlcmd = 8             /* set record locking information */
        const Fsetlkw       : fcntlcmd = 9             /* F_SETLK; wait if blocked */
        const Fsetlkwtimeout    : fcntlcmd = 10         /* F_SETLK; wait if blocked, return on timeout */
        const Fflush_data   : fcntlcmd = 40
        const Fchkclean     : fcntlcmd = 41         /* Used for regression test */
        const Fpreallocate  : fcntlcmd = 42         /* Preallocate storage */
        const Fsetsize      : fcntlcmd = 43         /* Truncate a file without zeroing space */
        const Frdadvise     : fcntlcmd = 44         /* Issue an advisory read async with no copy to user */
        const Frdahead      : fcntlcmd = 45         /* turn read ahead off/on for this fd */
        /* 46,47 used to be F_READBOOTSTRAP and F_WRITEBOOTSTRAP */
        const Fnocache      : fcntlcmd = 48         /* turn data caching off/on for this fd */
        const Flog2phys     : fcntlcmd = 49         /* file offset to device offset */
        const Fgetpath      : fcntlcmd = 50         /* return the full path of the fd */
        const Ffullfsync    : fcntlcmd = 51         /* fsync + ask the drive to flush to the media */
        const Fpathpkg_check    : fcntlcmd = 52         /* find which component (if any) is a package */
        const Ffreeze_fs    : fcntlcmd = 53         /* "freeze" all fs operations */
        const Fthaw_fs      : fcntlcmd = 54         /* "thaw" all fs operations */
        const Fglobal_nocache   : fcntlcmd = 55         /* turn data caching off/on (globally) for this file */
        const Faddsigs      : fcntlcmd = 59         /* add detached signatures */
        const Faddfilesigs  : fcntlcmd = 61         /* add signature from same file (used by dyld for shared libs) */
        const Fgetprotclass : fcntlcmd = 63         /* Get the protection class of a file from the EA, returns int */
        const Fsetprotclass : fcntlcmd = 64         /* Set the protection class of a file for the EA, requires int */
        const Flog2phys_ext : fcntlcmd = 65         /* file offset to device offset, extended */
        const Fgetlkpid     : fcntlcmd = 66         /* get record locking information, per-process */
        /* See F_DUPFD_CLOEXEC below for 67 */
        const Fsetbacktore  : fcntlcmd = 70         /* Mark the file as being the backing store for another filesystem */
        const Fgetpath_mtminfo  : fcntlcmd = 71         /* return the full path of the FD, but error in specific mtmd circumstances */
        /* 72 is free.  It used to be F_GETENCRYPTEDDATA, which is now removed. */
        const Fsetnosigpipe : fcntlcmd = 73         /* No SIGPIPE generated on EPIPE */
        const Fgetnosigpipe : fcntlcmd = 74         /* Status of SIGPIPE for this fd */

        /* kqueue events */
        const Kevadd        : kflags = 0x0001   /* add event to kq (implies enable) */
        const Kevdelete     : kflags = 0x0002   /* delete event from kq */
        const Kevenable     : kflags = 0x0004   /* enable event */
        const Kevdisable    : kflags = 0x0008   /* disable event (not reported) */
        const Kevreceipt    : kflags = 0x0040   /* force EV_ERROR on success, data == 0 */

        /* kqueue flags */
        const Kevoneshot    : kflags = 0x0010   /* only report one occurrence */
        const Kevclear      : kflags = 0x0020   /* clear event state after reporting */
        const Kevdispatch   : kflags = 0x0080   /* disable event after reporting */

        const Kevsysflags   : kflags = 0xf000   /* reserved by system */
        const Kevflag0      : kflags = 0x1000   /* filter-specific flag */
        const Kevflag1      : kflags = 0x2000   /* filter-specific flag */

        /* kqueue returned values */
        const Keveof        : kflags = 0x8000   /* eof detected */
        const Keverror      : kflags = 0x4000   /* error, data contains errno */

        /* open options */
        const Ordonly   : fdopt = 0x0
        const Owronly   : fdopt = 0x1
        const Ordwr     : fdopt = 0x2
        const Ondelay   : fdopt = 0x4
        const Oappend   : fdopt = 0x8
        const Ocreat    : fdopt = 0x200
        const Onofollow : fdopt = 0x100
        const Otrunc    : fdopt = 0x400
        const Odir  : fdopt = 0x100000

        /* stat modes */
        const Sifmt : filemode = 0xf000
        const Sififo    : filemode = 0x1000
        const Sifchr    : filemode = 0x2000
        const Sifdir    : filemode = 0x4000
        const Sifblk    : filemode = 0x6000
        const Sifreg    : filemode = 0x8000
        const Siflnk    : filemode = 0xa000
        const Sifsock   : filemode = 0xc000

        /* mmap protection */
        const Mprotnone : mprot = 0x0
        const Mprotrd   : mprot = 0x1
        const Mprotwr   : mprot = 0x2
        const Mprotexec : mprot = 0x4
        const Mprotrw   : mprot = 0x3

        /* mmap options */
        const Mshared   : mopt = 0x1
        const Mpriv : mopt = 0x2
        const Mfixed    : mopt = 0x10
        const Mfile : mopt = 0x0
        const Manon : mopt = 0x1000

        /* socket families. INCOMPLETE. */
        const Afunspec  : sockfam = 0
        const Afunix    : sockfam = 1
        const Afinet    : sockfam = 2
        const Afinet6   : sockfam = 30

        /* socket types. */
        const Sockstream    : socktype = 1
        const Sockdgram     : socktype = 2
        const Sockraw       : socktype = 3
        const Sockrdm       : socktype = 4
        const Sockseqpacket : socktype = 5

        /* network protocols */
        const Ipproto_ip    : sockproto = 0
        const Ipproto_icmp  : sockproto = 1
        const Ipproto_tcp   : sockproto = 6
        const Ipproto_udp   : sockproto = 17
        const Ipproto_raw   : sockproto = 255

        /* return value for a failed mapping */
        const Mapbad    : byte# = -1 castto(byte#)

        /* syscalls.
        note, creat() implemented as open(path, Creat|Trunc|Wronly) */
        const Syssyscall    : scno = 0x2000000
        const Sysexit       : scno = 0x2000001
        const Sysfork       : scno = 0x2000002
        const Sysread       : scno = 0x2000003
        const Syswrite      : scno = 0x2000004
        const Sysopen       : scno = 0x2000005
        const Sysclose      : scno = 0x2000006
        const Syswait4      : scno = 0x2000007
        const Syslink       : scno = 0x2000009
        const Sysunlink     : scno = 0x200000a
        const Syschdir      : scno = 0x200000c
        const Sysfchdir     : scno = 0x200000d
        const Sysmknod      : scno = 0x200000e
        const Syschmod      : scno = 0x200000f
        const Syschown      : scno = 0x2000010
        const Sysgetfsstat  : scno = 0x2000012
        const Sysgetpid     : scno = 0x2000014
        const Syssetuid     : scno = 0x2000017
        const Sysgetuid     : scno = 0x2000018
        const Sysgeteuid    : scno = 0x2000019
        const Sysptrace     : scno = 0x200001a
        const Sysrecvmsg    : scno = 0x200001b
        const Syssendmsg    : scno = 0x200001c
        const Sysrecvfrom   : scno = 0x200001d
        const Sysaccept     : scno = 0x200001e
        const Sysgetpeername    : scno = 0x200001f
        const Sysgetsockname    : scno = 0x2000020
        const Sysaccess     : scno = 0x2000021
        const Syschflags    : scno = 0x2000022
        const Sysfchflags   : scno = 0x2000023
        const Syssync       : scno = 0x2000024
        const Syskill       : scno = 0x2000025
        const Sysgetppid    : scno = 0x2000027
        const Sysdup        : scno = 0x2000029
        const Syspipe       : scno = 0x200002a
        const Sysgetegid    : scno = 0x200002b
        const Sysprofil     : scno = 0x200002c
        const Syssigaction  : scno = 0x200002e
        const Sysgetgid     : scno = 0x200002f
        const Syssigprocmask    : scno = 0x2000030
        const Sysgetlogin   : scno = 0x2000031
        const Syssetlogin   : scno = 0x2000032
        const Sysacct       : scno = 0x2000033
        const Syssigpending : scno = 0x2000034
        const Syssigaltstack    : scno = 0x2000035
        const Sysioctl      : scno = 0x2000036
        const Sysreboot     : scno = 0x2000037
        const Sysrevoke     : scno = 0x2000038
        const Syssymlink    : scno = 0x2000039
        const Sysreadlink   : scno = 0x200003a
        const Sysexecve     : scno = 0x200003b
        const Sysumask      : scno = 0x200003c
        const Syschroot     : scno = 0x200003d
        const Sysmsync      : scno = 0x2000041
        const Sysvfork      : scno = 0x2000042
        const Sysmunmap     : scno = 0x2000049
        const Sysmprotect   : scno = 0x200004a
        const Sysmadvise    : scno = 0x200004b
        const Sysmincore    : scno = 0x200004e
        const Sysgetgroups  : scno = 0x200004f
        const Syssetgroups  : scno = 0x2000050
        const Sysgetpgrp    : scno = 0x2000051
        const Syssetpgid    : scno = 0x2000052
        const Syssetitimer  : scno = 0x2000053
        const Sysswapon     : scno = 0x2000055
        const Sysgetitimer  : scno = 0x2000056
        const Sysgetdtablesize  : scno = 0x2000059
        const Sysdup2       : scno = 0x200005a
        const Sysfcntl      : scno = 0x200005c
        const Sysselect     : scno = 0x200005d
        const Sysfsync      : scno = 0x200005f
        const Syssetpriority    : scno = 0x2000060
        const Syssocket     : scno = 0x2000061
        const Sysconnect    : scno = 0x2000062
        const Sysgetpriority    : scno = 0x2000064
        const Sysbind       : scno = 0x2000068
        const Syssetsockopt : scno = 0x2000069
        const Syslisten     : scno = 0x200006a
        const Syssigsuspend : scno = 0x200006f
        const Sysgettimeofday   : scno = 0x2000074
        const Sysgetrusage  : scno = 0x2000075
        const Sysgetsockopt : scno = 0x2000076
        const Sysreadv      : scno = 0x2000078
        const Syswritev     : scno = 0x2000079
        const Syssettimeofday   : scno = 0x200007a
        const Sysfchown     : scno = 0x200007b
        const Sysfchmod     : scno = 0x200007c
        const Syssetreuid   : scno = 0x200007e
        const Syssetregid   : scno = 0x200007f
        const Sysrename     : scno = 0x2000080
        const Sysflock      : scno = 0x2000083
        const Sysmkfifo     : scno = 0x2000084
        const Syssendto     : scno = 0x2000085
        const Sysshutdown   : scno = 0x2000086
        const Syssocketpair : scno = 0x2000087
        const Sysmkdir      : scno = 0x2000088
        const Sysrmdir      : scno = 0x2000089
        const Sysutimes     : scno = 0x200008a
        const Sysfutimes    : scno = 0x200008b
        const Sysadjtime    : scno = 0x200008c
        const Sysgethostuuid    : scno = 0x200008e
        const Syssetsid     : scno = 0x2000093
        const Sysgetpgid    : scno = 0x2000097
        const Syssetprivexec    : scno = 0x2000098
        const Syspread      : scno = 0x2000099
        const Syspwrite     : scno = 0x200009a
        const Sysnfssvc     : scno = 0x200009b
        const Sysstatfs     : scno = 0x200009d
        const Sysfstatfs    : scno = 0x200009e
        const Sysunmount    : scno = 0x200009f
        const Sysgetfh      : scno = 0x20000a1
        const Sysquotactl   : scno = 0x20000a5
        const Sysmount      : scno = 0x20000a7
        const Syscsops      : scno = 0x20000a9
        const Syswaitid     : scno = 0x20000ad
        const Sysadd_profil : scno = 0x20000b0
        const Syskdebug_trace   : scno = 0x20000b4
        const Syssetgid     : scno = 0x20000b5
        const Syssetegid    : scno = 0x20000b6
        const Sysseteuid    : scno = 0x20000b7
        const Syssigreturn  : scno = 0x20000b8
        const Syschud       : scno = 0x20000b9
        const Sysfdatasync  : scno = 0x20000bb
        const Sysstat       : scno = 0x20000bc
        const Sysfstat      : scno = 0x20000bd
        const Syslstat      : scno = 0x20000be
        const Syspathconf   : scno = 0x20000bf
        const Sysfpathconf  : scno = 0x20000c0
        const Sysgetrlimit  : scno = 0x20000c2
        const Syssetrlimit  : scno = 0x20000c3
        const Sysgetdirentries  : scno = 0x20000c4
        const Sysmmap       : scno = 0x20000c5
        const Syslseek      : scno = 0x20000c7
        const Systruncate   : scno = 0x20000c8
        const Sysftruncate  : scno = 0x20000c9
        const Sys__sysctl   : scno = 0x20000ca
        const Sysmlock      : scno = 0x20000cb
        const Sysmunlock    : scno = 0x20000cc
        const Sysundelete   : scno = 0x20000cd
        const SysATsocket   : scno = 0x20000ce
        const SysATgetmsg   : scno = 0x20000cf
        const SysATputmsg   : scno = 0x20000d0
        const SysATPsndreq  : scno = 0x20000d1
        const SysATPsndrsp  : scno = 0x20000d2
        const SysATPgetreq  : scno = 0x20000d3
        const SysATPgetrsp  : scno = 0x20000d4
        const Sysmkcomplex  : scno = 0x20000d8
        const Sysstatv      : scno = 0x20000d9
        const Syslstatv     : scno = 0x20000da
        const Sysfstatv     : scno = 0x20000db
        const Sysgetattrlist    : scno = 0x20000dc
        const Syssetattrlist    : scno = 0x20000dd
        const Sysgetdirentriesattr  : scno = 0x20000de
        const Sysexchangedata   : scno = 0x20000df
        const Syssearchfs   : scno = 0x20000e1
        const Sysdelete     : scno = 0x20000e2
        const Syscopyfile   : scno = 0x20000e3
        const Sysfgetattrlist   : scno = 0x20000e4
        const Sysfsetattrlist   : scno = 0x20000e5
        const Syspoll       : scno = 0x20000e6
        const Syswatchevent : scno = 0x20000e7
        const Syswaitevent  : scno = 0x20000e8
        const Sysmodwatch   : scno = 0x20000e9
        const Sysgetxattr   : scno = 0x20000ea
        const Sysfgetxattr  : scno = 0x20000eb
        const Syssetxattr   : scno = 0x20000ec
        const Sysfsetxattr  : scno = 0x20000ed
        const Sysremovexattr    : scno = 0x20000ee
        const Sysfremovexattr   : scno = 0x20000ef
        const Syslistxattr  : scno = 0x20000f0
        const Sysflistxattr : scno = 0x20000f1
        const Sysfsctl      : scno = 0x20000f2
        const Sysinitgroups : scno = 0x20000f3
        const Sysposix_spawn    : scno = 0x20000f4
        const Sysffsctl     : scno = 0x20000f5
        const Sysnfsclnt    : scno = 0x20000f7
        const Sysfhopen     : scno = 0x20000f8
        const Sysminherit   : scno = 0x20000fa
        const Syssemsys     : scno = 0x20000fb
        const Sysmsgsys     : scno = 0x20000fc
        const Sysshmsys     : scno = 0x20000fd
        const Syssemctl     : scno = 0x20000fe
        const Syssemget     : scno = 0x20000ff
        const Syssemop      : scno = 0x2000100
        const Sysmsgctl     : scno = 0x2000102
        const Sysmsgget     : scno = 0x2000103
        const Sysmsgsnd     : scno = 0x2000104
        const Sysmsgrcv     : scno = 0x2000105
        const Sysshmat      : scno = 0x2000106
        const Sysshmctl     : scno = 0x2000107
        const Sysshmdt      : scno = 0x2000108
        const Sysshmget     : scno = 0x2000109
        const Sysshm_open   : scno = 0x200010a
        const Sysshm_unlink : scno = 0x200010b
        const Syssem_open   : scno = 0x200010c
        const Syssem_close  : scno = 0x200010d
        const Syssem_unlink : scno = 0x200010e
        const Syssem_wait   : scno = 0x200010f
        const Syssem_trywait    : scno = 0x2000110
        const Syssem_post   : scno = 0x2000111
        const Syssem_getvalue   : scno = 0x2000112
        const Syssem_init   : scno = 0x2000113
        const Syssem_destroy    : scno = 0x2000114
        const Sysopen_extended  : scno = 0x2000115
        const Sysumask_extended : scno = 0x2000116
        const Sysstat_extended  : scno = 0x2000117
        const Syslstat_extended : scno = 0x2000118
        const Sysfstat_extended : scno = 0x2000119
        const Syschmod_extended : scno = 0x200011a
        const Sysfchmod_extended    : scno = 0x200011b
        const Sysaccess_extended    : scno = 0x200011c
        const Syssettid     : scno = 0x200011d
        const Sysgettid     : scno = 0x200011e
        const Syssetsgroups : scno = 0x200011f
        const Sysgetsgroups : scno = 0x2000120
        const Syssetwgroups : scno = 0x2000121
        const Sysgetwgroups : scno = 0x2000122
        const Sysmkfifo_extended    : scno = 0x2000123
        const Sysmkdir_extended : scno = 0x2000124
        const Sysidentitysvc    : scno = 0x2000125
        const Sysshared_region_check_np : scno = 0x2000126
        const Sysshared_region_map_np   : scno = 0x2000127
        const Sysvm_pressure_monitor    : scno = 0x2000128
        const Syspsynch_rw_longrdlock   : scno = 0x2000129
        const Syspsynch_rw_yieldwrlock  : scno = 0x200012a
        const Syspsynch_rw_downgrade    : scno = 0x200012b
        const Syspsynch_rw_upgrade  : scno = 0x200012c
        const Syspsynch_mutexwait   : scno = 0x200012d
        const Syspsynch_mutexdrop   : scno = 0x200012e
        const Syspsynch_cvbroad : scno = 0x200012f
        const Syspsynch_cvsignal    : scno = 0x2000130
        const Syspsynch_cvwait  : scno = 0x2000131
        const Syspsynch_rw_rdlock   : scno = 0x2000132
        const Syspsynch_rw_wrlock   : scno = 0x2000133
        const Syspsynch_rw_unlock   : scno = 0x2000134
        const Syspsynch_rw_unlock2  : scno = 0x2000135
        const Sysgetsid     : scno = 0x2000136
        const Syssettid_with_pid    : scno = 0x2000137
        const Sysaio_fsync  : scno = 0x2000139
        const Sysaio_return : scno = 0x200013a
        const Sysaio_suspend    : scno = 0x200013b
        const Sysaio_cancel : scno = 0x200013c
        const Sysaio_error  : scno = 0x200013d
        const Sysaio_read   : scno = 0x200013e
        const Sysaio_write  : scno = 0x200013f
        const Syslio_listio : scno = 0x2000140
        const Sysiopolicysys    : scno = 0x2000142
        const Sysmlockall   : scno = 0x2000144
        const Sysmunlockall : scno = 0x2000145
        const Sysissetugid  : scno = 0x2000147
        const Sys__pthread_kill : scno = 0x2000148
        const Sys__pthread_sigmask  : scno = 0x2000149
        const Sys__sigwait  : scno = 0x200014a
        const Sys__disable_threadsignal : scno = 0x200014b
        const Sys__pthread_markcancel   : scno = 0x200014c
        const Sys__pthread_canceled : scno = 0x200014d
        const Sys__semwait_signal   : scno = 0x200014e
        const Sysproc_info  : scno = 0x2000150
        const Syssendfile   : scno = 0x2000151
        const Sysstat64     : scno = 0x2000152
        const Sysfstat64    : scno = 0x2000153
        const Syslstat64    : scno = 0x2000154
        const Sysstat64_extended    : scno = 0x2000155
        const Syslstat64_extended   : scno = 0x2000156
        const Sysfstat64_extended   : scno = 0x2000157
        const Sysgetdirentries64    : scno = 0x2000158
        const Sysstatfs64   : scno = 0x2000159
        const Sysfstatfs64  : scno = 0x200015a
        const Sysgetfsstat64    : scno = 0x200015b
        const Sys__pthread_chdir    : scno = 0x200015c
        const Sys__pthread_fchdir   : scno = 0x200015d
        const Sysaudit      : scno = 0x200015e
        const Sysauditon    : scno = 0x200015f
        const Sysgetauid    : scno = 0x2000161
        const Syssetauid    : scno = 0x2000162
        const Sysgetaudit   : scno = 0x2000163
        const Syssetaudit   : scno = 0x2000164
        const Sysgetaudit_addr  : scno = 0x2000165
        const Syssetaudit_addr  : scno = 0x2000166
        const Sysauditctl   : scno = 0x2000167
        const Sysbsdthread_create   : scno = 0x2000168
        const Sysbsdthread_terminate    : scno = 0x2000169
        const Syskqueue     : scno = 0x200016a
        const Syskevent     : scno = 0x200016b
        const Syslchown     : scno = 0x200016c
        const Sysstack_snapshot : scno = 0x200016d
        const Sysbsdthread_register : scno = 0x200016e
        const Sysworkq_open : scno = 0x200016f
        const Sysworkq_kernreturn   : scno = 0x2000170
        const Syskevent64   : scno = 0x2000171
        const Sys__old_semwait_signal   : scno = 0x2000172
        const Sys__old_semwait_signal_nocancel  : scno = 0x2000173
        const Systhread_selfid  : scno = 0x2000174
        const Sys__mac_execve   : scno = 0x200017c
        const Sys__mac_syscall  : scno = 0x200017d
        const Sys__mac_get_file : scno = 0x200017e
        const Sys__mac_set_file : scno = 0x200017f
        const Sys__mac_get_link : scno = 0x2000180
        const Sys__mac_set_link : scno = 0x2000181
        const Sys__mac_get_proc : scno = 0x2000182
        const Sys__mac_set_proc : scno = 0x2000183
        const Sys__mac_get_fd   : scno = 0x2000184
        const Sys__mac_set_fd   : scno = 0x2000185
        const Sys__mac_get_pid  : scno = 0x2000186
        const Sys__mac_get_lcid : scno = 0x2000187
        const Sys__mac_get_lctx : scno = 0x2000188
        const Sys__mac_set_lctx : scno = 0x2000189
        const Syssetlcid    : scno = 0x200018a
        const Sysgetlcid    : scno = 0x200018b
        const Sysread_nocancel  : scno = 0x200018c
        const Syswrite_nocancel : scno = 0x200018d
        const Sysopen_nocancel  : scno = 0x200018e
        const Sysclose_nocancel : scno = 0x200018f
        const Syswait4_nocancel : scno = 0x2000190
        const Sysrecvmsg_nocancel   : scno = 0x2000191
        const Syssendmsg_nocancel   : scno = 0x2000192
        const Sysrecvfrom_nocancel  : scno = 0x2000193
        const Sysaccept_nocancel    : scno = 0x2000194
        const Sysmsync_nocancel     : scno = 0x2000195
        const Sysfcntl_nocancel     : scno = 0x2000196
        const Sysselect_nocancel    : scno = 0x2000197
        const Sysfsync_nocancel     : scno = 0x2000198
        const Sysconnect_nocancel   : scno = 0x2000199
        const Syssigsuspend_nocancel    : scno = 0x200019a
        const Sysreadv_nocancel     : scno = 0x200019b
        const Syswritev_nocancel    : scno = 0x200019c
        const Syssendto_nocancel    : scno = 0x200019d
        const Syspread_nocancel     : scno = 0x200019e
        const Syspwrite_nocancel    : scno = 0x200019f
        const Syswaitid_nocancel    : scno = 0x20001a0
        const Syspoll_nocancel      : scno = 0x20001a1
        const Sysmsgsnd_nocancel    : scno = 0x20001a2
        const Sysmsgrcv_nocancel    : scno = 0x20001a3
        const Syssem_wait_nocancel  : scno = 0x20001a4
        const Sysaio_suspend_nocancel   : scno = 0x20001a5
        const Sys__sigwait_nocancel : scno = 0x20001a6
        const Sys__semwait_signal_nocancel  : scno = 0x20001a7
        const Sys__mac_mount        : scno = 0x20001a8
        const Sys__mac_get_mount    : scno = 0x20001a9
        const Sys__mac_getfsstat    : scno = 0x20001aa
        const Sysfsgetpath      : scno = 0x20001ab
        const Sysaudit_session_self : scno = 0x20001ac
        const Sysaudit_session_join : scno = 0x20001ad
        const Syspid_suspend        : scno = 0x20001ae
        const Syspid_resume     : scno = 0x20001af
        const Sysfileport_makeport  : scno = 0x20001b0
        const Sysfileport_makefd    : scno = 0x20001b1

        extern const syscall : (sc:scno, args:... -> int64)

        /* process control */
        const exit  : (status:int -> void)
        const getpid    : ( -> pid)
        const kill  : (pid : pid, sig:int64 -> int64)
        const fork  : (-> pid)
        const wait4 : (pid : pid, loc:int32#, opt : int64, rusage:rusage#   -> int64)
        const waitpid   : (pid : pid, loc:int32#, opt : int64   -> int64)
        const execv : (cmd : byte[:], args : byte[:][:] -> int64)
        const execve    : (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
        /* wrappers to extract wait status */
        const waitstatus    : (st : int32 -> waitstatus)

        /* file manipulation */
        const open  : (path:byte[:], opts:fdopt -> fd)
        const openmode  : (path:byte[:], opts:fdopt, mode:int64 -> fd)
        const close : (fd:fd -> int64)
        const creat : (path:byte[:], mode:int64 -> fd)
        const unlink    : (path:byte[:] -> int)
        const read  : (fd:fd, buf:byte[:] -> size)
        const write : (fd:fd, buf:byte[:] -> size)
        const lseek : (fd:fd, off:off, whence:whence -> off)
        const stat  : (path:byte[:], sb:statbuf# -> int64)
        const lstat : (path:byte[:], sb:statbuf# -> int64)
        const fstat : (fd:fd, sb:statbuf# -> int64)
        const mkdir : (path : byte[:], mode : int64 -> int64)
        generic ioctl   : (fd:fd, req : int64, args:@a# -> int64)
        const getdirentries64   : (fd : fd, buf : byte[:], basep : int64# -> int64)
        const chdir : (p : byte[:] -> int64)

        /* fd stuff */
        const pipe  : (fd : fd[2]# -> int64)
        const dup   : (fd : fd -> fd)
        const dup2  : (src : fd, dst : fd -> fd)
        /* NB: the C ABI uses '...' for the args. */
        const fcntl : (fd : fd, cmd : fcntlcmd, args : byte# -> int64)

        /* kqueue */
        const kqueue    : (-> fd)
        const kevent    : (q : fd, cl : kevent[:], el : kevent[:], flg : kflags, timeout : timespec# -> int64)
        const kevent64  : (q : fd, cl : kevent64[:], el : kevent64[:], flg : kflags, timeout : timespec# -> int64)



        /* networking */
        const socket    : (dom : sockfam, stype : socktype, proto : sockproto   -> fd)
        const connect   : (sock : fd, addr : sockaddr#, len : size -> int)
        const accept    : (sock : fd, addr : sockaddr#, len : size# -> fd)
        const listen    : (sock : fd, backlog : int -> int)
        const bind  : (sock : fd, addr : sockaddr#, len : size -> int)


        /* memory mapping */
        const munmap    : (addr:byte#, len:size -> int64)
        const mmap  : (addr:byte#, len:size, prot:mprot, flags:mopt, fd:fd, off:off -> byte#)

        /* time */
        const gettimeofday  : (tv : timeval#, tz : timezone# -> int)
        const settimeofday  : (tv : timeval#, tz : timezone# -> int)
        /* faked with gettimeofday */
        const clock_getres  : (clk : clock, ts : timespec# -> int)
        const clock_gettime : (clk : clock, ts : timespec# -> int)
        const clock_settime : (clk : clock, ts : timespec# -> int)
        /* FIXME: HACK HACK HACK -- does nothing */
        const sleep : (time : uint64 -> int32)

        /* system information */
        const uname     : (buf : utsname# -> int)
        const sysctl    : (mib : int[:], old : byte[:]#, new : byte[:] -> int)

        /* filled by start code */
        extern const __cenvp : byte##
        extern const __environment : byte[:][:]
;;