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##
;;