shithub: mc

ref: dfe28e0a978ca1acb738b2718a3ef2bd1617ed9a
dir: /libstd/sys+linux-x64.myr/

View raw version
use "systypes.use"

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 clock = union
		`Clockrealtime
		`Clockmonotonic
		`Clockproccpu
		`Clockthreadcpu
		`Clockmonotonicraw
		`Clockrealtimecoarse
		`Clockmonotoniccoarse
		`Clockboottime
		`Clockrealtimealarm
		`Clockboottimealarm
	;;

	type waitstatus = union
		`Waitexit int32
		`Waitsig  int32
		`Waitstop 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_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	= 0
	const Epollctlmod	: epollop	= 1
	const Epollctldel	: epollop	= 1

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

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

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

/* 
wraps a syscall argument, converting it to 64 bits for the syscall function.
This is the same as casting, but more concise than writing castto(int64).
*/
generic a = {x : @t; -> x castto(uint64)}

/* asm stubs from util.s */
extern const cstring	: (str : byte[:] -> byte#)
extern const alloca	: (sz : size	-> byte#)

/* process management */
const exit	= {status;		syscall(Sysexit, a(status))}
const exit_group	= {status;	syscall(Sysexit_group, a(status))}
const getpid	= {;			-> syscall(Sysgetpid) castto(pid)}
const kill	= {pid, sig;		-> syscall(Syskill, a(pid), a(sig))}
const fork	= {;			-> syscall(Sysfork) castto(pid)}
const clone	= {flags, stk, ptid, ctid, ptreg;	-> syscall(Sysclone, a(flags), a(stk), a(ptid), a(ctid), a(ptreg)) castto(pid)}
const wait4	= {pid, loc, opt, usage;	-> syscall(Syswait4, a(pid), a(loc), a(opt), a(usage))}
const waitpid	= {pid, loc, opt;
	var rusage
	-> wait4(pid, loc, opt, &rusage)
}

const execv	= {cmd, args
	var p, cargs, i

	/* of course we fucking have to duplicate this code everywhere,
	* since we want to stack allocate... */
	p = alloca((args.len + 1)*sizeof(byte#))
	cargs = (p castto(byte##))[:args.len + 1]
	for i = 0; i < args.len; i++
		cargs[i] = cstring(args[i])
	;;
	cargs[args.len] = 0 castto(byte#)
	-> syscall(Sysexecve, cstring(cmd), a(p), a(__cenvp))
}

const execve	= {cmd, args, env
	var cargs, cenv, i
	var p

	/* copy the args */
	p = alloca((args.len + 1)*sizeof(byte#))
	cargs = (p castto(byte##))[:args.len + 1]
	for i = 0; i < args.len; i++
		cargs[i] = cstring(args[i])
	;;
	cargs[args.len] = 0 castto(byte#)

	/*
	 copy the env.
	 of course we fucking have to duplicate this code everywhere,
	 since we want to stack allocate... 
	*/
	p = alloca((env.len + 1)*sizeof(byte#))
	cenv = (p castto(byte##))[:env.len]
	for i = 0; i < env.len; i++
		cenv[i] = cstring(env[i])
	;;
	cenv[env.len] = 0 castto(byte#)

	-> syscall(Sysexecve, cstring(cmd), a(p), a(cenv))
}

/* file manipulation */
const open	= {path, opts;		-> syscall(Sysopen, cstring(path), a(opts), a(0o777)) castto(fd)}
const openmode	= {path, opts, mode;	-> syscall(Sysopen, cstring(path), a(opts), a(mode)) castto(fd)}
const close	= {fd;			-> syscall(Sysclose, a(fd))}
const creat	= {path, mode;		-> syscall(Syscreat, cstring(path), a(mode)) castto(fd)}
const unlink	= {path;		-> syscall(Sysunlink, cstring(path)) castto(int)}
const read	= {fd, buf;		-> syscall(Sysread, a(fd), buf castto(byte#), a(buf.len)) castto(size)}
const write	= {fd, buf;		-> syscall(Syswrite, a(fd), buf castto(byte#), a(buf.len)) castto(size)}
const lseek	= {fd, off, whence;	-> syscall(Syslseek, a(fd), a(off), a(whence))}
const stat	= {path, sb;		-> syscall(Sysstat, cstring(path), a(sb))}
const lstat	= {path, sb;		-> syscall(Syslstat, cstring(path), a(sb))}
const fstat	= {fd, sb;		-> syscall(Sysfstat, a(fd), a(sb))}
const mkdir	= {path, mode;		-> syscall(Sysmkdir, cstring(path), a(mode)) castto(int64)}
generic ioctl	= {fd, req, arg;	-> syscall(Sysioctl, a(fd), a(req), a(arg)) castto(int64)}
const getdents64	= {fd, buf;	-> syscall(Sysgetdents64, a(fd), buf castto(byte#), a(buf.len))}
const chdir	= {dir;	-> syscall(Syschdir, cstring(dir))}
const getcwd	= {buf;	-> syscall(Sysgetcwd, a(buf), a(buf.len))}

/* file stuff */
const pipe	= {fds;	-> syscall(Syspipe, a(fds))}
const dup 	= {fd;	-> syscall(Sysdup, a(fd)) castto(fd)}
const dup2 	= {src, dst;	-> syscall(Sysdup2, a(src), a(dst)) castto(fd)}

/* epoll */
const poll	= {pfd, timeout;	-> syscall(Syspoll, pfd castto(pollfd#), a(pfd.len), a(timeout)) castto(int)}
const epollctl	= {epfd, op, fd, evt;
	-> syscall(Sysepoll_ctl, a(epfd), a(op), a(fd), a(evt)) castto(int)}
const epollwait	= {epfd, evts, timeout;
	-> syscall(Sysepoll_wait, a(epfd), evts castto(epollevt#), a(evts.len), a(timeout)) castto(int)}
const epollcreate	= {flg;	-> syscall(Sysepoll_create1, a(flg)) castto(fd)}

/* networking */
const socket	= {dom, stype, proto;	-> syscall(Syssocket, a(dom), a(stype), a(proto)) castto(fd)}
const connect	= {sock, addr, len;	-> syscall(Sysconnect, a(sock), a(addr), a(len)) castto(int)}
const bind	= {sock, addr, len;	-> syscall(Sysbind, a(sock), a(addr), a(len)) castto(int)}
const listen	= {sock, backlog;	-> syscall(Syslisten, a(sock), a(backlog)) castto(int)}
const accept	= {sock, addr, lenp;	-> syscall(Sysaccept, a(sock), a(addr), a(lenp)) castto(fd)}

/* memory mapping */
const munmap	= {addr, len;		-> syscall(Sysmunmap, a(addr), a(len))}
const mmap	= {addr, len, prot, flags, fd, off;
	-> syscall(Sysmmap, a(addr), a(len), a(prot), a(flags), a(fd), a(off)) castto(byte#)
}

/* time */
const clock_getres = {clk, ts;	-> syscall(Sysclock_getres, clockid(clk), a(ts)) castto(int32)}
const clock_gettime = {clk, ts;	-> syscall(Sysclock_gettime, clockid(clk), a(ts)) castto(int32)}
const clock_settime = {clk, ts;	-> syscall(Sysclock_settime, clockid(clk), a(ts)) castto(int32)}

const sleep = {time
	var req, rem
	req = [.sec = time, .nsec = 0]
	-> nanosleep(&req, &rem)
}

const nanosleep	= {req, rem;	-> syscall(Sysnanosleep, a(req), a(rem)) castto(int32)}

/* system information */
const uname	= {buf;	-> syscall(Sysuname, buf) castto(int)}

const clockid = {clk
	match clk
	| `Clockrealtime:	-> 0
	| `Clockmonotonic:	-> 1
	| `Clockproccpu:	-> 2
	| `Clockthreadcpu:	-> 3
	| `Clockmonotonicraw:	-> 4
	| `Clockrealtimecoarse:	-> 5
	| `Clockmonotoniccoarse:-> 6
	| `Clockboottime:	-> 7
	| `Clockrealtimealarm:	-> 8
	| `Clockboottimealarm:	-> 9
	;;
	-> -1
}


const waitstatus = {st
	if st & 0x7f == 0 /* if exited */
		-> `Waitexit ((st & 0xff00) >> 8)
	elif ((st & 0xffff)-1) < 0xff /* if signaled */
		-> `Waitsig ((st) & 0x7f)
	elif (((st & 0xffff)*0x10001)>>8) > 0x7f00
		-> `Waitstop ((st & 0xff00) >> 8)
	;;
}