Eigenstate : Linux

Linux System Calls

The sys package, when compiled for Linux, contained an interface to the Linux 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, just as the kernel provides the error.

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[:].

Exported Symbols

pkg sys =
        type scno   = int64 /* syscall */

        /* processes/threads */
        type pid    = int   /* process id */
        type tid    = int   /* thread id */
        type cloneopt   = int64 /* options for clone(2) */

        /* file descriptor manipulation */
        type fdopt  = int64 /* fd options */
        type fd     = int32 /* fd */
        type whence = uint64    /* seek from whence */
        type filemode   = uint32    /* file open mode */

        type mprot  = int64 /* memory protection */
        type mopt   = int64 /* memory mapping options */
        type socktype   = int64 /* socket type */
        type sockproto  = int64 /* socket protocol */
        type sockfam    = uint16    /* socket family */

        type epollflags = uint32
        type epollop    = uint32
        type epollevttype   = uint32

        type pollevt    = uint16

        type futexop    = uint32

        type clock = union
                `Clockrealtime
                `Clockmonotonic
                `Clockproccpu
                `Clockthreadcpu
                `Clockmonotonicraw
                `Clockrealtimecoarse
                `Clockmonotoniccoarse
                `Clockboottime
                `Clockrealtimealarm
                `Clockboottimealarm
        ;;

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

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

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

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

        type statbuf = struct
                dev : uint64
                ino : uint64
                nlink   : uint64
                mode    : filemode
                uid : uint32
                gid : uint32
                __pad0  : uint32
                rdev    : uint64
                size    : uint64
                blksz   : uint32
                blocks  : uint64
                atime   : timespec
                mtime   : timespec
                ctime   : timespec
                __pad1  : uint64[3]
        ;;

        type dirent64 = struct
                ino : uint64
                off : uint64
                reclen  : uint16
                etype   : byte
                name    : byte[...] /* special case; zero length => unchecked indexing */
        ;;

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

        type sockaddr = struct
                fam : sockfam
                data    : byte[14]
        ;;

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

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

        type sockaddr_storage = struct
                fam : sockfam
                __align : uint32
                __pad   : byte[112]
        ;;

        type epollevt = struct
                events  : epollevttype
                data    : byte[8]
        ;;

        type pollfd = struct
                fd  : fd
                events  : pollevt
                revents : pollevt
        ;;

        /* clone options */
        const Clonesignal   : cloneopt = 0xff
        const Clonevm       : cloneopt = 0x100
        const Clonefs       : cloneopt = 0x200
        const Clonefiles    : cloneopt = 0x400
        const Clonesighand  : cloneopt = 0x800
        const Cloneptrace   : cloneopt = 0x2000
        const Clonevfork    : cloneopt = 0x4000
        const Cloneparent   : cloneopt = 0x8000
        const Clonethread   : cloneopt = 0x10000
        const Clonenewns    : cloneopt = 0x20000
        const Clonesysvsem  : cloneopt = 0x40000
        const Clonesettls   : cloneopt = 0x80000
        const Cloneparentsettid : cloneopt = 0x100000
        const Clonechildcleartid: cloneopt = 0x200000
        const Clonedetached : cloneopt = 0x400000
        const Cloneuntraced : cloneopt = 0x800000
        const Clonechildsettid  : cloneopt = 0x1000000
        const Clonenewuts   : cloneopt = 0x4000000
        const Clonenewipc   : cloneopt = 0x8000000
        const Clonenewuser  : cloneopt = 0x10000000
        const Clonenewpid   : cloneopt = 0x20000000
        const Clonenewnet   : cloneopt = 0x40000000
        const Cloneio       : cloneopt = 0x80000000

        type ptregs = struct
        ;;

        /* open options */
        const Ordonly   : fdopt = 0x0
        const Owronly   : fdopt = 0x1
        const Ordwr     : fdopt = 0x2
        const Ocreat    : fdopt = 0x40
        const Oexcl     : fdopt = 0x80
        const Otrunc    : fdopt = 0x200
        const Oappend   : fdopt = 0x400
        const Ondelay   : fdopt = 0x800
        const Odirect   : fdopt = 0x4000
        const Odir  : fdopt = 0x10000
        const Onofollow : fdopt = 0x20000

        /* 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 /* convenience */

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

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

        /* socket types. */
        const Sockstream    : socktype = 1  /* sequenced, reliable byte stream */
        const Sockdgram     : socktype = 2  /* datagrams */
        const Sockraw       : socktype = 3  /* raw proto */
        const Sockrdm       : socktype = 4  /* reliably delivered messages */
        const Sockseqpacket : socktype = 5  /* sequenced, reliable packets */
        const Sockdccp      : socktype = 6  /* data congestion control protocol */
        const Sockpack      : socktype = 10 /* linux specific packet */

        /* 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

        /* epoll flags */
        const Epollcloexec  : epollflags    = 0o2000000

        /* epoll ops */
        const Epollctladd   : epollop   = 1
        const Epollctlmod   : epollop   = 2
        const Epollctldel   : epollop   = 3

        /* epoll events */
        const Epollin   : epollevttype = 0x001
        const Epollpri  : epollevttype = 0x002
        const Epollout  : epollevttype = 0x004
        const Epollerr  : epollevttype = 0x008
        const Epollhup  : epollevttype = 0x010
        const Epollrdnorm   : epollevttype = 0x040
        const Epollrdband   : epollevttype = 0x080
        const Epollwrnorm   : epollevttype = 0x100
        const Epollwrband   : epollevttype = 0x200
        const Epollmsg      : epollevttype = 0x400
        const Epollrdhup    : epollevttype = 0x2000
        const Epollwakeup   : epollevttype = 1 << 29
        const Epolloneshot  : epollevttype = 1 << 30
        const Epolledge : epollevttype = 1 << 31

        /* futex ops */
        const Futexwait : futexop = 0
        const Futexwake : futexop = 1
        /* Futexfd: removed */
        const Futexrequeue  : futexop = 3
        const Futexcmprequeue   : futexop = 4
        const Futexwakeop   : futexop = 5
        const Futexlockpi   : futexop = 6
        const Futexunlockpi : futexop = 7
        const Futextrylockpi    : futexop = 8
        const Futexwaitbitset   : futexop = 9
        const Futexwakebitset   : futexop = 10
        const Futexwaitrequeuepi    : futexop = 11
        const Futexcmprequeuepi : futexop = 12

        const Futexpriv : futexop = 128
        const Futexclockrt  : futexop = 256

        /* poll events : posix */
        const Pollin    : pollevt = 0x001   /* There is data to read.  */
        const Pollpri   : pollevt = 0x002   /* There is urgent data to read.  */
        const Pollout   : pollevt = 0x004   /* Writing now will not block.  */

        /* poll events: xopen */
        const Pollrdnorm    : pollevt = 0x040   /* Normal data may be read.  */
        const Pollrdband    : pollevt = 0x080   /* Priority data may be read.  */
        const Pollwrnorm    : pollevt = 0x100   /* Writing now will not block.  */
        const Pollwrband    : pollevt = 0x200   /* Priority data may be written.  */

        /* poll events: linux */
        const Pollmsg       : pollevt = 0x400
        const Pollremove    : pollevt = 0x1000
        const Pollrdhup     : pollevt = 0x2000

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

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

        /* syscalls */
        const Sysread           : scno = 0
        const Syswrite          : scno = 1
        const Sysopen           : scno = 2
        const Sysclose          : scno = 3
        const Sysstat           : scno = 4
        const Sysfstat          : scno = 5
        const Syslstat          : scno = 6
        const Syspoll           : scno = 7
        const Syslseek          : scno = 8
        const Sysmmap           : scno = 9
        const Sysmprotect       : scno = 10
        const Sysmunmap         : scno = 11
        const Sysbrk            : scno = 12
        const Sysrt_sigaction       : scno = 13
        const Sysrt_sigprocmask     : scno = 14
        const Sysrt_sigreturn       : scno = 15
        const Sysioctl          : scno = 16
        const Syspread64        : scno = 17
        const Syspwrite64       : scno = 18
        const Sysreadv          : scno = 19
        const Syswritev         : scno = 20
        const Sysaccess         : scno = 21
        const Syspipe           : scno = 22
        const Sysselect         : scno = 23
        const Syssched_yield        : scno = 24
        const Sysmremap         : scno = 25
        const Sysmsync          : scno = 26
        const Sysmincore        : scno = 27
        const Sysmadvise        : scno = 28
        const Sysshmget         : scno = 29
        const Sysshmat          : scno = 30
        const Sysshmctl         : scno = 31
        const Sysdup            : scno = 32
        const Sysdup2           : scno = 33
        const Syspause          : scno = 34
        const Sysnanosleep      : scno = 35
        const Sysgetitimer      : scno = 36
        const Sysalarm          : scno = 37
        const Syssetitimer      : scno = 38
        const Sysgetpid         : scno = 39
        const Syssendfile       : scno = 40
        const Syssocket         : scno = 41
        const Sysconnect        : scno = 42
        const Sysaccept         : scno = 43
        const Syssendto         : scno = 44
        const Sysrecvfrom       : scno = 45
        const Syssendmsg        : scno = 46
        const Sysrecvmsg        : scno = 47
        const Sysshutdown       : scno = 48
        const Sysbind           : scno = 49
        const Syslisten         : scno = 50
        const Sysgetsockname        : scno = 51
        const Sysgetpeername        : scno = 52
        const Syssocketpair     : scno = 53
        const Syssetsockopt     : scno = 54
        const Sysgetsockopt     : scno = 55
        const Sysclone          : scno = 56
        const Sysfork           : scno = 57
        const Sysvfork          : scno = 58
        const Sysexecve         : scno = 59
        const Sysexit           : scno = 60
        const Syswait4          : scno = 61
        const Syskill           : scno = 62
        const Sysuname          : scno = 63
        const Syssemget         : scno = 64
        const Syssemop          : scno = 65
        const Syssemctl         : scno = 66
        const Sysshmdt          : scno = 67
        const Sysmsgget         : scno = 68
        const Sysmsgsnd         : scno = 69
        const Sysmsgrcv         : scno = 70
        const Sysmsgctl         : scno = 71
        const Sysfcntl          : scno = 72
        const Sysflock          : scno = 73
        const Sysfsync          : scno = 74
        const Sysfdatasync      : scno = 75
        const Systruncate       : scno = 76
        const Sysftruncate      : scno = 77
        const Sysgetdents       : scno = 78
        const Sysgetcwd         : scno = 79
        const Syschdir          : scno = 80
        const Sysfchdir         : scno = 81
        const Sysrename         : scno = 82
        const Sysmkdir          : scno = 83
        const Sysrmdir          : scno = 84
        const Syscreat          : scno = 85
        const Syslink           : scno = 86
        const Sysunlink         : scno = 87
        const Syssymlink        : scno = 88
        const Sysreadlink       : scno = 89
        const Syschmod          : scno = 90
        const Sysfchmod         : scno = 91
        const Syschown          : scno = 92
        const Sysfchown         : scno = 93
        const Syslchown         : scno = 94
        const Sysumask          : scno = 95
        const Sysgettimeofday       : scno = 96
        const Sysgetrlimit      : scno = 97
        const Sysgetrusage      : scno = 98
        const Syssysinfo        : scno = 99
        const Systimes          : scno = 100
        const Sysptrace         : scno = 101
        const Sysgetuid         : scno = 102
        const Syssyslog         : scno = 103
        const Sysgetgid         : scno = 104
        const Syssetuid         : scno = 105
        const Syssetgid         : scno = 106
        const Sysgeteuid        : scno = 107
        const Sysgetegid        : scno = 108
        const Syssetpgid        : scno = 109
        const Sysgetppid        : scno = 110
        const Sysgetpgrp        : scno = 111
        const Syssetsid         : scno = 112
        const Syssetreuid       : scno = 113
        const Syssetregid       : scno = 114
        const Sysgetgroups      : scno = 115
        const Syssetgroups      : scno = 116
        const Syssetresuid      : scno = 117
        const Sysgetresuid      : scno = 118
        const Syssetresgid      : scno = 119
        const Sysgetresgid      : scno = 120
        const Sysgetpgid        : scno = 121
        const Syssetfsuid       : scno = 122
        const Syssetfsgid       : scno = 123
        const Sysgetsid         : scno = 124
        const Syscapget         : scno = 125
        const Syscapset         : scno = 126
        const Sysrt_sigpending      : scno = 127
        const Sysrt_sigtimedwait    : scno = 128
        const Sysrt_sigqueueinfo    : scno = 129
        const Sysrt_sigsuspend      : scno = 130
        const Syssigaltstack        : scno = 131
        const Sysutime          : scno = 132
        const Sysmknod          : scno = 133
        const Sysuselib         : scno = 134
        const Syspersonality        : scno = 135
        const Sysustat          : scno = 136
        const Sysstatfs         : scno = 137
        const Sysfstatfs        : scno = 138
        const Syssysfs          : scno = 139
        const Sysgetpriority        : scno = 140
        const Syssetpriority        : scno = 141
        const Syssched_setparam     : scno = 142
        const Syssched_getparam     : scno = 143
        const Syssched_setscheduler : scno = 144
        const Syssched_getscheduler : scno = 145
        const Syssched_get_priority_max : scno = 146
        const Syssched_get_priority_min : scno = 147
        const Syssched_rr_get_interval  : scno = 148
        const Sysmlock          : scno = 149
        const Sysmunlock        : scno = 150
        const Sysmlockall       : scno = 151
        const Sysmunlockall     : scno = 152
        const Sysvhangup        : scno = 153
        const Sysmodify_ldt     : scno = 154
        const Syspivot_root     : scno = 155
        const Sys_sysctl        : scno = 156
        const Sysprctl          : scno = 157
        const Sysarch_prctl     : scno = 158
        const Sysadjtimex       : scno = 159
        const Syssetrlimit      : scno = 160
        const Syschroot         : scno = 161
        const Syssync           : scno = 162
        const Sysacct           : scno = 163
        const Syssettimeofday       : scno = 164
        const Sysmount          : scno = 165
        const Sysumount2        : scno = 166
        const Sysswapon         : scno = 167
        const Sysswapoff        : scno = 168
        const Sysreboot         : scno = 169
        const Syssethostname        : scno = 170
        const Syssetdomainname      : scno = 171
        const Sysiopl           : scno = 172
        const Sysioperm         : scno = 173
        const Syscreate_module      : scno = 174
        const Sysinit_module        : scno = 175
        const Sysdelete_module      : scno = 176
        const Sysget_kernel_syms    : scno = 177
        const Sysquery_module       : scno = 178
        const Sysquotactl       : scno = 179
        const Sysnfsservctl     : scno = 180
        const Sysgetpmsg        : scno = 181
        const Sysputpmsg        : scno = 182
        const Sysafs_syscall        : scno = 183
        const Systuxcall        : scno = 184
        const Syssecurity       : scno = 185
        const Sysgettid         : scno = 186
        const Sysreadahead      : scno = 187
        const Syssetxattr       : scno = 188
        const Syslsetxattr      : scno = 189
        const Sysfsetxattr      : scno = 190
        const Sysgetxattr       : scno = 191
        const Syslgetxattr      : scno = 192
        const Sysfgetxattr      : scno = 193
        const Syslistxattr      : scno = 194
        const Sysllistxattr     : scno = 195
        const Sysflistxattr     : scno = 196
        const Sysremovexattr        : scno = 197
        const Syslremovexattr       : scno = 198
        const Sysfremovexattr       : scno = 199
        const Systkill          : scno = 200
        const Systime           : scno = 201
        const Sysfutex          : scno = 202
        const Syssched_setaffinity  : scno = 203
        const Syssched_getaffinity  : scno = 204
        const Sysset_thread_area    : scno = 205
        const Sysio_setup       : scno = 206
        const Sysio_destroy     : scno = 207
        const Sysio_getevents       : scno = 208
        const Sysio_submit      : scno = 209
        const Sysio_cancel      : scno = 210
        const Sysget_thread_area    : scno = 211
        const Syslookup_dcookie     : scno = 212
        const Sysepoll_create       : scno = 213
        const Sysepoll_ctl_old      : scno = 214
        const Sysepoll_wait_old     : scno = 215
        const Sysremap_file_pages   : scno = 216
        const Sysgetdents64     : scno = 217
        const Sysset_tid_address    : scno = 218
        const Sysrestart_syscall    : scno = 219
        const Syssemtimedop     : scno = 220
        const Sysfadvise64      : scno = 221
        const Systimer_create       : scno = 222
        const Systimer_settime      : scno = 223
        const Systimer_gettime      : scno = 224
        const Systimer_getoverrun   : scno = 225
        const Systimer_delete       : scno = 226
        const Sysclock_settime      : scno = 227
        const Sysclock_gettime      : scno = 228
        const Sysclock_getres       : scno = 229
        const Sysclock_nanosleep    : scno = 230
        const Sysexit_group     : scno = 231
        const Sysepoll_wait     : scno = 232
        const Sysepoll_ctl      : scno = 233
        const Systgkill         : scno = 234
        const Sysutimes         : scno = 235
        const Sysvserver        : scno = 236
        const Sysmbind          : scno = 237
        const Sysset_mempolicy      : scno = 238
        const Sysget_mempolicy      : scno = 239
        const Sysmq_open        : scno = 240
        const Sysmq_unlink      : scno = 241
        const Sysmq_timedsend       : scno = 242
        const Sysmq_timedreceive    : scno = 243
        const Sysmq_notify      : scno = 244
        const Sysmq_getsetattr      : scno = 245
        const Syskexec_load     : scno = 246
        const Syswaitid         : scno = 247
        const Sysadd_key        : scno = 248
        const Sysrequest_key        : scno = 249
        const Syskeyctl         : scno = 250
        const Sysioprio_set     : scno = 251
        const Sysioprio_get     : scno = 252
        const Sysinotify_init       : scno = 253
        const Sysinotify_add_watch  : scno = 254
        const Sysinotify_rm_watch   : scno = 255
        const Sysmigrate_pages      : scno = 256
        const Sysopenat         : scno = 257
        const Sysmkdirat        : scno = 258
        const Sysmknodat        : scno = 259
        const Sysfchownat       : scno = 260
        const Sysfutimesat      : scno = 261
        const Sysnewfstatat     : scno = 262
        const Sysunlinkat       : scno = 263
        const Sysrenameat       : scno = 264
        const Syslinkat         : scno = 265
        const Syssymlinkat      : scno = 266
        const Sysreadlinkat     : scno = 267
        const Sysfchmodat       : scno = 268
        const Sysfaccessat      : scno = 269
        const Syspselect6       : scno = 270
        const Sysppoll          : scno = 271
        const Sysunshare        : scno = 272
        const Sysset_robust_list    : scno = 273
        const Sysget_robust_list    : scno = 274
        const Syssplice         : scno = 275
        const Systee            : scno = 276
        const Syssync_file_range    : scno = 277
        const Sysvmsplice       : scno = 278
        const Sysmove_pages     : scno = 279
        const Sysutimensat      : scno = 280
        const Sysepoll_pwait        : scno = 281
        const Syssignalfd       : scno = 282
        const Systimerfd_create     : scno = 283
        const Syseventfd        : scno = 284
        const Sysfallocate      : scno = 285
        const Systimerfd_settime    : scno = 286
        const Systimerfd_gettime    : scno = 287
        const Sysaccept4        : scno = 288
        const Syssignalfd4      : scno = 289
        const Syseventfd2       : scno = 290
        const Sysepoll_create1      : scno = 291
        const Sysdup3           : scno = 292
        const Syspipe2          : scno = 293
        const Sysinotify_init1      : scno = 294
        const Syspreadv         : scno = 295
        const Syspwritev        : scno = 296
        const Sysrt_tgsigqueueinfo  : scno = 297
        const Sysperf_event_open    : scno = 298
        const Sysrecvmmsg       : scno = 299
        const Sysfanotify_init      : scno = 300
        const Sysfanotify_mark      : scno = 301
        const Sysprlimit64      : scno = 302
        const Sysname_to_handle_at  : scno = 303
        const Sysopen_by_handle_at  : scno = 304
        const Sysclock_adjtime      : scno = 305
        const Syssyncfs         : scno = 306
        const Syssendmmsg       : scno = 307
        const Syssetns          : scno = 308
        const Sysgetcpu         : scno = 309
        const Sysprocess_vm_readv   : scno = 310
        const Sysprocess_vm_writev  : scno = 311

        /* getting to the os */
        extern const syscall    : (sc:scno, args:... -> int64)

        /* process management */
        const exit  : (status:int -> void)
        const exit_group    : (status:int -> void)
        const getpid    : ( -> pid)
        const kill  : (pid:pid, sig:int64 -> int64)
        const fork  : (-> pid)
        /* FIXME: where the fuck is 'struct pt_reg' defined?? */
        const clone : (flags : cloneopt, stk : byte#, ptid : pid#, ctid : pid#, ptreg : byte# -> pid)
        extern const fnclone    : ( flags : cloneopt, \
                                stk : byte#, \
                                ptid : pid#, \
                                tls : byte#, \
                                ctid : pid#, \
                                ptreg : byte#, \
                                fn : void# \    /* we need a raw pointer */ 
                                -> pid)
        const wait4 : (pid:pid, loc:int32#, opt : int64, usage: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 -> int64)
        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, arg:@a# -> int64)
        const getdents64    : (fd:fd, buf : byte[:] -> int64)
        const chdir : (p : byte[:] -> int64)
        const getcwd    : (buf : byte[:] -> int64)

        /* fd stuff */
        const pipe  : (fds : fd[2]# -> int64)
        const dup   : (fd : fd -> fd)
        const dup2  : (src : fd, dst : fd -> fd)

        /* threading */
        const futex : (uaddr : int32#, op : futexop, val : int32, \
                timeout : timespec#, uaddr2 : int32#, val3 : int32 -> int64)

        /* polling */
        const epollcreate   : (flg : epollflags -> fd)  /* actually epoll_create1 */
        const epollctl  : (epfd : fd, op : int, fd : fd, evt : epollevt# -> int)
        const epollwait : (epfd : fd, evts : epollevt[:], timeout : int -> int)
        const poll  : (pfd  : pollfd[:], timeout : int  -> int)

        /* 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 clock_getres  : (clk : clock, ts : timespec# -> int32)
        const clock_gettime : (clk : clock, ts : timespec# -> int32)
        const clock_settime : (clk : clock, ts : timespec# -> int32)
        const sleep : (time : uint64 -> int32)
        const nanosleep : (req : timespec#, rem : timespec# -> int32)

        /* system information */
        const uname     : (buf : utsname# -> int)

        /* exported values: initialized by start code */
        extern const __environment : byte[:][:]
        extern const __cenvp : byte##
;;