ref: 6585d63cfc438f142ca928079aeeefbefe6beca4
parent: da76fcf9b4ea98c73b44c3847ac25468789dce67
author: Ori Bernstein <[email protected]>
date: Mon Dec 22 17:15:01 EST 2014
Add untested stubs for plan9 syscalls.
--- a/libstd/sys+linux-x64.myr
+++ b/libstd/sys+linux-x64.myr
@@ -606,12 +606,10 @@
;;
/*
-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)
+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)
-}
+generic a = {x : @t; -> x castto(uint64)}
/* asm stubs from util.s */
extern const cstring : (str : byte[:] -> byte#)
--- a/libstd/sys+plan9-x64.myr
+++ b/libstd/sys+plan9-x64.myr
@@ -1,0 +1,177 @@
+use "systypes.use"
+
+pkg sys =
+ type pid = int64 /* process id */
+ type scno = int64 /* syscall */
+ type fdopt = int64 /* fd options */
+ type fd = int32 /* fd */
+ type rflags = int32 /* rfork flags */
+
+ const Ordonly : fdopt = 0
+ const Owronly : fdopt = 1
+ const Ordwr : fdopt = 2
+ const Oexec : fdopt = 3
+
+ const Otrunc : fdopt = 16
+ const Ocexec : fdopt = 32
+ const Orclose : fdopt = 64
+ const Oexcl : fdopt = 0x1000
+
+ const Syssysr1 : scno = 0
+ const Sys_errstr : scno = 1
+ const Sysbind : scno = 2
+ const Syschdir : scno = 3
+ const Sysclose : scno = 4
+ const Sysdup : scno = 5
+ const Sysalarm : scno = 6
+ const Sysexec : scno = 7
+ const Sysexits : scno = 8
+ const Sys_fsession : scno = 9
+ const Sysfauth : scno = 10
+ const Sys_fstat : scno = 11
+ const Syssegbrk : scno = 12
+ const Sys_mount : scno = 13
+ const Sysopen : scno = 14
+ const Sys_read : scno = 15
+ const Sysoseek : scno = 16
+ const Syssleep : scno = 17
+ const Sys_stat : scno = 18
+ const Sysrfork : scno = 19
+ const Sys_write : scno = 20
+ const Syspipe : scno = 21
+ const Syscreate : scno = 22
+ const Sysfd2path : scno = 23
+ const Sysbrk_ : scno = 24
+ const Sysremove : scno = 25
+ const Sys_wstat : scno = 26
+ const Sys_fwstat : scno = 27
+ const Sysnotify : scno = 28
+ const Sysnoted : scno = 29
+ const Syssegattach : scno = 30
+ const Syssegdetach : scno = 31
+ const Syssegfree : scno = 32
+ const Syssegflush : scno = 33
+ const Sysrendezvous : scno = 34
+ const Sysunmount : scno = 35
+ const Sys_wait : scno = 36
+ const Syssemacquire : scno = 37
+ const Syssemrelease : scno = 38
+ const Sysseek : scno = 39
+ const Sysfversion : scno = 40
+ const Syserrstr : scno = 41
+ const Sysstat : scno = 42
+ const Sysfstat : scno = 43
+ const Syswstat : scno = 44
+ const Sysfwstat : scno = 45
+ const Sysmount : scno = 46
+ const Sysawait : scno = 47
+ const Syspread : scno = 50
+ const Syspwrite : scno = 51
+ const Systsemacquire : scno = 52
+ const Sys_nsec : scno = 53
+
+
+ const sysr1 : (->int)
+ const bind : (nm : byte[:], old : byte[:] -> int)
+ const chdir : (dir : byte[:] -> int)
+ const close : (fd : fd -> int)
+ const dup : (old : fd, new : fd -> fd)
+ const alarm : (msec : uint32 -> int)
+ const exits : (msg : byte[:] -> int)
+ const fauth : (fd : fd, name : byte[:] -> int)
+ const segbrk : (saddr : void#, addr : void# -> int)
+ const open : (path : byte[:], opt : fdopt -> fd)
+ const sleep : (msec : uint32 -> int)
+ const rfork : (rflags : rflags -> pid)
+ const pipe : (fds : fd[:] -> int)
+ const create : (path : byte[:], opt : fdopt, perm : int -> fd)
+ const fd2path : (fd : fd, path : byte[:] -> int)
+ const remove : (path : byte[:] -> int)
+ const notify : (fn : (a : void#, c : char# -> int) -> int)
+ const noted : (v : int32 -> int)
+ const segattach : (attr : int32, class : byte[:], va : void#, len : uint32 -> int)
+ const segdetach : (va : void# -> int)
+ const segfree : (va : void#, len : uint32 -> int)
+ const segflush : (va : void#, len : uint32 -> int)
+ const unmount : (name : byte[:], old : byte[:] -> int)
+ const errstr : (buf : byte[:] -> int)
+ const stat : (name : byte[:], edir : byte[:] -> int)
+ const fstat : (fd : fd, edir : byte[:] -> int)
+ const wstat : (name : byte[:], edir : byte[:] -> int)
+ const fwstat : (fd : byte[:], edir : byte[:] -> int)
+ const seek : (fd : fd, len : off, ty : int -> off)
+ const mount : (fd : fd, afd : fd, old : byte[:], flag : int32, aname : byte[:] -> int)
+ const await : (buf : byte[:] -> int)
+ const pread : (fd : fd, buf : byte[:], off : off -> size)
+ const pwrite : (fd : fd, buf : byte[:], off : off -> size)
+ const exec : (bin : byte[:], args : byte[:][:] -> int)
+;;
+
+/* asm stub from syscall.s */
+extern const syscall : (scno : scno, args : ... -> int)
+/* asm stubs from util+plan9.s */
+extern const cstring : (str : byte[:] -> byte#)
+extern const alloca : (sz : size -> byte#)
+
+
+generic ptr = {x : @t; -> x castto(byte#)}
+generic len32 = {a : @t[:]; -> a.len castto(uint32)}
+
+const sysr1 = {; -> syscall(Syssysr1)}
+const bind = {name, old; -> syscall(Sysbind, cstring(name), cstring(old))}
+const chdir = {dir; -> syscall(Syschdir, cstring(dir)) }
+const close = {fd; -> syscall(Sysclose, fd)}
+const dup = {ofd, nfd; -> syscall(Sysdup, ofd, nfd) castto(fd)}
+const alarm = {msec; -> syscall(Sysalarm, msec)}
+const exits = {msg; -> syscall(Sysexits, cstring(msg))}
+const fauth = {fd, aname; -> syscall(Sysfauth, fd, cstring(aname))}
+const segbrk = {saddr, addr; -> syscall(Syssegbrk, saddr, addr)}
+const open = {path, opt; -> syscall(Sysopen, cstring(path), opt) castto(fd)}
+const sleep = {msec; -> syscall(Syssleep, msec)}
+const rfork = {rflags; -> syscall(Sysrfork, rflags) castto(pid)}
+const pipe = {fds; -> syscall(Syspipe, ptr(fds))}
+const create = {path, mode, perm; -> syscall(Syscreate, cstring(path), mode, perm) castto(fd)}
+const fd2path = {fd, buf; -> syscall(Sysfd2path, fd, ptr(buf), len32(buf))}
+const remove = {path; -> syscall(Sysremove, cstring(path))}
+const notify = {fn; -> syscall(Sysnotify, fn)} /* FIXME: this is likely to break... */
+const noted = {v; -> syscall(Sysnoted, v)}
+const segattach = {attr, class, va, len; -> syscall(Syssegattach, attr, cstring(class), va, len)}
+const segdetach = {va; -> syscall(Syssegdetach, va)}
+const segfree = {va, len; -> syscall(Syssegfree, va, len)}
+const segflush = {va, len; -> syscall(Syssegfree, va, len)}
+const unmount = {name, old; -> syscall(Sysunmount, cstring(name), cstring(old))}
+const errstr = {buf; -> syscall(Syserrstr, ptr(buf), len32(buf))}
+const stat = {name, edir; -> syscall(Sysstat, cstring(name), ptr(edir), len32(edir))}
+const fstat = {fd, edir; -> syscall(Sysstat, fd, ptr(edir), len32(edir))}
+const wstat = {name, edir; -> syscall(Syswstat, cstring(name), ptr(edir), len32(edir))}
+const fwstat = {fd, edir; -> syscall(Sysfwstat, fd, ptr(edir), len32(edir))}
+const mount = {fd, afd, old, flag, aname; -> syscall(Sysmount, fd, afd, cstring(old), flag, cstring(aname))}
+const await = {buf; -> syscall(Sysawait, ptr(buf), len32(buf))}
+const pread = {fd, buf, off; -> syscall(Syspread, fd, ptr(buf), len32(buf), off) castto(size)}
+const pwrite = {fd, buf, off; -> syscall(Syspwrite, fd, ptr(buf), len32(buf), off) castto(size)}
+const seek = {fd, n, ty
+ var ret : off
+ syscall(Sysseek, &ret, fd, n, ty)
+ -> ret
+}
+const exec = {bin, args
+ var p, cargs, i
+
+ /* we need an array of C strings. */
+ p = alloca((args.len + 1)*sizeof(byte#))
+ cargs = (ptr(p) castto(byte##))[:args.len + 1]
+ for i = 0; i < args.len; i++
+ cargs[i] = cstring(args[i])
+ ;;
+ cargs[args.len] = ptr(0)
+ -> syscall(Sysexec, cstring(bin), cargs)
+}
+/* ??? do I care for now?
+const brk_ = { }
+const fversion = {fd, bufsz, vers, nvers; -> syscall(Sysfversion, fd, bufsz, }
+const await = {;}
+const rendezvous = {;}
+const semacquire = {;}
+const semrelease = {;}
+const tsemacquire = {;}
+*/