aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-11-17 17:38:58 -0800
committerNicholas Noll <nbnoll@eml.cc>2021-11-17 17:38:58 -0800
commit7eb20457ff3d80cc81d54204ffd2c9edaf991905 (patch)
tree8207073b475156293155accf6cc7804ff1a0f3eb
parent8d60b38fbe778de30c3a1751b35d8e366882cd01 (diff)
automated platform specific code parsing
-rw-r--r--.gitignore2
-rwxr-xr-xbin/updatedirs2
-rw-r--r--include/sys.h35
-rwxr-xr-xsys/gen.py419
-rw-r--r--sys/linux/amd64/arch/bits.h29
-rw-r--r--sys/linux/amd64/syscall.h801
-rw-r--r--sys/linux/arm/arch/bits.h18
-rw-r--r--sys/linux/arm/syscall.h496
-rw-r--r--sys/linux/arm64/arch/bits.h18
-rw-r--r--sys/linux/arm64/syscall.h377
-rw-r--r--sys/linux/i386/arch/bits.h19
-rw-r--r--sys/linux/i386/syscall.h505
-rw-r--r--sys/linux/port/arch/constants.h20
-rw-r--r--sys/linux/port/arch/errno.h134
-rw-r--r--sys/linux/riscv64/arch/bits.h18
-rw-r--r--sys/linux/riscv64/syscall.h376
-rw-r--r--sys/src/close.c3
-rw-r--r--sys/src/dup.c5
-rw-r--r--sys/src/errno.inc.h89
-rw-r--r--sys/src/errormsg.c26
-rw-r--r--sys/src/internal.h248
-rw-r--r--sys/src/open.c3
-rw-r--r--sys/src/read.c7
-rw-r--r--sys/src/seek.c8
-rw-r--r--sys/src/write.c7
25 files changed, 3208 insertions, 457 deletions
diff --git a/.gitignore b/.gitignore
index daccce7..aad5c06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,8 @@ share/
vendor/
test/
obj/
+etc/
+figs/
.cache/
include/libc
diff --git a/bin/updatedirs b/bin/updatedirs
index 850fe1a..2b90ee4 100755
--- a/bin/updatedirs
+++ b/bin/updatedirs
@@ -1,7 +1,7 @@
#!/bin/python
import os
-ROOT = "/home/nolln/u"
+ROOT = "/home/nolln/root"
SRC = "src"
BUILD = "obj"
TEST = "test"
diff --git a/include/sys.h b/include/sys.h
index 773ff3a..15fba2a 100644
--- a/include/sys.h
+++ b/include/sys.h
@@ -1,12 +1,33 @@
#pragma once
-#include <sys/constants.h>
+#include <arch/constants.h>
+#include <arch/errno.h>
-#define sys·Oread 0x0u
-#define sys·Owrite 0x1u
-#define sys·Ordwr 0x2u
+// -----------------------------------------------------------------------
+// global constants
-/* system calls */
+/* open */
+#define sys·ORead 0x0u
+#define sys·OWrite 0x1u
+#define sys·ORdwr 0x2u
+
+/* seek */
+#define sys·SeekSet 0u
+#define sys·SeekCur 1u
+#define sys·SeekEnd 2u
+
+// -----------------------------------------------------------------------
+// functions
+
+/*
+ * system calls with errno-free interface
+ */
int sys·call(int num, ...);
-int sys·open(char *path, int flag, int mode, int *ret);
-int sys·close(char *path, int flag, int mode, int *ret);
+
+/* file operations */
+int sys·open(char *path, int flag, int mode, int *fd);
+int sys·close(int fd);
+int sys·write(int fd, intptr len, void *buf, intptr *nw);
+int sys·read(int fd, intptr len, void *buf, intptr *nr);
+int sys·seek(int fd, intptr offset, int from, intptr *pos);
+int sys·dup(int from, int to);
diff --git a/sys/gen.py b/sys/gen.py
new file mode 100755
index 0000000..e1e8c0f
--- /dev/null
+++ b/sys/gen.py
@@ -0,0 +1,419 @@
+#!/usr/bin/env python
+
+import re
+import gzip
+from math import log
+
+# supported operating systems/architectures
+operating_system = [ 'linux' ]
+arch = {
+ 'generic' : 'port',
+ 'x86_64' : 'amd64',
+ 'i386' : 'i386',
+ 'arm' : 'arm',
+ 'aarch64' : 'arm64',
+ 'riscv64' : 'riscv64',
+}
+
+# all dictionaries take form: musl => us
+
+# ------------------------------------------------------------------------
+# errno
+
+# name conversions
+errprefix = "sys·Error"
+errno = {
+ "EPERM" : "NotPermit", "ENOENT" : "NoEntry",
+ "ESRCH" : "NoProc", "EINTR" : "Interrupt",
+ "EIO" : "IO", "ENXIO" : "NoDevAddr",
+ "E2BIG" : "ArgLen", "ENOEXEC" : "ExecFmt",
+ "EBADF" : "BadFd", "ECHILD" : "NoChild",
+ "EAGAIN" : "Again", "ENOMEM" : "NoMemory",
+ "EACCES" : "Access", "EFAULT" : "BadAddr",
+ "ENOTBLK" : "NotBlk", "EBUSY" : "Busy",
+ "EEXIST" : "Exists", "EXDEV" : "ExDevice",
+ "ENODEV" : "NoDevice", "ENOTDIR" : "NotDir",
+ "EISDIR" : "IsDir", "EINVAL" : "BadArg",
+ "ENFILE" : "NoFiles", "EMFILE" : "NoFd",
+ "ENOTTY" : "NotTTY", "ETXTBSY" : "TxtBusy",
+ "EFBIG" : "BigFile", "ENOSPC" : "NoSpace",
+ "ESPIPE" : "NoSeek", "EROFS" : "ReadOnly",
+ "EMLINK" : "NoLink", "EPIPE" : "BadPipe",
+ "EDOM" : "BadDomain", "ERANGE" : "BadResult",
+ "EDEADLK" : "Deadlock", "ENAMETOOLONG" : "NameLen",
+ "ENOLCK" : "NoLock", "ENOSYS" : "NoSyscall",
+ "ENOTEMPTY" : "NotEmptyDir", "ELOOP" : "LinkLoop",
+ "EWOULDBLOCK" : "Blocks", "ENOMSG" : "NoMsg",
+ "EIDRM" : "NoIdent", "ECHRNG" : "BadChannel",
+ "EL2NSYNC" : "Lvl2NoSync", "EL3HLT" : "Lvl3Halt",
+ "EL3RST" : "Lvl3Reset", "ELNRNG" : "LongChannel",
+ "EUNATCH" : "NoDriver", "ENOCSI" : "NoCSI",
+ "EL2HLT" : "Lvl2Halt", "EBADE" : "BadExchange",
+ "EBADR" : "BadRequest", "EXFULL" : "FullExchange",
+ "ENOANO" : "NoAnode", "EBADRQC" : "BadRequestCode",
+ "EBADSLT" : "BadSlot", "EDEADLOCK" : "Deadlock2",
+ "EBFONT" : "BadFont", "ENOSTR" : "NoStr",
+ "ENODATA" : "NoData", "ETIME" : "Timeout",
+ "ENOSR" : "NoStream", "ENONET" : "NoNet",
+ "ENOPKG" : "NoPkg", "EREMOTE" : "IsRemote",
+ "ENOLINK" : "DeadLink", "EADV" : "Adv",
+ "ESRMNT" : "Srmnt", "ECOMM" : "Communicate",
+ "EPROTO" : "Protocol", "EMULTIHOP" : "Multihop",
+ "EDOTDOT" : "DotDot", "EBADMSG" : "BadMsg",
+ "EOVERFLOW" : "Overflow", "ENOTUNIQ" : "NotUnique",
+ "EBADFD" : "BadFdState", "EREMCHG" : "NewAddress",
+ "ELIBACC" : "ShlibAccess", "ELIBBAD" : "BadShlib",
+ "ELIBSCN" : "BadLibCode", "ELIBMAX" : "ShlibLen",
+ "ELIBEXEC" : "SlibExec", "EILSEQ" : "BadWideChar",
+ "ERESTART" : "Restart", "ESTRPIPE" : "StreamPipe",
+ "EUSERS" : "UserLen", "ENOTSOCK" : "NotSocket",
+ "EDESTADDRREQ" : "NeedDstAddr", "EMSGSIZE" : "MsgLen",
+ "EPROTOTYPE" : "BadProtocol", "ENOPROTOOPT" : "NoProtocol",
+ "EPROTONOSUPPORT" : "NoProtocolSupport","ESOCKTNOSUPPORT" : "NoSocketSupport",
+ "EOPNOTSUPP" : "ProtocolSupport", "ENOTSUP" : "NoSupport",
+ "EPFNOSUPPORT" : "NoPFSupport", "EAFNOSUPPORT" : "NoAFSupport",
+ "EADDRINUSE" : "AddrInUse", "EADDRNOTAVAIL" : "AddrNotAvail",
+ "ENETDOWN" : "NetDown", "ENETUNREACH" : "NetHang",
+ "ENETRESET" : "NetReset", "ECONNABORTED" : "AbortConnect",
+ "ECONNRESET" : "ResetConnect", "ENOBUFS" : "NoBuffer",
+ "EISCONN" : "IsConnect", "ENOTCONN" : "NotConnect",
+ "ESHUTDOWN" : "Shutdown", "ETOOMANYREFS" : "RefsLen",
+ "ETIMEDOUT" : "TimedOut", "ECONNREFUSED" : "RefuseConnect",
+ "EHOSTDOWN" : "HostDown", "EHOSTUNREACH" : "HostHang",
+ "EALREADY" : "AlreadyConnect", "EINPROGRESS" : "InProgress",
+ "ESTALE" : "Stale", "EUCLEAN" : "NeedClean",
+ "ENOTNAM" : "NotNamed", "ENAVAIL" : "NotAvail",
+ "EISNAM" : "IsNamed", "EREMOTEIO" : "RemoteIO",
+ "EDQUOT" : "DiskQuota", "ENOMEDIUM" : "NoMedium",
+ "EMEDIUMTYPE" : "BadMedium", "ECANCELED" : "Cancel",
+ "ENOKEY" : "NoKey", "EKEYEXPIRED" : "ExpireKey",
+ "EKEYREVOKED" : "RevokeKey", "EKEYREJECTED" : "RejectKey",
+ "EOWNERDEAD" : "OwnerDie", "ENOTRECOVERABLE" : "NoRecover",
+ "ERFKILL" : "RFKill", "EHWPOISON" : "HWPoison",
+}
+
+def errwrap(name):
+ return errprefix+errno[name]
+
+def fmterrno(writer, musl):
+ with open(f"{musl}/bits/errno.h", "r") as reader:
+ for line in reader:
+ word = line.split()
+ if word[0] != "#define":
+ continue
+ try:
+ if word[2].isdigit():
+ putdefine(writer, errwrap(word[1]), word[2], left=30, right=30)
+ else:
+ putdefine(writer, errwrap(word[1]), errwrap(word[2]), left=30, right=30)
+ except:
+ raise KeyError(f"{word[1]} not recognized")
+
+def fmtstrerror(writer, musl):
+ with open(f"{musl}/__strerror.h", "r") as reader:
+ for line in reader:
+ if len(line) == 0 or line[0] != 'E':
+ continue
+ word = line[2:-2].split(",")
+ if word[0] == '0':
+ name = word[0]
+ else:
+ name = errwrap(word[0])
+ name += ','
+ name = 'E(' + name
+ mesg = "".join(w.strip() for w in word[1:]).lower() + ')'
+ print(f"{name:<35}{mesg}", file=writer)
+
+# ------------------------------------------------------------------------
+# syscalls
+
+syscallprefix = "·"
+
+class LanguageModel(object):
+ def __init__(self, word_file):
+ self.word_file = word_file
+
+ # Build a cost dictionary, assuming Zipf's law and cost = -math.log(probability).
+ with gzip.open(word_file) as f:
+ words = f.read().decode().split()
+ self._wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words))
+ self._maxword = max(len(x) for x in words)
+
+ def add_word(self, w):
+ num_words = len(self._wordcost) + 1
+ self._wordcost[w] = 0 #log((num_words)*log(num_words))
+ self._maxword = max(self._maxword, len(w))
+
+ def del_word(self, w):
+ if w in self._wordcost:
+ self._wordcost[w] = 1000000000
+
+ def split(self, s):
+ """Uses dynamic programming to infer the location of spaces in a string without spaces."""
+ l = [self._split(x) for x in REGEXP.split(s)]
+ return [item for sublist in l for item in sublist]
+
+ def _split(self, s):
+ # Find the best match for the i first characters, assuming cost has
+ # been built for the i-1 first characters.
+ # Returns a pair (match_cost, match_length).
+ def best_match(i):
+ candidates = enumerate(reversed(cost[max(0, i-self._maxword):i]))
+ return min((c + self._wordcost.get(s[i-k-1:i].lower(), 9e999), k+1) for k,c in candidates)
+
+ # Build the cost array.
+ cost = [0]
+ for i in range(1,len(s)+1):
+ c,k = best_match(i)
+ cost.append(c)
+
+ # Backtrack to recover the minimal-cost string.
+ out = []
+ i = len(s)
+ while i>0:
+ c,k = best_match(i)
+ assert c == cost[i]
+ # Apostrophe and digit handling (added by Genesys)
+ newToken = True
+ if not s[i-k:i] == "'": # ignore a lone apostrophe
+ if len(out) > 0:
+ # re-attach split 's and split digits
+ if out[-1] == "'s" or (s[i-1].isdigit() and out[-1][0].isdigit()): # digit followed by digit
+ out[-1] = s[i-k:i] + out[-1] # combine current token with previous token
+ newToken = False
+ # (End of Genesys addition)
+
+ if newToken:
+ out.append(s[i-k:i])
+
+ i -= k
+
+ return reversed(out)
+
+DEFAULT = LanguageModel("../data/words.txt.gz")
+REGEXP = re.compile("[^a-zA-Z0-9']+")
+
+def splitwords(s):
+ return DEFAULT.split(s)
+
+for w in ["pi", "sid"]:
+ DEFAULT.del_word(w)
+
+for w in [
+ "clock", "idle", "uring", "shm", "sem", "set", "ctl", "cntl",
+ "remap", "unmap", "sched", "fd", "io", "pid",
+ "recv", "chmod", "chown", "lock", "stat", "sys",
+ "async", "brk", "id", "unlock", "cwd", "syms",
+ "attr", "chroot", "chdir", "mkdir", "rmdir",
+ "gid", "uid", "serv", "acct", "unlink", "futex"]:
+ DEFAULT.add_word(w)
+
+corpus = {
+ "msgsnd" : "msgsend", "msgrcv" : "msgrecv",
+ "creat" : "create", "mincore" : "mloaded",
+}
+
+def syscall(musl, prefix="__NR_"):
+ ours = musl.removeprefix(prefix)
+
+ for source,target in corpus.items():
+ if target not in ours:
+ ours = ours.replace(source,target)
+
+ return syscallprefix+"".join(word.title() for word in splitwords(ours))
+
+def fmtsysnum(reader, writer):
+ for line in reader:
+ word = line.split()
+ if len(word) != 3 or word[0] != "#define":
+ continue
+
+ call = word[1]
+ sysn = word[2]
+ head = syscall(call)
+ if sysn.isdigit():
+ print(f"#define {head:<30} {sysn:>30}", file=writer)
+
+def fmtsysasm(reader, writer):
+ putline(writer)
+ putcomment(writer, "assembly routines")
+ putdefine(writer, "asm", "__asm__ __volatile__", left=5)
+ for line in reader:
+ if line.startswith("#define __SYSCALL_LL") \
+ or line.startswith("((union") \
+ or line.startswith("#define SYSCALL_IPC") \
+ or line.startswith("#define SYSCALL_FADVISE") \
+ or line.startswith("#define VDSO") \
+ or line.startswith("#define IPC") \
+ or line.startswith("/*") \
+ or line.strip().startswith("*"):
+ continue
+
+ line = line.replace("__syscall", "_syscall")
+ line = line.replace("__inline", "inline")
+ line = line.replace("__asm__ __volatile__ ", "asm")
+ line = line.replace("\t", " ")
+ line = line.replace("unsigned long", "ulong")
+ line = line.replace("static inline ", "static inline\n")
+ print(line, file=writer, end="")
+
+def fmtsyscall(writer, musl):
+ with open(f"{musl}/bits/syscall.h.in") as io:
+ fmtsysnum(io, writer)
+
+ with open(f"{musl}/syscall_arch.h") as io:
+ fmtsysasm(io, writer)
+
+def fmtsyscallold(writer, musl):
+ with open(musl,"r") as reader:
+ needend=False
+ for line in reader:
+ if line.startswith("#define SYS_") \
+ or line.startswith("#undef SYS_") \
+ or line.startswith("#ifdef SYS_") \
+ or line.startswith("#ifndef SYS_") \
+ or(line.startswith("#endif") and needend):
+ word = line.split()
+ name = [syscall(w,prefix="SYS_") for w in word[1:]]
+ if word[0] == "#endif":
+ print(word[0], file=writer)
+ putline(writer)
+ needend=False
+ elif word[0] == "#ifdef" or word[0] == "#ifndef":
+ needend=True
+ print(word[0], name[0], file=writer)
+ else:
+ if word[0] == "#undef":
+ print(f"# {word[0][1:]:<8}{name[0]}", file=writer)
+ else:
+ print(f"# {word[0][1:]:<8}{name[0]:<10} {name[1]}", file=writer)
+
+# ------------------------------------------------------------------------
+# types
+
+stdintdefs=[
+ "INTPTR_MIN", "INTPTR_MAX", "UINTPTR_MIN", "UINTPTR_MAX",
+ "PTRDIFF_MIN", "PTRDIFF_MAX", "SIZE_MAX", "LONG_MAX",
+]
+
+int8 = "char"
+int16 = "short"
+int32 = "int"
+int64 = {'x86_64':"long",'i386':"long long",'arm':"long long",'aarch64':"long",'riscv64':"long"}
+addr = {'x86_64':"long",'i386':"int",'arm':"int",'aarch64':"long",'riscv64':"long"}
+
+long64="0x7fffffffffffffffL"
+long32="0x7fffffffL"
+maxlong={'x86_64':long64, 'i386':long32, 'arm':long32, 'aarch64': long64, 'riscv64': long64}
+
+def fmtstdint(reader, writer):
+ for line in reader:
+ for intdef in stdintdefs:
+ if intdef in line:
+ word = line.split()
+ if word[0] != "#define":
+ continue
+ putdefine(writer, word[1], word[2])
+
+def fmtbits(writer, musl, arch):
+ putheader(writer)
+ putline(writer)
+ putcomment(writer, "base types")
+
+ putdefine(writer, "INT8", int8)
+ putdefine(writer, "INT16", int16)
+ putdefine(writer, "INT32", int32)
+ putdefine(writer, "INT64", int64[arch])
+ putdefine(writer, "ADDR", addr[arch])
+
+ putline(writer)
+ putcomment(writer, "abi")
+
+ limits = f"{musl}/bits/limits.h"
+ if os.path.exists(limits):
+ with open(limits) as reader:
+ for line in reader:
+ word = line.split()
+ putdefine(writer, word[1], word[2])
+ else:
+ print(f"----> not found {limits}", file=stderr)
+
+ with open(f"{musl}/bits/stdint.h") as io:
+ fmtstdint(io, writer)
+
+ putdefine(writer, "LONG_MAX", maxlong[arch])
+
+# ------------------------------------------------------------------------
+# main point of entry
+
+import os
+
+from sys import stdout, stderr
+from os import makedirs as mkpath
+
+def putheader(writer):
+ print("#pragma once", file=writer)
+
+def putline(writer):
+ print("", file=writer)
+
+def putcomment(writer, string):
+ print(f"/* {string} */", file=writer)
+
+def putdefine(writer, name, value, left=20, right=00):
+ print(f"#define {name:<{left}} {value:<{right}}", file=writer)
+
+muslroot = "../vendor/musl"
+if __name__ == "__main__":
+ # architecture specifics
+ for source,target in arch.items():
+ if source == "generic":
+ continue
+
+ print(f"> for {target}",file=stderr)
+
+ musl = f"{muslroot}/arch/{source}"
+
+ libn = f"linux/{target}"
+ libnarch = f"{libn}/arch"
+ mkpath(libnarch, exist_ok=True)
+
+ print("--> emitting types", file=stderr)
+ with open(f"{libnarch}/bits.h", "w") as io:
+ fmtbits(io, musl, source)
+
+ print("--> emitting syscalls", file=stderr)
+ with open(f"{libn}/syscall.h", "w") as io:
+ fmtsyscall(io,musl)
+
+ # TODO: generalize away from linux
+ # portable operating system
+ print("--> emitting errno", file=stderr)
+ source, target = "generic", "port"
+
+ musl = f"{muslroot}/arch/{source}"
+ libn = f"linux/{target}/arch"
+ mkpath(libnarch, exist_ok=True)
+ with open(f"{libn}/errno.h","w") as io:
+ fmterrno(io, musl)
+
+ musl = f"{muslroot}/src/errno"
+ libn = "src/errno.inc.h"
+ with open(libn,"w") as io:
+ fmtstrerror(io, musl)
+
+ libn = "src/internal.h"
+ musl = f"{muslroot}/src/internal/syscall.h"
+
+ needfix = False
+ with open(libn,"r") as file:
+ line = file.readlines()[-3:]
+ if "/*********************************************" in line[0]:
+ if "* XXX: below this line is computer generated" in line[1]:
+ if "*********************************************/" in line[2]:
+ needfix = True
+
+ if needfix:
+ print("--> appending legacy syscall fixup", file=stderr)
+ with open(libn,"a") as io:
+ fmtsyscallold(io, musl)
diff --git a/sys/linux/amd64/arch/bits.h b/sys/linux/amd64/arch/bits.h
index e72e4e8..f869385 100644
--- a/sys/linux/amd64/arch/bits.h
+++ b/sys/linux/amd64/arch/bits.h
@@ -1,18 +1,19 @@
#pragma once
/* base types */
-#define INT8 char
-#define INT16 short
-#define INT32 int
-#define INT64 long
-#define ADDR long
+#define INT8 char
+#define INT16 short
+#define INT32 int
+#define INT64 long
+#define ADDR long
-/* ABI */
-#define PAGESIZE 4096
-#define INTPTR_MIN INT64_MIN
-#define INTPTR_MAX INT64_MAX
-#define UINTPTR_MAX UINT64_MAX
-#define PTRDIFF_MIN INT64_MIN
-#define PTRDIFF_MAX INT64_MAX
-#define SIZE_MAX UINT64_MAX
-#define LONG_MAX 0x7fffffffffffffffL
+/* abi */
+#define PAGESIZE 4096
+#define INTPTR_MIN INT64_MIN
+#define INTPTR_MAX INT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define PTRDIFF_MIN INT64_MIN
+#define PTRDIFF_MAX INT64_MAX
+#define SIZE_MAX UINT64_MAX
+#define LONG_MAX 0x7fffffffffffffffL
diff --git a/sys/linux/amd64/syscall.h b/sys/linux/amd64/syscall.h
index a06e3ba..f571b81 100644
--- a/sys/linux/amd64/syscall.h
+++ b/sys/linux/amd64/syscall.h
@@ -1,452 +1,423 @@
-#pragma once
+#define ·Read 0
+#define ·Write 1
+#define ·Open 2
+#define ·Close 3
+#define ·Stat 4
+#define ·FStat 5
+#define ·LStat 6
+#define ·Poll 7
+#define ·LSeek 8
+#define ·MMap 9
+#define ·MProtect 10
+#define ·MUnmap 11
+#define ·Brk 12
+#define ·RtSigAction 13
+#define ·RtSigProcMask 14
+#define ·RtSigReturn 15
+#define ·IoCtl 16
+#define ·PRead64 17
+#define ·PWrite64 18
+#define ·ReadV 19
+#define ·WriteV 20
+#define ·Access 21
+#define ·Pipe 22
+#define ·Select 23
+#define ·SchedYield 24
+#define ·MRemap 25
+#define ·MSync 26
+#define ·MLoaded 27
+#define ·MAdvise 28
+#define ·ShmGet 29
+#define ·ShmAt 30
+#define ·ShmCtl 31
+#define ·Dup 32
+#define ·Dup2 33
+#define ·Pause 34
+#define ·NanoSleep 35
+#define ·GetITimer 36
+#define ·Alarm 37
+#define ·SetITimer 38
+#define ·GetPid 39
+#define ·SendFile 40
+#define ·Socket 41
+#define ·Connect 42
+#define ·Accept 43
+#define ·SendTo 44
+#define ·RecvFrom 45
+#define ·SendMsg 46
+#define ·RecvMsg 47
+#define ·Shutdown 48
+#define ·Bind 49
+#define ·Listen 50
+#define ·GetSockName 51
+#define ·GetPeerName 52
+#define ·SocketPair 53
+#define ·SetSockOpt 54
+#define ·GetSockOpt 55
+#define ·Clone 56
+#define ·Fork 57
+#define ·VFork 58
+#define ·ExecVe 59
+#define ·Exit 60
+#define ·Wait4 61
+#define ·Kill 62
+#define ·UName 63
+#define ·SemGet 64
+#define ·SemOp 65
+#define ·SemCtl 66
+#define ·ShmDt 67
+#define ·MsgGet 68
+#define ·MsgSend 69
+#define ·MsgRecv 70
+#define ·MsgCtl 71
+#define ·FCntl 72
+#define ·FLock 73
+#define ·FSync 74
+#define ·FdAtAsync 75
+#define ·Truncate 76
+#define ·FTruncate 77
+#define ·GetDents 78
+#define ·GetCwd 79
+#define ·Chdir 80
+#define ·FChdir 81
+#define ·Rename 82
+#define ·Mkdir 83
+#define ·Rmdir 84
+#define ·Create 85
+#define ·Link 86
+#define ·Unlink 87
+#define ·SymLink 88
+#define ·ReadLink 89
+#define ·Chmod 90
+#define ·FChmod 91
+#define ·Chown 92
+#define ·FChown 93
+#define ·LChown 94
+#define ·UMask 95
+#define ·GetTimeOfDay 96
+#define ·GetRLimit 97
+#define ·GetRUsage 98
+#define ·SysInfo 99
+#define ·Times 100
+#define ·PTrace 101
+#define ·GetUid 102
+#define ·SysLog 103
+#define ·GetGid 104
+#define ·SetUid 105
+#define ·SetGid 106
+#define ·GetEUid 107
+#define ·GetEGid 108
+#define ·SetPGid 109
+#define ·GetPPid 110
+#define ·GetPGrp 111
+#define ·SetSId 112
+#define ·SetReUid 113
+#define ·SetReGid 114
+#define ·GetGroups 115
+#define ·SetGroups 116
+#define ·SetResUid 117
+#define ·GetResUid 118
+#define ·SetResGid 119
+#define ·GetResGid 120
+#define ·GetPGid 121
+#define ·SetFsUid 122
+#define ·SetFsGid 123
+#define ·GetsId 124
+#define ·CapGet 125
+#define ·CapSet 126
+#define ·RtSigPending 127
+#define ·RtSigTimedWait 128
+#define ·RtSigQueueInfo 129
+#define ·RtSigSuspend 130
+#define ·SiGaltStack 131
+#define ·UTime 132
+#define ·MkNod 133
+#define ·UseLib 134
+#define ·Personality 135
+#define ·UStat 136
+#define ·StatFs 137
+#define ·FStatFs 138
+#define ·SysFs 139
+#define ·GetPriority 140
+#define ·SetPriority 141
+#define ·SchedSetParam 142
+#define ·SchedGetParam 143
+#define ·SchedSetScheduler 144
+#define ·SchedGetScheduler 145
+#define ·SchedGetPriorityMax 146
+#define ·SchedGetPriorityMin 147
+#define ·SchedRrGetInterval 148
+#define ·MLock 149
+#define ·MUnlock 150
+#define ·MLockAll 151
+#define ·MUnlockAll 152
+#define ·VHangUp 153
+#define ·ModifyLdT 154
+#define ·PivotRoot 155
+#define ·SysCtl 156
+#define ·PrCtl 157
+#define ·ArchPrCtl 158
+#define ·AdjTimex 159
+#define ·SetRLimit 160
+#define ·Chroot 161
+#define ·Sync 162
+#define ·Acct 163
+#define ·SetTimeOfDay 164
+#define ·Mount 165
+#define ·UMount2 166
+#define ·SwapOn 167
+#define ·SwapOff 168
+#define ·Reboot 169
+#define ·SetHostname 170
+#define ·SetDomainName 171
+#define ·IoPl 172
+#define ·IoPerm 173
+#define ·CreateModule 174
+#define ·InItModule 175
+#define ·DeleteModule 176
+#define ·GetKernelSyms 177
+#define ·QueryModule 178
+#define ·QuotaCtl 179
+#define ·NfsServCtl 180
+#define ·GetPMsg 181
+#define ·PutPMsg 182
+#define ·AFsSysCall 183
+#define ·TuxCall 184
+#define ·Security 185
+#define ·GetTId 186
+#define ·ReadAhead 187
+#define ·SetXAttr 188
+#define ·LSetXAttr 189
+#define ·FSetXAttr 190
+#define ·GetXAttr 191
+#define ·LGetXAttr 192
+#define ·FGetXAttr 193
+#define ·ListXAttr 194
+#define ·LListXAttr 195
+#define ·FListXAttr 196
+#define ·RemoveXAttr 197
+#define ·LRemoveXAttr 198
+#define ·FRemoveXAttr 199
+#define ·TKill 200
+#define ·Time 201
+#define ·Futex 202
+#define ·SchedSetAffinity 203
+#define ·SchedGetAffinity 204
+#define ·SetThreadArea 205
+#define ·IoSetUp 206
+#define ·IoDestroy 207
+#define ·IoGetEvents 208
+#define ·IoSubmit 209
+#define ·IoCancel 210
+#define ·GetThreadArea 211
+#define ·LookupDCookie 212
+#define ·EPollCreate 213
+#define ·EPollCtlOld 214
+#define ·EPollWaitOld 215
+#define ·RemapFilePages 216
+#define ·GetDents64 217
+#define ·SetTIdAddress 218
+#define ·RestartSysCall 219
+#define ·SemTimeDop 220
+#define ·FAdvise64 221
+#define ·TimerCreate 222
+#define ·TimerSetTime 223
+#define ·TimerGetTime 224
+#define ·TimerGetOverrun 225
+#define ·TimerDelete 226
+#define ·ClockSetTime 227
+#define ·ClockGetTime 228
+#define ·ClockGetRes 229
+#define ·ClockNanoSleep 230
+#define ·ExitGroup 231
+#define ·EPollWait 232
+#define ·EPollCtl 233
+#define ·TgKill 234
+#define ·UTimes 235
+#define ·VServer 236
+#define ·MBind 237
+#define ·SetMemPolicy 238
+#define ·GetMemPolicy 239
+#define ·MQOpen 240
+#define ·MQUnlink 241
+#define ·MQTimedSend 242
+#define ·MQTimedReceive 243
+#define ·MQNotify 244
+#define ·MQGetSetAttr 245
+#define ·KExecLoad 246
+#define ·WaitId 247
+#define ·AddKey 248
+#define ·RequestKey 249
+#define ·KeyCtl 250
+#define ·IoPrIoSet 251
+#define ·IoPrIoGet 252
+#define ·INotifyInIt 253
+#define ·INotifyAddWatch 254
+#define ·INotifyRmWatch 255
+#define ·MigratePages 256
+#define ·OpenAt 257
+#define ·MkdirAt 258
+#define ·MkNodAt 259
+#define ·FChownAt 260
+#define ·FuTimesAt 261
+#define ·NewFStatAt 262
+#define ·UnlinkAt 263
+#define ·RenameAt 264
+#define ·LinkAt 265
+#define ·SymLinkAt 266
+#define ·ReadLinkAt 267
+#define ·FChmodAt 268
+#define ·FAccessAt 269
+#define ·PSelect6 270
+#define ·PPoll 271
+#define ·UnShare 272
+#define ·SetRobustList 273
+#define ·GetRobustList 274
+#define ·Splice 275
+#define ·Tee 276
+#define ·SyncFileRange 277
+#define ·VmSplice 278
+#define ·MovePages 279
+#define ·UTimeNsAt 280
+#define ·EPollPWait 281
+#define ·SignalFd 282
+#define ·TimerFdCreate 283
+#define ·EventFd 284
+#define ·FAllocate 285
+#define ·TimerFdSetTime 286
+#define ·TimerFdGetTime 287
+#define ·Accept4 288
+#define ·SignalFd4 289
+#define ·EventFd2 290
+#define ·EPollCreate1 291
+#define ·Dup3 292
+#define ·Pipe2 293
+#define ·INotifyInIt1 294
+#define ·PreAdv 295
+#define ·PWriteV 296
+#define ·RtTgSigQueueInfo 297
+#define ·PerFEventOpen 298
+#define ·RecvMMsg 299
+#define ·FaNotifyInIt 300
+#define ·FaNotifyMark 301
+#define ·PrLimit64 302
+#define ·NameToHandleAt 303
+#define ·OpenByHandleAt 304
+#define ·ClockAdjTime 305
+#define ·SyncFs 306
+#define ·SendMMsg 307
+#define ·SetNs 308
+#define ·GetCpu 309
+#define ·ProcessVmReadV 310
+#define ·ProcessVmWriteV 311
+#define ·KCmp 312
+#define ·FinItModule 313
+#define ·SchedSetAttr 314
+#define ·SchedGetAttr 315
+#define ·RenameAt2 316
+#define ·SeccoMp 317
+#define ·GetRandom 318
+#define ·MemFdCreate 319
+#define ·KExecFileLoad 320
+#define ·BpF 321
+#define ·ExecVeAt 322
+#define ·UserFaultFd 323
+#define ·MemBarrier 324
+#define ·MLock2 325
+#define ·CopyFileRange 326
+#define ·PreAdv2 327
+#define ·PWriteV2 328
+#define ·PKeyMProtect 329
+#define ·PKeyAllOc 330
+#define ·PKeyFree 331
+#define ·StatX 332
+#define ·IoPGetEvents 333
+#define ·RSeq 334
+#define ·PidFdSendSignal 424
+#define ·IoUringSetUp 425
+#define ·IoUringEnter 426
+#define ·IoUringRegister 427
+#define ·OpenTree 428
+#define ·MoveMount 429
+#define ·FsOpen 430
+#define ·FsConfig 431
+#define ·FsMount 432
+#define ·FsPick 433
+#define ·PidFdOpen 434
+#define ·Clone3 435
+#define ·CloseRange 436
+#define ·OpenAt2 437
+#define ·PidFdGetFd 438
+#define ·FAccessAt2 439
-#define ·Read 0
-#define ·Write 1
-#define ·Open 2
-#define ·Close 3
-#define ·Stat 4
-#define ·Fstat 5
-#define ·Lstat 6
-#define ·Poll 7
-#define ·Lseek 8
-#define ·Mmap 9
-#define ·Mprotect 10
-#define ·Munmap 11
-#define ·Brk 12
-#define ·RtSigAction 13
-#define ·RtSigProcmask 14
-#define ·RtSigReturn 15
-#define ·IoCtl 16
-#define ·PRead64 17
-#define ·PWrite64 18
-#define ·Readv 19
-#define ·Writev 20
-#define ·Access 21
-#define ·Pipe 22
-#define ·Select 23
-#define ·SchedYield 24
-#define ·MRemap 25
-#define ·MSync 26
-#define ·MIncore 27
-#define ·MAdvise 28
-#define ·ShmGet 29
-#define ·ShmAt 30
-#define ·ShmCtl 31
-#define ·Dup 32
-#define ·Dup2 33
-#define ·Pause 34
-#define ·Nanosleep 35
-#define ·GetItimer 36
-#define ·Alarm 37
-#define ·SetItimer 38
-#define ·GetPid 39
-#define ·SendFile 40
-#define ·Socket 41
-#define ·Connect 42
-#define ·Accept 43
-#define ·SendTo 44
-#define ·RecvFrom 45
-#define ·SendMsg 46
-#define ·RecvMsg 47
-#define ·Shutdown 48
-#define ·Bind 49
-#define ·Listen 50
-#define ·GetSockName 51
-#define ·GetPeerName 52
-#define ·SocketPair 53
-#define ·SetSockOpt 54
-#define ·GetSockOpt 55
-#define ·Clone 56
-#define ·Fork 57
-#define ·Vfork 58
-#define ·Execve 59
-#define ·Exit 60
-#define ·Wait4 61
-#define ·Kill 62
-#define ·Uname 63
-#define ·SemGet 64
-#define ·SemOp 65
-#define ·SemCtl 66
-#define ·ShmDt 67
-#define ·MsgGet 68
-#define ·MsgSnd 69
-#define ·MsgRcv 70
-#define ·MsgCtl 71
-#define ·Fcntl 72
-#define ·FLock 73
-#define ·FSync 74
-#define ·FDataSync 75
-#define ·Truncate 76
-#define ·FTruncate 77
-#define ·GetDents 78
-#define ·GetCwd 79
-#define ·Chdir 80
-#define ·Fchdir 81
-#define ·Rename 82
-#define ·Mkdir 83
-#define ·Rmdir 84
-#define ·Create 85
-#define ·Link 86
-#define ·Unlink 87
-#define ·Symlink 88
-#define ·Readlink 89
-#define ·Chmod 90
-#define ·Fchmod 91
-#define ·Chown 92
-#define ·FChown 93
-#define ·LChown 94
-#define ·UMask 95
-#define ·GetTimeOfDay 96
-#define ·GetRLimit 97
-#define ·GetRUsage 98
-#define ·SysInfo 99
-#define ·Times 100
-#define ·PTrace 101
-#define ·GetUID 102
-#define ·SysLog 103
-#define ·GetGid 104
-#define ·SetUid 105
-#define ·SetGid 106
-#define ·GetEuid 107
-#define ·GetEgid 108
-#define ·SetPgid 109
-#define ·GetPpid 110
-#define ·GetPgrp 111
-#define ·SetSid 112
-#define ·SetReuid 113
-#define ·SetRegid 114
-#define ·GetGroups 115
-#define ·SetGroups 116
-#define ·SetResuid 117
-#define ·GetResuid 118
-#define ·SetResgid 119
-#define ·GetResgid 120
-#define ·GetPgid 121
-#define ·SetFsuid 122
-#define ·SetFsgid 123
-#define ·GetSid 124
-#define ·CapGet 125
-#define ·CapSet 126
-#define ·RtSigPending 127
-#define ·RtSigTimedWait 128
-#define ·RtSigQueueInfo 129
-#define ·RtSigSuspend 130
-#define ·SignaltStack 131
-#define ·UTime 132
-#define ·MkNod 133
-#define ·UseLib 134
-#define ·Personality 135
-#define ·UStat 136
-#define ·StatFs 137
-#define ·FstatFs 138
-#define ·SysFs 139
-#define ·GetPriority 140
-#define ·SetPriority 141
-#define ·SchedSetParam 142
-#define ·SchedGetParam 143
-#define ·SchedSetScheduler 144
-#define ·SchedGetScheduler 145
-#define ·SchedGetPriorityMax 146
-#define ·SchedGetPriorityMin 147
-#define ·SchedRrGetInterval 148
-#define ·MLock 149
-#define ·MUnlock 150
-#define ·MLockAll 151
-#define ·MUnlockAll 152
-#define ·VHangup 153
-#define ·ModifyLdt 154
-#define ·PivotRoot 155
-#define ·Sysctl 156
-#define ·Prctl 157
-#define ·ArchPrctl 158
-#define ·AdjTimex 159
-#define ·SetRLimit 160
-#define ·Chroot 161
-#define ·Sync 162
-#define ·Acct 163
-#define ·Settimeofday 164
-#define ·Mount 165
-#define ·Umount2 166
-#define ·Swapon 167
-#define ·Swapoff 168
-#define ·Reboot 169
-#define ·SetHostName 170
-#define ·SetDomainName 171
-#define ·Iopl 172
-#define ·Ioperm 173
-#define ·CreateModule 174
-#define ·InitModule 175
-#define ·DeleteModule 176
-#define ·GetKernelSyms 177
-#define ·QueryModule 178
-#define ·QuotaCtl 179
-#define ·NfsServCtl 180
-#define ·GetPmsg 181
-#define ·PutPmsg 182
-#define ·AfsSyscall 183
-#define ·TuxCall 184
-#define ·Security 185
-#define ·Gettid 186
-#define ·Readahead 187
-#define ·SetXattr 188
-#define ·LsetXattr 189
-#define ·FsetXattr 190
-#define ·GetXattr 191
-#define ·LgetXattr 192
-#define ·FgetXattr 193
-#define ·ListXattr 194
-#define ·LlistXattr 195
-#define ·FlistXattr 196
-#define ·RemoveXattr 197
-#define ·LremoveXattr 198
-#define ·FremoveXattr 199
-#define ·TKill 200
-#define ·Time 201
-#define ·Futex 202
-#define ·SchedSetAffinity 203
-#define ·SchedGetAffinity 204
-#define ·SetThreadArea 205
-#define ·IoSetup 206
-#define ·IoDestroy 207
-#define ·IoGetEvents 208
-#define ·IoSubmit 209
-#define ·IoCancel 210
-#define ·GetThreadArea 211
-#define ·LookupDCookie 212
-#define ·EpollCreate 213
-#define ·EpollCtlOld 214
-#define ·EpollWaitOld 215
-#define ·RemapFilePages 216
-#define ·Getdents64 217
-#define ·SetTidAddress 218
-#define ·RestartSyscall 219
-#define ·SemtimeDop 220
-#define ·Fadvise64 221
-#define ·TimerCreate 222
-#define ·TimerSetTime 223
-#define ·TimerGetTime 224
-#define ·TimerGetOverrun 225
-#define ·TimerDelete 226
-#define ·ClockSetTime 227
-#define ·ClockGetTime 228
-#define ·ClockGetRes 229
-#define ·ClockNanosleep 230
-#define ·ExitGroup 231
-#define ·EpollWait 232
-#define ·EpollCtl 233
-#define ·Tgkill 234
-#define ·Utimes 235
-#define ·Vserver 236
-#define ·Mbind 237
-#define ·SetMemPolicy 238
-#define ·GetMemPolicy 239
-#define ·MqOpen 240
-#define ·MqUnlink 241
-#define ·MqTimedSend 242
-#define ·MqTimedReceive 243
-#define ·MqNotify 244
-#define ·MqGetSetAttr 245
-#define ·KexecLoad 246
-#define ·Waitid 247
-#define ·AddKey 248
-#define ·RequestKey 249
-#define ·Keyctl 250
-#define ·IoprioSet 251
-#define ·IoprioGet 252
-#define ·InotifyInit 253
-#define ·InotifyAddWatch 254
-#define ·InotifyRmWatch 255
-#define ·MigratePages 256
-#define ·OpenAt 257
-#define ·MkdirAt 258
-#define ·MkNodAt 259
-#define ·FchownAt 260
-#define ·FutimesAt 261
-#define ·NewfstatAt 262
-#define ·UnlinkAt 263
-#define ·RenameAt 264
-#define ·LinkAt 265
-#define ·SymlinkAt 266
-#define ·ReadlinkAt 267
-#define ·FchmodAt 268
-#define ·FaccessAt 269
-#define ·Pselect6 270
-#define ·Ppoll 271
-#define ·Unshare 272
-#define ·SetRobustList 273
-#define ·GetRobustList 274
-#define ·Splice 275
-#define ·Tee 276
-#define ·SyncFileRange 277
-#define ·Vmsplice 278
-#define ·MovePages 279
-#define ·UtimensAt 280
-#define ·EpollPwait 281
-#define ·SignalFd 282
-#define ·TimerFdCreate 283
-#define ·EventFd 284
-#define ·Fallocate 285
-#define ·TimerFdSetTime 286
-#define ·TimerFdGetTime 287
-#define ·Accept4 288
-#define ·SignalFd4 289
-#define ·EventFd2 290
-#define ·EpollCreate1 291
-#define ·Dup3 292
-#define ·Pipe2 293
-#define ·InotifyInit1 294
-#define ·Preadv 295
-#define ·Pwritev 296
-#define ·RtTgSigQueueInfo 297
-#define ·PerfEventOpen 298
-#define ·RecvmMsg 299
-#define ·FanotifyInit 300
-#define ·FanotifyMark 301
-#define ·Prlimit64 302
-#define ·NameToHandleAt 303
-#define ·OpenByHandleAt 304
-#define ·ClockAdjtime 305
-#define ·SyncFs 306
-#define ·SendmMsg 307
-#define ·SetNs 308
-#define ·GetCpu 309
-#define ·ProcessVmReadv 310
-#define ·ProcessVmWritev 311
-#define ·Kcmp 312
-#define ·FinitModule 313
-#define ·SchedSetattr 314
-#define ·SchedGetattr 315
-#define ·Renameat2 316
-#define ·Seccomp 317
-#define ·Getrandom 318
-#define ·MemfdCreate 319
-#define ·KexecFileLoad 320
-#define ·Bpf 321
-#define ·ExecveAt 322
-#define ·UserFaultFd 323
-#define ·MemBarrier 324
-#define ·Mlock2 325
-#define ·CopyFileRange 326
-#define ·Preadv2 327
-#define ·Pwritev2 328
-#define ·PkeyMprotect 329
-#define ·PkeyAlloc 330
-#define ·PkeyFree 331
-#define ·Statx 332
-#define ·IoPgetEvents 333
-#define ·Rseq 334
-#define ·PidfdSendSignal 424
-#define ·IoUringSetup 425
-#define ·IoUringEnter 426
-#define ·IoUringRegister 427
-#define ·OpenTree 428
-#define ·MoveMount 429
-#define ·FsOpen 430
-#define ·FsConfig 431
-#define ·FsMount 432
-#define ·FsPick 433
-#define ·PidFdOpen 434
-#define ·Clone3 435
-#define ·CloseRange 436
-#define ·OpenAt2 437
-#define ·PidFdGetFd 438
-#define ·FaccessAt2 439
-#define ·ProcessMadvise 440
+/* assembly routines */
+#define asm __asm__ __volatile__
-/*
- * x86-64 linux ABI
- * syscall rdi rsi rdx r10 r8 r9
- * return value in rax
- *
- * the syntax for extended GNU inline assembly
- * asm([instructions] : [output operands] : [input operands] : [clobbers] )
- * operands are written as "constrants"(symbol)
- * available constraints are:
- * 'r': any register
- * 'a': eax, 'b': ebx, 'c': ecx, 'd': edx, 'S', esi, 'D' edi
- * '=': write only, previous value is discarded
- */
-#define sysarg(x) ((long)(x))
-
-static inline long
-_syscall0(long n)
+static inline
+long _syscall0(long n)
{
ulong ret;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n)
- : "rcx", "r11", "memory"
- );
+ asm("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall1(long n, long a1)
+static inline
+long _syscall1(long n, long a1)
{
ulong ret;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1)
- : "rcx", "r11", "memory"
- );
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1) : "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall2(long n, long a1, long a2)
+static inline
+long _syscall2(long n, long a1, long a2)
{
ulong ret;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1), "S"(a2)
- : "rcx", "r11", "memory"
- );
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
+ : "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall3(long n, long a1, long a2, long a3)
+static inline
+long _syscall3(long n, long a1, long a2, long a3)
{
ulong ret;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1), "S"(a2), "d"(a3)
- : "rcx", "r11", "memory"
- );
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3) : "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall4(long n, long a1, long a2, long a3, long a4)
+static inline
+long _syscall4(long n, long a1, long a2, long a3, long a4)
{
ulong ret;
- register long r10 asm("r10") = a4;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10)
- : "rcx", "r11", "memory"
- );
+ register long r10 __asm__("r10") = a4;
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10): "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall5(long n, long a1, long a2, long a3, long a4, long a5)
+static inline
+long _syscall5(long n, long a1, long a2, long a3, long a4, long a5)
{
ulong ret;
- register long r10 asm("r10") = a4;
- register long r8 asm("r8") = a5;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10), "r"(r8)
- : "rcx", "r11", "memory"
- );
+ register long r10 __asm__("r10") = a4;
+ register long r8 __asm__("r8") = a5;
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10), "r"(r8) : "rcx", "r11", "memory");
return ret;
}
-static inline long
-_syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
+static inline
+long _syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
{
ulong ret;
register long r10 __asm__("r10") = a4;
- register long r8 __asm__("r8") = a5;
- register long r9 __asm__("r9") = a6;
- asm volatile("syscall" : "=a"(ret)
- : "a"(n), "D"(a1), "S"(a2), "d"(a3), "r"(r10), "r"(r8), "r"(r9)
- : "rcx", "r11", "memory"
- );
+ register long r8 __asm__("r8") = a5;
+ register long r9 __asm__("r9") = a6;
+ asm("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2),
+ "d"(a3), "r"(r10), "r"(r8), "r"(r9) : "rcx", "r11", "memory");
return ret;
}
+
+
diff --git a/sys/linux/arm/arch/bits.h b/sys/linux/arm/arch/bits.h
new file mode 100644
index 0000000..5f89c49
--- /dev/null
+++ b/sys/linux/arm/arch/bits.h
@@ -0,0 +1,18 @@
+#pragma once
+
+/* base types */
+#define INT8 char
+#define INT16 short
+#define INT32 int
+#define INT64 long long
+#define ADDR int
+
+/* abi */
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
+#define LONG_MAX 0x7fffffffL
diff --git a/sys/linux/arm/syscall.h b/sys/linux/arm/syscall.h
new file mode 100644
index 0000000..e7a8f89
--- /dev/null
+++ b/sys/linux/arm/syscall.h
@@ -0,0 +1,496 @@
+#define ·RestartSysCall 0
+#define ·Exit 1
+#define ·Fork 2
+#define ·Read 3
+#define ·Write 4
+#define ·Open 5
+#define ·Close 6
+#define ·Create 8
+#define ·Link 9
+#define ·Unlink 10
+#define ·ExecVe 11
+#define ·Chdir 12
+#define ·MkNod 14
+#define ·Chmod 15
+#define ·LChown 16
+#define ·LSeek 19
+#define ·GetPid 20
+#define ·Mount 21
+#define ·SetUid 23
+#define ·GetUid 24
+#define ·PTrace 26
+#define ·Pause 29
+#define ·Access 33
+#define ·Nice 34
+#define ·Sync 36
+#define ·Kill 37
+#define ·Rename 38
+#define ·Mkdir 39
+#define ·Rmdir 40
+#define ·Dup 41
+#define ·Pipe 42
+#define ·Times 43
+#define ·Brk 45
+#define ·SetGid 46
+#define ·GetGid 47
+#define ·GetEUid 49
+#define ·GetEGid 50
+#define ·Acct 51
+#define ·UMount2 52
+#define ·IoCtl 54
+#define ·FCntl 55
+#define ·SetPGid 57
+#define ·UMask 60
+#define ·Chroot 61
+#define ·UStat 62
+#define ·Dup2 63
+#define ·GetPPid 64
+#define ·GetPGrp 65
+#define ·SetSId 66
+#define ·SigAction 67
+#define ·SetReUid 70
+#define ·SetReGid 71
+#define ·SigSuspend 72
+#define ·SigPending 73
+#define ·SetHostname 74
+#define ·SetRLimit 75
+#define ·GetRUsage 77
+#define ·GetTimeOfDayTime32 78
+#define ·SetTimeOfDayTime32 79
+#define ·GetGroups 80
+#define ·SetGroups 81
+#define ·SymLink 83
+#define ·ReadLink 85
+#define ·UseLib 86
+#define ·SwapOn 87
+#define ·Reboot 88
+#define ·MUnmap 91
+#define ·Truncate 92
+#define ·FTruncate 93
+#define ·FChmod 94
+#define ·FChown 95
+#define ·GetPriority 96
+#define ·SetPriority 97
+#define ·StatFs 99
+#define ·FStatFs 100
+#define ·SysLog 103
+#define ·SetITimer 104
+#define ·GetITimer 105
+#define ·Stat 106
+#define ·LStat 107
+#define ·FStat 108
+#define ·VHangUp 111
+#define ·Wait4 114
+#define ·SwapOff 115
+#define ·SysInfo 116
+#define ·FSync 118
+#define ·SigReturn 119
+#define ·Clone 120
+#define ·SetDomainName 121
+#define ·UName 122
+#define ·AdjTimex 124
+#define ·MProtect 125
+#define ·SigProcMask 126
+#define ·InItModule 128
+#define ·DeleteModule 129
+#define ·QuotaCtl 131
+#define ·GetPGid 132
+#define ·FChdir 133
+#define ·BdFlush 134
+#define ·SysFs 135
+#define ·Personality 136
+#define ·SetFsUid 138
+#define ·SetFsGid 139
+#define ·LlSeek 140
+#define ·GetDents 141
+#define ·NewSelect 142
+#define ·FLock 143
+#define ·MSync 144
+#define ·ReadV 145
+#define ·WriteV 146
+#define ·GetsId 147
+#define ·FdAtAsync 148
+#define ·SysCtl 149
+#define ·MLock 150
+#define ·MUnlock 151
+#define ·MLockAll 152
+#define ·MUnlockAll 153
+#define ·SchedSetParam 154
+#define ·SchedGetParam 155
+#define ·SchedSetScheduler 156
+#define ·SchedGetScheduler 157
+#define ·SchedYield 158
+#define ·SchedGetPriorityMax 159
+#define ·SchedGetPriorityMin 160
+#define ·SchedRrGetInterval 161
+#define ·NanoSleep 162
+#define ·MRemap 163
+#define ·SetResUid 164
+#define ·GetResUid 165
+#define ·Poll 168
+#define ·NfsServCtl 169
+#define ·SetResGid 170
+#define ·GetResGid 171
+#define ·PrCtl 172
+#define ·RtSigReturn 173
+#define ·RtSigAction 174
+#define ·RtSigProcMask 175
+#define ·RtSigPending 176
+#define ·RtSigTimedWait 177
+#define ·RtSigQueueInfo 178
+#define ·RtSigSuspend 179
+#define ·PRead64 180
+#define ·PWrite64 181
+#define ·Chown 182
+#define ·GetCwd 183
+#define ·CapGet 184
+#define ·CapSet 185
+#define ·SiGaltStack 186
+#define ·SendFile 187
+#define ·VFork 190
+#define ·UGetRLimit 191
+#define ·MMap2 192
+#define ·Truncate64 193
+#define ·FTruncate64 194
+#define ·Stat64 195
+#define ·LStat64 196
+#define ·FStat64 197
+#define ·LChown32 198
+#define ·GetUid32 199
+#define ·GetGid32 200
+#define ·GetEUid32 201
+#define ·GetEGid32 202
+#define ·SetReUid32 203
+#define ·SetReGid32 204
+#define ·GetGroups32 205
+#define ·SetGroups32 206
+#define ·FChown32 207
+#define ·SetResUid32 208
+#define ·GetResUid32 209
+#define ·SetResGid32 210
+#define ·GetResGid32 211
+#define ·Chown32 212
+#define ·SetUid32 213
+#define ·SetGid32 214
+#define ·SetFsUid32 215
+#define ·SetFsGid32 216
+#define ·GetDents64 217
+#define ·PivotRoot 218
+#define ·MLoaded 219
+#define ·MAdvise 220
+#define ·FCntl64 221
+#define ·GetTId 224
+#define ·ReadAhead 225
+#define ·SetXAttr 226
+#define ·LSetXAttr 227
+#define ·FSetXAttr 228
+#define ·GetXAttr 229
+#define ·LGetXAttr 230
+#define ·FGetXAttr 231
+#define ·ListXAttr 232
+#define ·LListXAttr 233
+#define ·FListXAttr 234
+#define ·RemoveXAttr 235
+#define ·LRemoveXAttr 236
+#define ·FRemoveXAttr 237
+#define ·TKill 238
+#define ·SendFile64 239
+#define ·Futex 240
+#define ·SchedSetAffinity 241
+#define ·SchedGetAffinity 242
+#define ·IoSetUp 243
+#define ·IoDestroy 244
+#define ·IoGetEvents 245
+#define ·IoSubmit 246
+#define ·IoCancel 247
+#define ·ExitGroup 248
+#define ·LookupDCookie 249
+#define ·EPollCreate 250
+#define ·EPollCtl 251
+#define ·EPollWait 252
+#define ·RemapFilePages 253
+#define ·SetTIdAddress 256
+#define ·TimerCreate 257
+#define ·TimerSetTime32 258
+#define ·TimerGetTime32 259
+#define ·TimerGetOverrun 260
+#define ·TimerDelete 261
+#define ·ClockSetTime32 262
+#define ·ClockGetTime32 263
+#define ·ClockGetResTime32 264
+#define ·ClockNanoSleepTime32 265
+#define ·StatFs64 266
+#define ·FStatFs64 267
+#define ·TgKill 268
+#define ·UTimes 269
+#define ·FAdvise6464 270
+#define ·ArmFAdvise6464 270
+#define ·PciConfigIoBase 271
+#define ·PciConfigRead 272
+#define ·PciConfigWrite 273
+#define ·MQOpen 274
+#define ·MQUnlink 275
+#define ·MQTimedSend 276
+#define ·MQTimedReceive 277
+#define ·MQNotify 278
+#define ·MQGetSetAttr 279
+#define ·WaitId 280
+#define ·Socket 281
+#define ·Bind 282
+#define ·Connect 283
+#define ·Listen 284
+#define ·Accept 285
+#define ·GetSockName 286
+#define ·GetPeerName 287
+#define ·SocketPair 288
+#define ·Send 289
+#define ·SendTo 290
+#define ·Recv 291
+#define ·RecvFrom 292
+#define ·Shutdown 293
+#define ·SetSockOpt 294
+#define ·GetSockOpt 295
+#define ·SendMsg 296
+#define ·RecvMsg 297
+#define ·SemOp 298
+#define ·SemGet 299
+#define ·SemCtl 300
+#define ·MsgSend 301
+#define ·MsgRecv 302
+#define ·MsgGet 303
+#define ·MsgCtl 304
+#define ·ShmAt 305
+#define ·ShmDt 306
+#define ·ShmGet 307
+#define ·ShmCtl 308
+#define ·AddKey 309
+#define ·RequestKey 310
+#define ·KeyCtl 311
+#define ·SemTimeDop 312
+#define ·VServer 313
+#define ·IoPrIoSet 314
+#define ·IoPrIoGet 315
+#define ·INotifyInIt 316
+#define ·INotifyAddWatch 317
+#define ·INotifyRmWatch 318
+#define ·MBind 319
+#define ·GetMemPolicy 320
+#define ·SetMemPolicy 321
+#define ·OpenAt 322
+#define ·MkdirAt 323
+#define ·MkNodAt 324
+#define ·FChownAt 325
+#define ·FuTimesAt 326
+#define ·FStatAt64 327
+#define ·UnlinkAt 328
+#define ·RenameAt 329
+#define ·LinkAt 330
+#define ·SymLinkAt 331
+#define ·ReadLinkAt 332
+#define ·FChmodAt 333
+#define ·FAccessAt 334
+#define ·PSelect6 335
+#define ·PPoll 336
+#define ·UnShare 337
+#define ·SetRobustList 338
+#define ·GetRobustList 339
+#define ·Splice 340
+#define ·SyncFileRange2 341
+#define ·ArmSyncFileRange 341
+#define ·Tee 342
+#define ·VmSplice 343
+#define ·MovePages 344
+#define ·GetCpu 345
+#define ·EPollPWait 346
+#define ·KExecLoad 347
+#define ·UTimeNsAt 348
+#define ·SignalFd 349
+#define ·TimerFdCreate 350
+#define ·EventFd 351
+#define ·FAllocate 352
+#define ·TimerFdSetTime32 353
+#define ·TimerFdGetTime32 354
+#define ·SignalFd4 355
+#define ·EventFd2 356
+#define ·EPollCreate1 357
+#define ·Dup3 358
+#define ·Pipe2 359
+#define ·INotifyInIt1 360
+#define ·PreAdv 361
+#define ·PWriteV 362
+#define ·RtTgSigQueueInfo 363
+#define ·PerFEventOpen 364
+#define ·RecvMMsg 365
+#define ·Accept4 366
+#define ·FaNotifyInIt 367
+#define ·FaNotifyMark 368
+#define ·PrLimit64 369
+#define ·NameToHandleAt 370
+#define ·OpenByHandleAt 371
+#define ·ClockAdjTime 372
+#define ·SyncFs 373
+#define ·SendMMsg 374
+#define ·SetNs 375
+#define ·ProcessVmReadV 376
+#define ·ProcessVmWriteV 377
+#define ·KCmp 378
+#define ·FinItModule 379
+#define ·SchedSetAttr 380
+#define ·SchedGetAttr 381
+#define ·RenameAt2 382
+#define ·SeccoMp 383
+#define ·GetRandom 384
+#define ·MemFdCreate 385
+#define ·BpF 386
+#define ·ExecVeAt 387
+#define ·UserFaultFd 388
+#define ·MemBarrier 389
+#define ·MLock2 390
+#define ·CopyFileRange 391
+#define ·PreAdv2 392
+#define ·PWriteV2 393
+#define ·PKeyMProtect 394
+#define ·PKeyAllOc 395
+#define ·PKeyFree 396
+#define ·StatX 397
+#define ·RSeq 398
+#define ·IoPGetEvents 399
+#define ·MigratePages 400
+#define ·KExecFileLoad 401
+#define ·ClockGetTime64 403
+#define ·ClockSetTime64 404
+#define ·ClockAdjTime64 405
+#define ·ClockGetResTime64 406
+#define ·ClockNanoSleepTime64 407
+#define ·TimerGetTime64 408
+#define ·TimerSetTime64 409
+#define ·TimerFdGetTime64 410
+#define ·TimerFdSetTime64 411
+#define ·UTimeNsAtTime64 412
+#define ·PSelect6Time64 413
+#define ·PPollTime64 414
+#define ·IoPGetEventsTime64 416
+#define ·RecvMMsgTime64 417
+#define ·MQTimedSendTime64 418
+#define ·MQTimedReceiveTime64 419
+#define ·SemTimeDopTime64 420
+#define ·RtSigTimedWaitTime64 421
+#define ·FutexTime64 422
+#define ·SchedRrGetIntervalTime64 423
+#define ·PidFdSendSignal 424
+#define ·IoUringSetUp 425
+#define ·IoUringEnter 426
+#define ·IoUringRegister 427
+#define ·OpenTree 428
+#define ·MoveMount 429
+#define ·FsOpen 430
+#define ·FsConfig 431
+#define ·FsMount 432
+#define ·FsPick 433
+#define ·PidFdOpen 434
+#define ·Clone3 435
+#define ·CloseRange 436
+#define ·OpenAt2 437
+#define ·PidFdGetFd 438
+#define ·FAccessAt2 439
+
+/* assembly routines */
+#define asm __asm__ __volatile__
+
+#ifdef __thumb__
+
+#define __ASM____R7__
+#define __asm_syscall(...) do { \
+ asm( "mov %1,r7 ; mov r7,%2 ; svc 0 ; mov r7,%1" \
+ : "=r"(r0), "=&r"((int){0}) : __VA_ARGS__ : "memory"); \
+ return r0; \
+ } while (0)
+
+#else
+
+#define __ASM____R7__ __asm__("r7")
+#define __asm_syscall(...) do { \
+ asm( "svc 0" \
+ : "=r"(r0) : __VA_ARGS__ : "memory"); \
+ return r0; \
+ } while (0)
+#endif
+
+#ifdef __thumb2__
+#define R7_OPERAND "rI"(r7)
+#else
+#define R7_OPERAND "r"(r7)
+#endif
+
+static inline
+long _syscall0(long n)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0");
+ __asm_syscall(R7_OPERAND);
+}
+
+static inline
+long _syscall1(long n, long a)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ __asm_syscall(R7_OPERAND, "0"(r0));
+}
+
+static inline
+long _syscall2(long n, long a, long b)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1));
+}
+
+static inline
+long _syscall3(long n, long a, long b, long c)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2));
+}
+
+static inline
+long _syscall4(long n, long a, long b, long c, long d)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3));
+}
+
+static inline
+long _syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ register long r4 __asm__("r4") = e;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4));
+}
+
+static inline
+long _syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long r7 __ASM____R7__ = n;
+ register long r0 __asm__("r0") = a;
+ register long r1 __asm__("r1") = b;
+ register long r2 __asm__("r2") = c;
+ register long r3 __asm__("r3") = d;
+ register long r4 __asm__("r4") = e;
+ register long r5 __asm__("r5") = f;
+ __asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5));
+}
+
+
diff --git a/sys/linux/arm64/arch/bits.h b/sys/linux/arm64/arch/bits.h
new file mode 100644
index 0000000..b09b933
--- /dev/null
+++ b/sys/linux/arm64/arch/bits.h
@@ -0,0 +1,18 @@
+#pragma once
+
+/* base types */
+#define INT8 char
+#define INT16 short
+#define INT32 int
+#define INT64 long
+#define ADDR long
+
+/* abi */
+#define INTPTR_MIN INT64_MIN
+#define INTPTR_MAX INT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define PTRDIFF_MIN INT64_MIN
+#define PTRDIFF_MAX INT64_MAX
+#define SIZE_MAX UINT64_MAX
+#define LONG_MAX 0x7fffffffffffffffL
diff --git a/sys/linux/arm64/syscall.h b/sys/linux/arm64/syscall.h
new file mode 100644
index 0000000..efe905e
--- /dev/null
+++ b/sys/linux/arm64/syscall.h
@@ -0,0 +1,377 @@
+#define ·IoSetUp 0
+#define ·IoDestroy 1
+#define ·IoSubmit 2
+#define ·IoCancel 3
+#define ·IoGetEvents 4
+#define ·SetXAttr 5
+#define ·LSetXAttr 6
+#define ·FSetXAttr 7
+#define ·GetXAttr 8
+#define ·LGetXAttr 9
+#define ·FGetXAttr 10
+#define ·ListXAttr 11
+#define ·LListXAttr 12
+#define ·FListXAttr 13
+#define ·RemoveXAttr 14
+#define ·LRemoveXAttr 15
+#define ·FRemoveXAttr 16
+#define ·GetCwd 17
+#define ·LookupDCookie 18
+#define ·EventFd2 19
+#define ·EPollCreate1 20
+#define ·EPollCtl 21
+#define ·EPollPWait 22
+#define ·Dup 23
+#define ·Dup3 24
+#define ·FCntl 25
+#define ·INotifyInIt1 26
+#define ·INotifyAddWatch 27
+#define ·INotifyRmWatch 28
+#define ·IoCtl 29
+#define ·IoPrIoSet 30
+#define ·IoPrIoGet 31
+#define ·FLock 32
+#define ·MkNodAt 33
+#define ·MkdirAt 34
+#define ·UnlinkAt 35
+#define ·SymLinkAt 36
+#define ·LinkAt 37
+#define ·RenameAt 38
+#define ·UMount2 39
+#define ·Mount 40
+#define ·PivotRoot 41
+#define ·NfsServCtl 42
+#define ·StatFs 43
+#define ·FStatFs 44
+#define ·Truncate 45
+#define ·FTruncate 46
+#define ·FAllocate 47
+#define ·FAccessAt 48
+#define ·Chdir 49
+#define ·FChdir 50
+#define ·Chroot 51
+#define ·FChmod 52
+#define ·FChmodAt 53
+#define ·FChownAt 54
+#define ·FChown 55
+#define ·OpenAt 56
+#define ·Close 57
+#define ·VHangUp 58
+#define ·Pipe2 59
+#define ·QuotaCtl 60
+#define ·GetDents64 61
+#define ·LSeek 62
+#define ·Read 63
+#define ·Write 64
+#define ·ReadV 65
+#define ·WriteV 66
+#define ·PRead64 67
+#define ·PWrite64 68
+#define ·PreAdv 69
+#define ·PWriteV 70
+#define ·SendFile 71
+#define ·PSelect6 72
+#define ·PPoll 73
+#define ·SignalFd4 74
+#define ·VmSplice 75
+#define ·Splice 76
+#define ·Tee 77
+#define ·ReadLinkAt 78
+#define ·NewFStatAt 79
+#define ·FStat 80
+#define ·Sync 81
+#define ·FSync 82
+#define ·FdAtAsync 83
+#define ·SyncFileRange 84
+#define ·TimerFdCreate 85
+#define ·TimerFdSetTime 86
+#define ·TimerFdGetTime 87
+#define ·UTimeNsAt 88
+#define ·Acct 89
+#define ·CapGet 90
+#define ·CapSet 91
+#define ·Personality 92
+#define ·Exit 93
+#define ·ExitGroup 94
+#define ·WaitId 95
+#define ·SetTIdAddress 96
+#define ·UnShare 97
+#define ·Futex 98
+#define ·SetRobustList 99
+#define ·GetRobustList 100
+#define ·NanoSleep 101
+#define ·GetITimer 102
+#define ·SetITimer 103
+#define ·KExecLoad 104
+#define ·InItModule 105
+#define ·DeleteModule 106
+#define ·TimerCreate 107
+#define ·TimerGetTime 108
+#define ·TimerGetOverrun 109
+#define ·TimerSetTime 110
+#define ·TimerDelete 111
+#define ·ClockSetTime 112
+#define ·ClockGetTime 113
+#define ·ClockGetRes 114
+#define ·ClockNanoSleep 115
+#define ·SysLog 116
+#define ·PTrace 117
+#define ·SchedSetParam 118
+#define ·SchedSetScheduler 119
+#define ·SchedGetScheduler 120
+#define ·SchedGetParam 121
+#define ·SchedSetAffinity 122
+#define ·SchedGetAffinity 123
+#define ·SchedYield 124
+#define ·SchedGetPriorityMax 125
+#define ·SchedGetPriorityMin 126
+#define ·SchedRrGetInterval 127
+#define ·RestartSysCall 128
+#define ·Kill 129
+#define ·TKill 130
+#define ·TgKill 131
+#define ·SiGaltStack 132
+#define ·RtSigSuspend 133
+#define ·RtSigAction 134
+#define ·RtSigProcMask 135
+#define ·RtSigPending 136
+#define ·RtSigTimedWait 137
+#define ·RtSigQueueInfo 138
+#define ·RtSigReturn 139
+#define ·SetPriority 140
+#define ·GetPriority 141
+#define ·Reboot 142
+#define ·SetReGid 143
+#define ·SetGid 144
+#define ·SetReUid 145
+#define ·SetUid 146
+#define ·SetResUid 147
+#define ·GetResUid 148
+#define ·SetResGid 149
+#define ·GetResGid 150
+#define ·SetFsUid 151
+#define ·SetFsGid 152
+#define ·Times 153
+#define ·SetPGid 154
+#define ·GetPGid 155
+#define ·GetsId 156
+#define ·SetSId 157
+#define ·GetGroups 158
+#define ·SetGroups 159
+#define ·UName 160
+#define ·SetHostname 161
+#define ·SetDomainName 162
+#define ·GetRLimit 163
+#define ·SetRLimit 164
+#define ·GetRUsage 165
+#define ·UMask 166
+#define ·PrCtl 167
+#define ·GetCpu 168
+#define ·GetTimeOfDay 169
+#define ·SetTimeOfDay 170
+#define ·AdjTimex 171
+#define ·GetPid 172
+#define ·GetPPid 173
+#define ·GetUid 174
+#define ·GetEUid 175
+#define ·GetGid 176
+#define ·GetEGid 177
+#define ·GetTId 178
+#define ·SysInfo 179
+#define ·MQOpen 180
+#define ·MQUnlink 181
+#define ·MQTimedSend 182
+#define ·MQTimedReceive 183
+#define ·MQNotify 184
+#define ·MQGetSetAttr 185
+#define ·MsgGet 186
+#define ·MsgCtl 187
+#define ·MsgRecv 188
+#define ·MsgSend 189
+#define ·SemGet 190
+#define ·SemCtl 191
+#define ·SemTimeDop 192
+#define ·SemOp 193
+#define ·ShmGet 194
+#define ·ShmCtl 195
+#define ·ShmAt 196
+#define ·ShmDt 197
+#define ·Socket 198
+#define ·SocketPair 199
+#define ·Bind 200
+#define ·Listen 201
+#define ·Accept 202
+#define ·Connect 203
+#define ·GetSockName 204
+#define ·GetPeerName 205
+#define ·SendTo 206
+#define ·RecvFrom 207
+#define ·SetSockOpt 208
+#define ·GetSockOpt 209
+#define ·Shutdown 210
+#define ·SendMsg 211
+#define ·RecvMsg 212
+#define ·ReadAhead 213
+#define ·Brk 214
+#define ·MUnmap 215
+#define ·MRemap 216
+#define ·AddKey 217
+#define ·RequestKey 218
+#define ·KeyCtl 219
+#define ·Clone 220
+#define ·ExecVe 221
+#define ·MMap 222
+#define ·FAdvise64 223
+#define ·SwapOn 224
+#define ·SwapOff 225
+#define ·MProtect 226
+#define ·MSync 227
+#define ·MLock 228
+#define ·MUnlock 229
+#define ·MLockAll 230
+#define ·MUnlockAll 231
+#define ·MLoaded 232
+#define ·MAdvise 233
+#define ·RemapFilePages 234
+#define ·MBind 235
+#define ·GetMemPolicy 236
+#define ·SetMemPolicy 237
+#define ·MigratePages 238
+#define ·MovePages 239
+#define ·RtTgSigQueueInfo 240
+#define ·PerFEventOpen 241
+#define ·Accept4 242
+#define ·RecvMMsg 243
+#define ·Wait4 260
+#define ·PrLimit64 261
+#define ·FaNotifyInIt 262
+#define ·FaNotifyMark 263
+#define ·NameToHandleAt 264
+#define ·OpenByHandleAt 265
+#define ·ClockAdjTime 266
+#define ·SyncFs 267
+#define ·SetNs 268
+#define ·SendMMsg 269
+#define ·ProcessVmReadV 270
+#define ·ProcessVmWriteV 271
+#define ·KCmp 272
+#define ·FinItModule 273
+#define ·SchedSetAttr 274
+#define ·SchedGetAttr 275
+#define ·RenameAt2 276
+#define ·SeccoMp 277
+#define ·GetRandom 278
+#define ·MemFdCreate 279
+#define ·BpF 280
+#define ·ExecVeAt 281
+#define ·UserFaultFd 282
+#define ·MemBarrier 283
+#define ·MLock2 284
+#define ·CopyFileRange 285
+#define ·PreAdv2 286
+#define ·PWriteV2 287
+#define ·PKeyMProtect 288
+#define ·PKeyAllOc 289
+#define ·PKeyFree 290
+#define ·StatX 291
+#define ·IoPGetEvents 292
+#define ·RSeq 293
+#define ·KExecFileLoad 294
+#define ·PidFdSendSignal 424
+#define ·IoUringSetUp 425
+#define ·IoUringEnter 426
+#define ·IoUringRegister 427
+#define ·OpenTree 428
+#define ·MoveMount 429
+#define ·FsOpen 430
+#define ·FsConfig 431
+#define ·FsMount 432
+#define ·FsPick 433
+#define ·PidFdOpen 434
+#define ·Clone3 435
+#define ·CloseRange 436
+#define ·OpenAt2 437
+#define ·PidFdGetFd 438
+#define ·FAccessAt2 439
+
+/* assembly routines */
+#define asm __asm__ __volatile__
+
+#define __asm_syscall(...) do { \
+ asm( "svc 0" \
+ : "=r"(x0) : __VA_ARGS__ : "memory", "cc"); \
+ return x0; \
+ } while (0)
+
+static inline
+long _syscall0(long n)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0");
+ __asm_syscall("r"(x8));
+}
+
+static inline
+long _syscall1(long n, long a)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ __asm_syscall("r"(x8), "0"(x0));
+}
+
+static inline
+long _syscall2(long n, long a, long b)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1));
+}
+
+static inline
+long _syscall3(long n, long a, long b, long c)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2));
+}
+
+static inline
+long _syscall4(long n, long a, long b, long c, long d)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3));
+}
+
+static inline
+long _syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ register long x4 __asm__("x4") = e;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4));
+}
+
+static inline
+long _syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long x8 __asm__("x8") = n;
+ register long x0 __asm__("x0") = a;
+ register long x1 __asm__("x1") = b;
+ register long x2 __asm__("x2") = c;
+ register long x3 __asm__("x3") = d;
+ register long x4 __asm__("x4") = e;
+ register long x5 __asm__("x5") = f;
+ __asm_syscall("r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5));
+}
+
+
diff --git a/sys/linux/i386/arch/bits.h b/sys/linux/i386/arch/bits.h
new file mode 100644
index 0000000..25926c1
--- /dev/null
+++ b/sys/linux/i386/arch/bits.h
@@ -0,0 +1,19 @@
+#pragma once
+
+/* base types */
+#define INT8 char
+#define INT16 short
+#define INT32 int
+#define INT64 long long
+#define ADDR int
+
+/* abi */
+#define PAGESIZE 4096
+#define INTPTR_MIN INT32_MIN
+#define INTPTR_MAX INT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define UINTPTR_MAX UINT32_MAX
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#define SIZE_MAX UINT32_MAX
+#define LONG_MAX 0x7fffffffL
diff --git a/sys/linux/i386/syscall.h b/sys/linux/i386/syscall.h
new file mode 100644
index 0000000..21894bf
--- /dev/null
+++ b/sys/linux/i386/syscall.h
@@ -0,0 +1,505 @@
+#define ·RestartSysCall 0
+#define ·Exit 1
+#define ·Fork 2
+#define ·Read 3
+#define ·Write 4
+#define ·Open 5
+#define ·Close 6
+#define ·WaitPid 7
+#define ·Create 8
+#define ·Link 9
+#define ·Unlink 10
+#define ·ExecVe 11
+#define ·Chdir 12
+#define ·Time 13
+#define ·MkNod 14
+#define ·Chmod 15
+#define ·LChown 16
+#define ·Break 17
+#define ·OldStat 18
+#define ·LSeek 19
+#define ·GetPid 20
+#define ·Mount 21
+#define ·UMount 22
+#define ·SetUid 23
+#define ·GetUid 24
+#define ·STime 25
+#define ·PTrace 26
+#define ·Alarm 27
+#define ·OldFStat 28
+#define ·Pause 29
+#define ·UTime 30
+#define ·STty 31
+#define ·GTty 32
+#define ·Access 33
+#define ·Nice 34
+#define ·FTime 35
+#define ·Sync 36
+#define ·Kill 37
+#define ·Rename 38
+#define ·Mkdir 39
+#define ·Rmdir 40
+#define ·Dup 41
+#define ·Pipe 42
+#define ·Times 43
+#define ·Prof 44
+#define ·Brk 45
+#define ·SetGid 46
+#define ·GetGid 47
+#define ·Signal 48
+#define ·GetEUid 49
+#define ·GetEGid 50
+#define ·Acct 51
+#define ·UMount2 52
+#define ·Lock 53
+#define ·IoCtl 54
+#define ·FCntl 55
+#define ·MPx 56
+#define ·SetPGid 57
+#define ·ULimit 58
+#define ·OldOldUName 59
+#define ·UMask 60
+#define ·Chroot 61
+#define ·UStat 62
+#define ·Dup2 63
+#define ·GetPPid 64
+#define ·GetPGrp 65
+#define ·SetSId 66
+#define ·SigAction 67
+#define ·SGetMask 68
+#define ·SSetMask 69
+#define ·SetReUid 70
+#define ·SetReGid 71
+#define ·SigSuspend 72
+#define ·SigPending 73
+#define ·SetHostname 74
+#define ·SetRLimit 75
+#define ·GetRUsage 77
+#define ·GetTimeOfDayTime32 78
+#define ·SetTimeOfDayTime32 79
+#define ·GetGroups 80
+#define ·SetGroups 81
+#define ·Select 82
+#define ·SymLink 83
+#define ·OldLStat 84
+#define ·ReadLink 85
+#define ·UseLib 86
+#define ·SwapOn 87
+#define ·Reboot 88
+#define ·ReadDir 89
+#define ·MMap 90
+#define ·MUnmap 91
+#define ·Truncate 92
+#define ·FTruncate 93
+#define ·FChmod 94
+#define ·FChown 95
+#define ·GetPriority 96
+#define ·SetPriority 97
+#define ·ProfIl 98
+#define ·StatFs 99
+#define ·FStatFs 100
+#define ·IoPerm 101
+#define ·SocketCall 102
+#define ·SysLog 103
+#define ·SetITimer 104
+#define ·GetITimer 105
+#define ·Stat 106
+#define ·LStat 107
+#define ·FStat 108
+#define ·OldUName 109
+#define ·IoPl 110
+#define ·VHangUp 111
+#define ·Idle 112
+#define ·Vm86Old 113
+#define ·Wait4 114
+#define ·SwapOff 115
+#define ·SysInfo 116
+#define ·Ipc 117
+#define ·FSync 118
+#define ·SigReturn 119
+#define ·Clone 120
+#define ·SetDomainName 121
+#define ·UName 122
+#define ·ModifyLdT 123
+#define ·AdjTimex 124
+#define ·MProtect 125
+#define ·SigProcMask 126
+#define ·CreateModule 127
+#define ·InItModule 128
+#define ·DeleteModule 129
+#define ·GetKernelSyms 130
+#define ·QuotaCtl 131
+#define ·GetPGid 132
+#define ·FChdir 133
+#define ·BdFlush 134
+#define ·SysFs 135
+#define ·Personality 136
+#define ·AFsSysCall 137
+#define ·SetFsUid 138
+#define ·SetFsGid 139
+#define ·LlSeek 140
+#define ·GetDents 141
+#define ·NewSelect 142
+#define ·FLock 143
+#define ·MSync 144
+#define ·ReadV 145
+#define ·WriteV 146
+#define ·GetsId 147
+#define ·FdAtAsync 148
+#define ·SysCtl 149
+#define ·MLock 150
+#define ·MUnlock 151
+#define ·MLockAll 152
+#define ·MUnlockAll 153
+#define ·SchedSetParam 154
+#define ·SchedGetParam 155
+#define ·SchedSetScheduler 156
+#define ·SchedGetScheduler 157
+#define ·SchedYield 158
+#define ·SchedGetPriorityMax 159
+#define ·SchedGetPriorityMin 160
+#define ·SchedRrGetInterval 161
+#define ·NanoSleep 162
+#define ·MRemap 163
+#define ·SetResUid 164
+#define ·GetResUid 165
+#define ·Vm86 166
+#define ·QueryModule 167
+#define ·Poll 168
+#define ·NfsServCtl 169
+#define ·SetResGid 170
+#define ·GetResGid 171
+#define ·PrCtl 172
+#define ·RtSigReturn 173
+#define ·RtSigAction 174
+#define ·RtSigProcMask 175
+#define ·RtSigPending 176
+#define ·RtSigTimedWait 177
+#define ·RtSigQueueInfo 178
+#define ·RtSigSuspend 179
+#define ·PRead64 180
+#define ·PWrite64 181
+#define ·Chown 182
+#define ·GetCwd 183
+#define ·CapGet 184
+#define ·CapSet 185
+#define ·SiGaltStack 186
+#define ·SendFile 187
+#define ·GetPMsg 188
+#define ·PutPMsg 189
+#define ·VFork 190
+#define ·UGetRLimit 191
+#define ·MMap2 192
+#define ·Truncate64 193
+#define ·FTruncate64 194
+#define ·Stat64 195
+#define ·LStat64 196
+#define ·FStat64 197
+#define ·LChown32 198
+#define ·GetUid32 199
+#define ·GetGid32 200
+#define ·GetEUid32 201
+#define ·GetEGid32 202
+#define ·SetReUid32 203
+#define ·SetReGid32 204
+#define ·GetGroups32 205
+#define ·SetGroups32 206
+#define ·FChown32 207
+#define ·SetResUid32 208
+#define ·GetResUid32 209
+#define ·SetResGid32 210
+#define ·GetResGid32 211
+#define ·Chown32 212
+#define ·SetUid32 213
+#define ·SetGid32 214
+#define ·SetFsUid32 215
+#define ·SetFsGid32 216
+#define ·PivotRoot 217
+#define ·MLoaded 218
+#define ·MAdvise 219
+#define ·GetDents64 220
+#define ·FCntl64 221
+#define ·GetTId 224
+#define ·ReadAhead 225
+#define ·SetXAttr 226
+#define ·LSetXAttr 227
+#define ·FSetXAttr 228
+#define ·GetXAttr 229
+#define ·LGetXAttr 230
+#define ·FGetXAttr 231
+#define ·ListXAttr 232
+#define ·LListXAttr 233
+#define ·FListXAttr 234
+#define ·RemoveXAttr 235
+#define ·LRemoveXAttr 236
+#define ·FRemoveXAttr 237
+#define ·TKill 238
+#define ·SendFile64 239
+#define ·Futex 240
+#define ·SchedSetAffinity 241
+#define ·SchedGetAffinity 242
+#define ·SetThreadArea 243
+#define ·GetThreadArea 244
+#define ·IoSetUp 245
+#define ·IoDestroy 246
+#define ·IoGetEvents 247
+#define ·IoSubmit 248
+#define ·IoCancel 249
+#define ·FAdvise64 250
+#define ·ExitGroup 252
+#define ·LookupDCookie 253
+#define ·EPollCreate 254
+#define ·EPollCtl 255
+#define ·EPollWait 256
+#define ·RemapFilePages 257
+#define ·SetTIdAddress 258
+#define ·TimerCreate 259
+#define ·StatFs64 268
+#define ·FStatFs64 269
+#define ·TgKill 270
+#define ·UTimes 271
+#define ·FAdvise6464 272
+#define ·VServer 273
+#define ·MBind 274
+#define ·GetMemPolicy 275
+#define ·SetMemPolicy 276
+#define ·MQOpen 277
+#define ·KExecLoad 283
+#define ·WaitId 284
+#define ·AddKey 286
+#define ·RequestKey 287
+#define ·KeyCtl 288
+#define ·IoPrIoSet 289
+#define ·IoPrIoGet 290
+#define ·INotifyInIt 291
+#define ·INotifyAddWatch 292
+#define ·INotifyRmWatch 293
+#define ·MigratePages 294
+#define ·OpenAt 295
+#define ·MkdirAt 296
+#define ·MkNodAt 297
+#define ·FChownAt 298
+#define ·FuTimesAt 299
+#define ·FStatAt64 300
+#define ·UnlinkAt 301
+#define ·RenameAt 302
+#define ·LinkAt 303
+#define ·SymLinkAt 304
+#define ·ReadLinkAt 305
+#define ·FChmodAt 306
+#define ·FAccessAt 307
+#define ·PSelect6 308
+#define ·PPoll 309
+#define ·UnShare 310
+#define ·SetRobustList 311
+#define ·GetRobustList 312
+#define ·Splice 313
+#define ·SyncFileRange 314
+#define ·Tee 315
+#define ·VmSplice 316
+#define ·MovePages 317
+#define ·GetCpu 318
+#define ·EPollPWait 319
+#define ·UTimeNsAt 320
+#define ·SignalFd 321
+#define ·TimerFdCreate 322
+#define ·EventFd 323
+#define ·FAllocate 324
+#define ·TimerFdSetTime32 325
+#define ·TimerFdGetTime32 326
+#define ·SignalFd4 327
+#define ·EventFd2 328
+#define ·EPollCreate1 329
+#define ·Dup3 330
+#define ·Pipe2 331
+#define ·INotifyInIt1 332
+#define ·PreAdv 333
+#define ·PWriteV 334
+#define ·RtTgSigQueueInfo 335
+#define ·PerFEventOpen 336
+#define ·RecvMMsg 337
+#define ·FaNotifyInIt 338
+#define ·FaNotifyMark 339
+#define ·PrLimit64 340
+#define ·NameToHandleAt 341
+#define ·OpenByHandleAt 342
+#define ·ClockAdjTime 343
+#define ·SyncFs 344
+#define ·SendMMsg 345
+#define ·SetNs 346
+#define ·ProcessVmReadV 347
+#define ·ProcessVmWriteV 348
+#define ·KCmp 349
+#define ·FinItModule 350
+#define ·SchedSetAttr 351
+#define ·SchedGetAttr 352
+#define ·RenameAt2 353
+#define ·SeccoMp 354
+#define ·GetRandom 355
+#define ·MemFdCreate 356
+#define ·BpF 357
+#define ·ExecVeAt 358
+#define ·Socket 359
+#define ·SocketPair 360
+#define ·Bind 361
+#define ·Connect 362
+#define ·Listen 363
+#define ·Accept4 364
+#define ·GetSockOpt 365
+#define ·SetSockOpt 366
+#define ·GetSockName 367
+#define ·GetPeerName 368
+#define ·SendTo 369
+#define ·SendMsg 370
+#define ·RecvFrom 371
+#define ·RecvMsg 372
+#define ·Shutdown 373
+#define ·UserFaultFd 374
+#define ·MemBarrier 375
+#define ·MLock2 376
+#define ·CopyFileRange 377
+#define ·PreAdv2 378
+#define ·PWriteV2 379
+#define ·PKeyMProtect 380
+#define ·PKeyAllOc 381
+#define ·PKeyFree 382
+#define ·StatX 383
+#define ·ArchPrCtl 384
+#define ·IoPGetEvents 385
+#define ·RSeq 386
+#define ·SemGet 393
+#define ·SemCtl 394
+#define ·ShmGet 395
+#define ·ShmCtl 396
+#define ·ShmAt 397
+#define ·ShmDt 398
+#define ·MsgGet 399
+#define ·MsgSend 400
+#define ·MsgRecv 401
+#define ·MsgCtl 402
+#define ·ClockGetTime64 403
+#define ·ClockSetTime64 404
+#define ·ClockAdjTime64 405
+#define ·ClockGetResTime64 406
+#define ·ClockNanoSleepTime64 407
+#define ·TimerGetTime64 408
+#define ·TimerSetTime64 409
+#define ·TimerFdGetTime64 410
+#define ·TimerFdSetTime64 411
+#define ·UTimeNsAtTime64 412
+#define ·PSelect6Time64 413
+#define ·PPollTime64 414
+#define ·IoPGetEventsTime64 416
+#define ·RecvMMsgTime64 417
+#define ·MQTimedSendTime64 418
+#define ·MQTimedReceiveTime64 419
+#define ·SemTimeDopTime64 420
+#define ·RtSigTimedWaitTime64 421
+#define ·FutexTime64 422
+#define ·SchedRrGetIntervalTime64 423
+#define ·PidFdSendSignal 424
+#define ·IoUringSetUp 425
+#define ·IoUringEnter 426
+#define ·IoUringRegister 427
+#define ·OpenTree 428
+#define ·MoveMount 429
+#define ·FsOpen 430
+#define ·FsConfig 431
+#define ·FsMount 432
+#define ·FsPick 433
+#define ·PidFdOpen 434
+#define ·Clone3 435
+#define ·CloseRange 436
+#define ·OpenAt2 437
+#define ·PidFdGetFd 438
+#define ·FAccessAt2 439
+
+/* assembly routines */
+#define asm __asm__ __volatile__
+
+#if SYSCALL_NO_TLS
+#define SYSCALL_INSNS "int $128"
+#else
+#define SYSCALL_INSNS "call *%%gs:16"
+#endif
+
+#define SYSCALL_INSNS_12 "xchg %%ebx,%%edx ; " SYSCALL_INSNS " ; xchg %%ebx,%%edx"
+#define SYSCALL_INSNS_34 "xchg %%ebx,%%edi ; " SYSCALL_INSNS " ; xchg %%ebx,%%edi"
+
+static inline
+long _syscall0(long n)
+{
+ ulong __ret;
+ asm(SYSCALL_INSNS : "=a"(__ret) : "a"(n) : "memory");
+ return __ret;
+}
+
+static inline
+long _syscall1(long n, long a1)
+{
+ ulong __ret;
+ asm(SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1) : "memory");
+ return __ret;
+}
+
+static inline
+long _syscall2(long n, long a1, long a2)
+{
+ ulong __ret;
+ asm(SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1), "c"(a2) : "memory");
+ return __ret;
+}
+
+static inline
+long _syscall3(long n, long a1, long a2, long a3)
+{
+ ulong __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ asm(SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3) : "memory");
+#else
+ asm(SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3) : "memory");
+#endif
+ return __ret;
+}
+
+static inline
+long _syscall4(long n, long a1, long a2, long a3, long a4)
+{
+ ulong __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ asm(SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
+#else
+ asm(SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
+#endif
+ return __ret;
+}
+
+static inline
+long _syscall5(long n, long a1, long a2, long a3, long a4, long a5)
+{
+ ulong __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ asm(SYSCALL_INSNS
+ : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#else
+ asm("pushl %2 ; push %%ebx ; mov 4(%%esp),%%ebx ; " SYSCALL_INSNS " ; pop %%ebx ; add $4,%%esp"
+ : "=a"(__ret) : "a"(n), "g"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#endif
+ return __ret;
+}
+
+static inline
+long _syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
+{
+ ulong __ret;
+#if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
+ asm("pushl %7 ; push %%ebp ; mov 4(%%esp),%%ebp ; " SYSCALL_INSNS " ; pop %%ebp ; add $4,%%esp"
+ : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5), "g"(a6) : "memory");
+#else
+ ulong a1a6[2] = { a1, a6 };
+ asm("pushl %1 ; push %%ebx ; push %%ebp ; mov 8(%%esp),%%ebx ; mov 4(%%ebx),%%ebp ; mov (%%ebx),%%ebx ; " SYSCALL_INSNS " ; pop %%ebp ; pop %%ebx ; add $4,%%esp"
+ : "=a"(__ret) : "g"(&a1a6), "a"(n), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
+#endif
+ return __ret;
+}
+
diff --git a/sys/linux/port/arch/constants.h b/sys/linux/port/arch/constants.h
index dce0489..2b26899 100644
--- a/sys/linux/port/arch/constants.h
+++ b/sys/linux/port/arch/constants.h
@@ -1,11 +1,13 @@
#pragma once
-#define sys·Ocreate 0x40u
-#define sys·Onotty 0x100u
-#define sys·Otrunc 0x200u
-#define sys·Oappend 0x400u
-#define sys·Onoblock 0x800u
-#define sys·Osync 0x1000u
-#define sys·Oasync 0x2000u
-#define sys·Odirectory 0x10000u
-#define sys·Onofollow 0x20000u
+#define sys·OCreate 0x40u
+#define sys·ONotty 0x100u
+#define sys·OTrunc 0x200u
+#define sys·OAppend 0x400u
+#define sys·ONoBlock 0x800u
+#define sys·OSync 0x1000u
+#define sys·OAsync 0x2000u
+#define sys·OLargeFile 0x8000u
+#define sys·ODirectory 0x10000u
+#define sys·ONoFollow 0x20000u
+#define sys·OTmpFile 0x410000u
diff --git a/sys/linux/port/arch/errno.h b/sys/linux/port/arch/errno.h
new file mode 100644
index 0000000..dcd4bcc
--- /dev/null
+++ b/sys/linux/port/arch/errno.h
@@ -0,0 +1,134 @@
+#define sys·ErrorNotPermit 1
+#define sys·ErrorNoEntry 2
+#define sys·ErrorNoProc 3
+#define sys·ErrorInterrupt 4
+#define sys·ErrorIO 5
+#define sys·ErrorNoDevAddr 6
+#define sys·ErrorArgLen 7
+#define sys·ErrorExecFmt 8
+#define sys·ErrorBadFd 9
+#define sys·ErrorNoChild 10
+#define sys·ErrorAgain 11
+#define sys·ErrorNoMemory 12
+#define sys·ErrorAccess 13
+#define sys·ErrorBadAddr 14
+#define sys·ErrorNotBlk 15
+#define sys·ErrorBusy 16
+#define sys·ErrorExists 17
+#define sys·ErrorExDevice 18
+#define sys·ErrorNoDevice 19
+#define sys·ErrorNotDir 20
+#define sys·ErrorIsDir 21
+#define sys·ErrorBadArg 22
+#define sys·ErrorNoFiles 23
+#define sys·ErrorNoFd 24
+#define sys·ErrorNotTTY 25
+#define sys·ErrorTxtBusy 26
+#define sys·ErrorBigFile 27
+#define sys·ErrorNoSpace 28
+#define sys·ErrorNoSeek 29
+#define sys·ErrorReadOnly 30
+#define sys·ErrorNoLink 31
+#define sys·ErrorBadPipe 32
+#define sys·ErrorBadDomain 33
+#define sys·ErrorBadResult 34
+#define sys·ErrorDeadlock 35
+#define sys·ErrorNameLen 36
+#define sys·ErrorNoLock 37
+#define sys·ErrorNoSyscall 38
+#define sys·ErrorNotEmptyDir 39
+#define sys·ErrorLinkLoop 40
+#define sys·ErrorBlocks sys·ErrorAgain
+#define sys·ErrorNoMsg 42
+#define sys·ErrorNoIdent 43
+#define sys·ErrorBadChannel 44
+#define sys·ErrorLvl2NoSync 45
+#define sys·ErrorLvl3Halt 46
+#define sys·ErrorLvl3Reset 47
+#define sys·ErrorLongChannel 48
+#define sys·ErrorNoDriver 49
+#define sys·ErrorNoCSI 50
+#define sys·ErrorLvl2Halt 51
+#define sys·ErrorBadExchange 52
+#define sys·ErrorBadRequest 53
+#define sys·ErrorFullExchange 54
+#define sys·ErrorNoAnode 55
+#define sys·ErrorBadRequestCode 56
+#define sys·ErrorBadSlot 57
+#define sys·ErrorDeadlock2 sys·ErrorDeadlock
+#define sys·ErrorBadFont 59
+#define sys·ErrorNoStr 60
+#define sys·ErrorNoData 61
+#define sys·ErrorTimeout 62
+#define sys·ErrorNoStream 63
+#define sys·ErrorNoNet 64
+#define sys·ErrorNoPkg 65
+#define sys·ErrorIsRemote 66
+#define sys·ErrorDeadLink 67
+#define sys·ErrorAdv 68
+#define sys·ErrorSrmnt 69
+#define sys·ErrorCommunicate 70
+#define sys·ErrorProtocol 71
+#define sys·ErrorMultihop 72
+#define sys·ErrorDotDot 73
+#define sys·ErrorBadMsg 74
+#define sys·ErrorOverflow 75
+#define sys·ErrorNotUnique 76
+#define sys·ErrorBadFdState 77
+#define sys·ErrorNewAddress 78
+#define sys·ErrorShlibAccess 79
+#define sys·ErrorBadShlib 80
+#define sys·ErrorBadLibCode 81
+#define sys·ErrorShlibLen 82
+#define sys·ErrorSlibExec 83
+#define sys·ErrorBadWideChar 84
+#define sys·ErrorRestart 85
+#define sys·ErrorStreamPipe 86
+#define sys·ErrorUserLen 87
+#define sys·ErrorNotSocket 88
+#define sys·ErrorNeedDstAddr 89
+#define sys·ErrorMsgLen 90
+#define sys·ErrorBadProtocol 91
+#define sys·ErrorNoProtocol 92
+#define sys·ErrorNoProtocolSupport 93
+#define sys·ErrorNoSocketSupport 94
+#define sys·ErrorProtocolSupport 95
+#define sys·ErrorNoSupport sys·ErrorProtocolSupport
+#define sys·ErrorNoPFSupport 96
+#define sys·ErrorNoAFSupport 97
+#define sys·ErrorAddrInUse 98
+#define sys·ErrorAddrNotAvail 99
+#define sys·ErrorNetDown 100
+#define sys·ErrorNetHang 101
+#define sys·ErrorNetReset 102
+#define sys·ErrorAbortConnect 103
+#define sys·ErrorResetConnect 104
+#define sys·ErrorNoBuffer 105
+#define sys·ErrorIsConnect 106
+#define sys·ErrorNotConnect 107
+#define sys·ErrorShutdown 108
+#define sys·ErrorRefsLen 109
+#define sys·ErrorTimedOut 110
+#define sys·ErrorRefuseConnect 111
+#define sys·ErrorHostDown 112
+#define sys·ErrorHostHang 113
+#define sys·ErrorAlreadyConnect 114
+#define sys·ErrorInProgress 115
+#define sys·ErrorStale 116
+#define sys·ErrorNeedClean 117
+#define sys·ErrorNotNamed 118
+#define sys·ErrorNotAvail 119
+#define sys·ErrorIsNamed 120
+#define sys·ErrorRemoteIO 121
+#define sys·ErrorDiskQuota 122
+#define sys·ErrorNoMedium 123
+#define sys·ErrorBadMedium 124
+#define sys·ErrorCancel 125
+#define sys·ErrorNoKey 126
+#define sys·ErrorExpireKey 127
+#define sys·ErrorRevokeKey 128
+#define sys·ErrorRejectKey 129
+#define sys·ErrorOwnerDie 130
+#define sys·ErrorNoRecover 131
+#define sys·ErrorRFKill 132
+#define sys·ErrorHWPoison 133
diff --git a/sys/linux/riscv64/arch/bits.h b/sys/linux/riscv64/arch/bits.h
new file mode 100644
index 0000000..b09b933
--- /dev/null
+++ b/sys/linux/riscv64/arch/bits.h
@@ -0,0 +1,18 @@
+#pragma once
+
+/* base types */
+#define INT8 char
+#define INT16 short
+#define INT32 int
+#define INT64 long
+#define ADDR long
+
+/* abi */
+#define INTPTR_MIN INT64_MIN
+#define INTPTR_MAX INT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define UINTPTR_MAX UINT64_MAX
+#define PTRDIFF_MIN INT64_MIN
+#define PTRDIFF_MAX INT64_MAX
+#define SIZE_MAX UINT64_MAX
+#define LONG_MAX 0x7fffffffffffffffL
diff --git a/sys/linux/riscv64/syscall.h b/sys/linux/riscv64/syscall.h
new file mode 100644
index 0000000..b4f419c
--- /dev/null
+++ b/sys/linux/riscv64/syscall.h
@@ -0,0 +1,376 @@
+#define ·IoSetUp 0
+#define ·IoDestroy 1
+#define ·IoSubmit 2
+#define ·IoCancel 3
+#define ·IoGetEvents 4
+#define ·SetXAttr 5
+#define ·LSetXAttr 6
+#define ·FSetXAttr 7
+#define ·GetXAttr 8
+#define ·LGetXAttr 9
+#define ·FGetXAttr 10
+#define ·ListXAttr 11
+#define ·LListXAttr 12
+#define ·FListXAttr 13
+#define ·RemoveXAttr 14
+#define ·LRemoveXAttr 15
+#define ·FRemoveXAttr 16
+#define ·GetCwd 17
+#define ·LookupDCookie 18
+#define ·EventFd2 19
+#define ·EPollCreate1 20
+#define ·EPollCtl 21
+#define ·EPollPWait 22
+#define ·Dup 23
+#define ·Dup3 24
+#define ·FCntl 25
+#define ·INotifyInIt1 26
+#define ·INotifyAddWatch 27
+#define ·INotifyRmWatch 28
+#define ·IoCtl 29
+#define ·IoPrIoSet 30
+#define ·IoPrIoGet 31
+#define ·FLock 32
+#define ·MkNodAt 33
+#define ·MkdirAt 34
+#define ·UnlinkAt 35
+#define ·SymLinkAt 36
+#define ·LinkAt 37
+#define ·UMount2 39
+#define ·Mount 40
+#define ·PivotRoot 41
+#define ·NfsServCtl 42
+#define ·StatFs 43
+#define ·FStatFs 44
+#define ·Truncate 45
+#define ·FTruncate 46
+#define ·FAllocate 47
+#define ·FAccessAt 48
+#define ·Chdir 49
+#define ·FChdir 50
+#define ·Chroot 51
+#define ·FChmod 52
+#define ·FChmodAt 53
+#define ·FChownAt 54
+#define ·FChown 55
+#define ·OpenAt 56
+#define ·Close 57
+#define ·VHangUp 58
+#define ·Pipe2 59
+#define ·QuotaCtl 60
+#define ·GetDents64 61
+#define ·LSeek 62
+#define ·Read 63
+#define ·Write 64
+#define ·ReadV 65
+#define ·WriteV 66
+#define ·PRead64 67
+#define ·PWrite64 68
+#define ·PreAdv 69
+#define ·PWriteV 70
+#define ·SendFile 71
+#define ·PSelect6 72
+#define ·PPoll 73
+#define ·SignalFd4 74
+#define ·VmSplice 75
+#define ·Splice 76
+#define ·Tee 77
+#define ·ReadLinkAt 78
+#define ·FStatAt 79
+#define ·FStat 80
+#define ·Sync 81
+#define ·FSync 82
+#define ·FdAtAsync 83
+#define ·SyncFileRange 84
+#define ·TimerFdCreate 85
+#define ·TimerFdSetTime 86
+#define ·TimerFdGetTime 87
+#define ·UTimeNsAt 88
+#define ·Acct 89
+#define ·CapGet 90
+#define ·CapSet 91
+#define ·Personality 92
+#define ·Exit 93
+#define ·ExitGroup 94
+#define ·WaitId 95
+#define ·SetTIdAddress 96
+#define ·UnShare 97
+#define ·Futex 98
+#define ·SetRobustList 99
+#define ·GetRobustList 100
+#define ·NanoSleep 101
+#define ·GetITimer 102
+#define ·SetITimer 103
+#define ·KExecLoad 104
+#define ·InItModule 105
+#define ·DeleteModule 106
+#define ·TimerCreate 107
+#define ·TimerGetTime 108
+#define ·TimerGetOverrun 109
+#define ·TimerSetTime 110
+#define ·TimerDelete 111
+#define ·ClockSetTime 112
+#define ·ClockGetTime 113
+#define ·ClockGetRes 114
+#define ·ClockNanoSleep 115
+#define ·SysLog 116
+#define ·PTrace 117
+#define ·SchedSetParam 118
+#define ·SchedSetScheduler 119
+#define ·SchedGetScheduler 120
+#define ·SchedGetParam 121
+#define ·SchedSetAffinity 122
+#define ·SchedGetAffinity 123
+#define ·SchedYield 124
+#define ·SchedGetPriorityMax 125
+#define ·SchedGetPriorityMin 126
+#define ·SchedRrGetInterval 127
+#define ·RestartSysCall 128
+#define ·Kill 129
+#define ·TKill 130
+#define ·TgKill 131
+#define ·SiGaltStack 132
+#define ·RtSigSuspend 133
+#define ·RtSigAction 134
+#define ·RtSigProcMask 135
+#define ·RtSigPending 136
+#define ·RtSigTimedWait 137
+#define ·RtSigQueueInfo 138
+#define ·RtSigReturn 139
+#define ·SetPriority 140
+#define ·GetPriority 141
+#define ·Reboot 142
+#define ·SetReGid 143
+#define ·SetGid 144
+#define ·SetReUid 145
+#define ·SetUid 146
+#define ·SetResUid 147
+#define ·GetResUid 148
+#define ·SetResGid 149
+#define ·GetResGid 150
+#define ·SetFsUid 151
+#define ·SetFsGid 152
+#define ·Times 153
+#define ·SetPGid 154
+#define ·GetPGid 155
+#define ·GetsId 156
+#define ·SetSId 157
+#define ·GetGroups 158
+#define ·SetGroups 159
+#define ·UName 160
+#define ·SetHostname 161
+#define ·SetDomainName 162
+#define ·GetRLimit 163
+#define ·SetRLimit 164
+#define ·GetRUsage 165
+#define ·UMask 166
+#define ·PrCtl 167
+#define ·GetCpu 168
+#define ·GetTimeOfDay 169
+#define ·SetTimeOfDay 170
+#define ·AdjTimex 171
+#define ·GetPid 172
+#define ·GetPPid 173
+#define ·GetUid 174
+#define ·GetEUid 175
+#define ·GetGid 176
+#define ·GetEGid 177
+#define ·GetTId 178
+#define ·SysInfo 179
+#define ·MQOpen 180
+#define ·MQUnlink 181
+#define ·MQTimedSend 182
+#define ·MQTimedReceive 183
+#define ·MQNotify 184
+#define ·MQGetSetAttr 185
+#define ·MsgGet 186
+#define ·MsgCtl 187
+#define ·MsgRecv 188
+#define ·MsgSend 189
+#define ·SemGet 190
+#define ·SemCtl 191
+#define ·SemTimeDop 192
+#define ·SemOp 193
+#define ·ShmGet 194
+#define ·ShmCtl 195
+#define ·ShmAt 196
+#define ·ShmDt 197
+#define ·Socket 198
+#define ·SocketPair 199
+#define ·Bind 200
+#define ·Listen 201
+#define ·Accept 202
+#define ·Connect 203
+#define ·GetSockName 204
+#define ·GetPeerName 205
+#define ·SendTo 206
+#define ·RecvFrom 207
+#define ·SetSockOpt 208
+#define ·GetSockOpt 209
+#define ·Shutdown 210
+#define ·SendMsg 211
+#define ·RecvMsg 212
+#define ·ReadAhead 213
+#define ·Brk 214
+#define ·MUnmap 215
+#define ·MRemap 216
+#define ·AddKey 217
+#define ·RequestKey 218
+#define ·KeyCtl 219
+#define ·Clone 220
+#define ·ExecVe 221
+#define ·MMap 222
+#define ·FAdvise64 223
+#define ·SwapOn 224
+#define ·SwapOff 225
+#define ·MProtect 226
+#define ·MSync 227
+#define ·MLock 228
+#define ·MUnlock 229
+#define ·MLockAll 230
+#define ·MUnlockAll 231
+#define ·MLoaded 232
+#define ·MAdvise 233
+#define ·RemapFilePages 234
+#define ·MBind 235
+#define ·GetMemPolicy 236
+#define ·SetMemPolicy 237
+#define ·MigratePages 238
+#define ·MovePages 239
+#define ·RtTgSigQueueInfo 240
+#define ·PerFEventOpen 241
+#define ·Accept4 242
+#define ·RecvMMsg 243
+#define ·ArchSpecificSysCall 244
+#define ·Wait4 260
+#define ·PrLimit64 261
+#define ·FaNotifyInIt 262
+#define ·FaNotifyMark 263
+#define ·NameToHandleAt 264
+#define ·OpenByHandleAt 265
+#define ·ClockAdjTime 266
+#define ·SyncFs 267
+#define ·SetNs 268
+#define ·SendMMsg 269
+#define ·ProcessVmReadV 270
+#define ·ProcessVmWriteV 271
+#define ·KCmp 272
+#define ·FinItModule 273
+#define ·SchedSetAttr 274
+#define ·SchedGetAttr 275
+#define ·RenameAt2 276
+#define ·SeccoMp 277
+#define ·GetRandom 278
+#define ·MemFdCreate 279
+#define ·BpF 280
+#define ·ExecVeAt 281
+#define ·UserFaultFd 282
+#define ·MemBarrier 283
+#define ·MLock2 284
+#define ·CopyFileRange 285
+#define ·PreAdv2 286
+#define ·PWriteV2 287
+#define ·PKeyMProtect 288
+#define ·PKeyAllOc 289
+#define ·PKeyFree 290
+#define ·StatX 291
+#define ·IoPGetEvents 292
+#define ·RSeq 293
+#define ·KExecFileLoad 294
+#define ·PidFdSendSignal 424
+#define ·IoUringSetUp 425
+#define ·IoUringEnter 426
+#define ·IoUringRegister 427
+#define ·OpenTree 428
+#define ·MoveMount 429
+#define ·FsOpen 430
+#define ·FsConfig 431
+#define ·FsMount 432
+#define ·FsPick 433
+#define ·PidFdOpen 434
+#define ·Clone3 435
+#define ·CloseRange 436
+#define ·OpenAt2 437
+#define ·PidFdGetFd 438
+#define ·FAccessAt2 439
+
+/* assembly routines */
+#define asm __asm__ __volatile__
+
+#define __asm_syscall(...) \
+ asm("ecall\n\t" \
+ : "=r"(a0) : __VA_ARGS__ : "memory"); \
+ return a0; \
+
+static inline
+long _syscall0(long n)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0");
+ __asm_syscall("r"(a7))
+}
+
+static inline
+long _syscall1(long n, long a)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ __asm_syscall("r"(a7), "0"(a0))
+}
+
+static inline
+long _syscall2(long n, long a, long b)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1))
+}
+
+static inline
+long _syscall3(long n, long a, long b, long c)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2))
+}
+
+static inline
+long _syscall4(long n, long a, long b, long c, long d)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3))
+}
+
+static inline
+long _syscall5(long n, long a, long b, long c, long d, long e)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ register long a4 __asm__("a4") = e;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4))
+}
+
+static inline
+long _syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0") = a;
+ register long a1 __asm__("a1") = b;
+ register long a2 __asm__("a2") = c;
+ register long a3 __asm__("a3") = d;
+ register long a4 __asm__("a4") = e;
+ register long a5 __asm__("a5") = f;
+ __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5))
+}
+
+
diff --git a/sys/src/close.c b/sys/src/close.c
index 88b1e2b..b9da3ab 100644
--- a/sys/src/close.c
+++ b/sys/src/close.c
@@ -3,5 +3,6 @@
int
sys·close(int fd)
{
- return syscall(·Close, fd);
+ intptr ret = syscall(·Close, fd);
+ return error(ret);
}
diff --git a/sys/src/dup.c b/sys/src/dup.c
index 0943f52..5877df3 100644
--- a/sys/src/dup.c
+++ b/sys/src/dup.c
@@ -1,7 +1,8 @@
#include "internal.h"
int
-sys·dup(int fd)
+sys·dup(int oldfd, int newfd)
{
- return syscall(·Dup, fd);
+ intptr ret = syscall(·Dup2, oldfd, newfd);
+ return error(ret);
}
diff --git a/sys/src/errno.inc.h b/sys/src/errno.inc.h
new file mode 100644
index 0000000..58ee427
--- /dev/null
+++ b/sys/src/errno.inc.h
@@ -0,0 +1,89 @@
+E(0, "no error information")
+E(sys·ErrorBadWideChar, "illegal byte sequence")
+E(sys·ErrorBadDomain, "domain error")
+E(sys·ErrorBadResult, "result not representable")
+E(sys·ErrorNotTTY, "not a tty")
+E(sys·ErrorAccess, "permission denied")
+E(sys·ErrorNotPermit, "operation not permitted")
+E(sys·ErrorNoEntry, "no such file or directory")
+E(sys·ErrorNoProc, "no such process")
+E(sys·ErrorExists, "file exists")
+E(sys·ErrorOverflow, "value too large for data type")
+E(sys·ErrorNoSpace, "no space left on device")
+E(sys·ErrorNoMemory, "out of memory")
+E(sys·ErrorBusy, "resource busy")
+E(sys·ErrorInterrupt, "interrupted system call")
+E(sys·ErrorAgain, "resource temporarily unavailable")
+E(sys·ErrorNoSeek, "invalid seek")
+E(sys·ErrorExDevice, "cross-device link")
+E(sys·ErrorReadOnly, "read-only file system")
+E(sys·ErrorNotEmptyDir, "directory not empty")
+E(sys·ErrorResetConnect, "connection reset by peer")
+E(sys·ErrorTimedOut, "operation timed out")
+E(sys·ErrorRefuseConnect, "connection refused")
+E(sys·ErrorHostDown, "host is down")
+E(sys·ErrorHostHang, "host is unreachable")
+E(sys·ErrorAddrInUse, "address in use")
+E(sys·ErrorBadPipe, "broken pipe")
+E(sys·ErrorIO, "i/o error")
+E(sys·ErrorNoDevAddr, "no such device or address")
+E(sys·ErrorNotBlk, "block device required")
+E(sys·ErrorNoDevice, "no such device")
+E(sys·ErrorNotDir, "not a directory")
+E(sys·ErrorIsDir, "is a directory")
+E(sys·ErrorTxtBusy, "text file busy")
+E(sys·ErrorExecFmt, "exec format error")
+E(sys·ErrorBadArg, "invalid argument")
+E(sys·ErrorArgLen, "argument list too long")
+E(sys·ErrorLinkLoop, "symbolic link loop")
+E(sys·ErrorNameLen, "filename too long")
+E(sys·ErrorNoFiles, "too many open files in system")
+E(sys·ErrorNoFd, "no file descriptors available")
+E(sys·ErrorBadFd, "bad file descriptor")
+E(sys·ErrorNoChild, "no child process")
+E(sys·ErrorBadAddr, "bad address")
+E(sys·ErrorBigFile, "file too large")
+E(sys·ErrorNoLink, "too many links")
+E(sys·ErrorNoLock, "no locks available")
+E(sys·ErrorDeadlock, "resource deadlock would occur")
+E(sys·ErrorNoRecover, "state not recoverable")
+E(sys·ErrorOwnerDie, "previous owner died")
+E(sys·ErrorCancel, "operation canceled")
+E(sys·ErrorNoSyscall, "function not implemented")
+E(sys·ErrorNoMsg, "no message of desired type")
+E(sys·ErrorNoIdent, "identifier removed")
+E(sys·ErrorNoStr, "device not a stream")
+E(sys·ErrorNoData, "no data available")
+E(sys·ErrorTimeout, "device timeout")
+E(sys·ErrorNoStream, "out of streams resources")
+E(sys·ErrorDeadLink, "link has been severed")
+E(sys·ErrorProtocol, "protocol error")
+E(sys·ErrorBadMsg, "bad message")
+E(sys·ErrorBadFdState, "file descriptor in bad state")
+E(sys·ErrorNotSocket, "not a socket")
+E(sys·ErrorNeedDstAddr, "destination address required")
+E(sys·ErrorMsgLen, "message too large")
+E(sys·ErrorBadProtocol, "protocol wrong type for socket")
+E(sys·ErrorNoProtocol, "protocol not available")
+E(sys·ErrorNoProtocolSupport, "protocol not supported")
+E(sys·ErrorNoSocketSupport, "socket type not supported")
+E(sys·ErrorNoSupport, "not supported")
+E(sys·ErrorNoPFSupport, "protocol family not supported")
+E(sys·ErrorNoAFSupport, "address family not supported by protocol")
+E(sys·ErrorAddrNotAvail, "address not available")
+E(sys·ErrorNetDown, "network is down")
+E(sys·ErrorNetHang, "network unreachable")
+E(sys·ErrorNetReset, "connection reset by network")
+E(sys·ErrorAbortConnect, "connection aborted")
+E(sys·ErrorNoBuffer, "no buffer space available")
+E(sys·ErrorIsConnect, "socket is connected")
+E(sys·ErrorNotConnect, "socket not connected")
+E(sys·ErrorShutdown, "cannot send after socket shutdown")
+E(sys·ErrorAlreadyConnect, "operation already in progress")
+E(sys·ErrorInProgress, "operation in progress")
+E(sys·ErrorStale, "stale file handle")
+E(sys·ErrorRemoteIO, "remote i/o error")
+E(sys·ErrorDiskQuota, "quota exceeded")
+E(sys·ErrorNoMedium, "no medium found")
+E(sys·ErrorBadMedium, "wrong medium type")
+E(sys·ErrorMultihop, "multihop attempted")
diff --git a/sys/src/errormsg.c b/sys/src/errormsg.c
new file mode 100644
index 0000000..e1d4b73
--- /dev/null
+++ b/sys/src/errormsg.c
@@ -0,0 +1,26 @@
+#include "internal.h"
+
+static const struct ErrorMessage {
+#define E(n, s) char str##n[sizeof(s)];
+#include "errno.inc.h"
+#undef E
+} errormsg = {
+#define E(n, s) s,
+#include "errno.inc.h"
+#undef E
+};
+
+static const ushort errmsgidx[] = {
+#define E(n, s) [n] = offsetof(struct ErrorMessage, str##n),
+#include "errno.inc.h"
+#undef E
+};
+
+char *
+sys·errormsg(int errno)
+{
+ if(errno >= arrlen(errmsgidx))
+ errno=0;
+
+ return (char*)(&errormsg + errmsgidx[errno]);
+}
diff --git a/sys/src/internal.h b/sys/src/internal.h
index abfb729..bf3d0ec 100644
--- a/sys/src/internal.h
+++ b/sys/src/internal.h
@@ -1,6 +1,7 @@
#pragma once
#include <u.h>
+#include <sys.h>
#include <syscall.h>
#define syscall1(n,a1) _syscall1(n,sysarg(a1))
@@ -19,4 +20,251 @@
#define syscall(...) __SYSCALL_DISP(syscall,__VA_ARGS__)
+#ifndef sysarg
+# define sysarg(x) ((long)(x))
+#endif
+
#define error(ret) ((ret) < 0 && (ret) > -4096) ? (-(ret)) : 0
+
+/*********************************************
+ * XXX: below this line is computer generated
+ *********************************************/
+
+/* legacy cleanup */
+#ifdef ·SocketCall
+#endif
+
+#ifdef ·GetUid32
+# undef ·LChown
+# undef ·GetUid
+# undef ·GetGid
+# undef ·GetEUid
+# undef ·GetEGid
+# undef ·SetReUid
+# undef ·SetReGid
+# undef ·GetGroups
+# undef ·SetGroups
+# undef ·FChown
+# undef ·SetResUid
+# undef ·GetResUid
+# undef ·SetResGid
+# undef ·GetResGid
+# undef ·Chown
+# undef ·SetUid
+# undef ·SetGid
+# undef ·SetFsUid
+# undef ·SetFsGid
+# define ·LChown ·LChown32
+# define ·GetUid ·GetUid32
+# define ·GetGid ·GetGid32
+# define ·GetEUid ·GetEUid32
+# define ·GetEGid ·GetEGid32
+# define ·SetReUid ·SetReUid32
+# define ·SetReGid ·SetReGid32
+# define ·GetGroups ·GetGroups32
+# define ·SetGroups ·SetGroups32
+# define ·FChown ·FChown32
+# define ·SetResUid ·SetResUid32
+# define ·GetResUid ·GetResUid32
+# define ·SetResGid ·SetResGid32
+# define ·GetResGid ·GetResGid32
+# define ·Chown ·Chown32
+# define ·SetUid ·SetUid32
+# define ·SetGid ·SetGid32
+# define ·SetFsUid ·SetFsUid32
+# define ·SetFsGid ·SetFsGid32
+#endif
+
+#ifdef ·FCntl64
+# undef ·FCntl
+# define ·FCntl ·FCntl64
+#endif
+
+#ifdef ·GetDents64
+# undef ·GetDents
+# define ·GetDents ·GetDents64
+#endif
+
+#ifdef ·FTruncate64
+# undef ·FTruncate
+# undef ·Truncate
+# define ·FTruncate ·FTruncate64
+# define ·Truncate ·Truncate64
+#endif
+
+#ifdef ·Stat64
+# undef ·Stat
+# define ·Stat ·Stat64
+#endif
+
+#ifdef ·FStat64
+# undef ·FStat
+# define ·FStat ·FStat64
+#endif
+
+#ifdef ·LStat64
+# undef ·LStat
+# define ·LStat ·LStat64
+#endif
+
+#ifdef ·StatFs64
+# undef ·StatFs
+# define ·StatFs ·StatFs64
+#endif
+
+#ifdef ·FStatFs64
+# undef ·FStatFs
+# define ·FStatFs ·FStatFs64
+#endif
+
+#ifdef ·NewFStatAt
+# undef ·FStatAt
+# define ·FStatAt ·NewFStatAt
+# undef ·FStatAt
+# define ·FStatAt ·FStatAt64
+#endif
+
+#ifdef ·UGetRLimit
+# undef ·GetRLimit
+# define ·GetRLimit ·UGetRLimit
+#endif
+
+#ifdef ·NewSelect
+# undef ·Select
+# define ·Select ·NewSelect
+#endif
+
+#ifdef ·PRead64
+# undef ·PRead
+# undef ·PWrite
+# define ·PRead ·PRead64
+# define ·PWrite ·PWrite64
+#endif
+
+#ifdef ·FAdvise6464
+# undef ·FAdvise
+# define ·FAdvise ·FAdvise6464
+# undef ·FAdvise
+# define ·FAdvise ·FAdvise64
+#endif
+
+#ifdef ·SendFile64
+# undef ·SendFile
+# define ·SendFile ·SendFile64
+#endif
+
+#ifndef ·TimerSetTime
+# define ·TimerSetTime ·TimerSetTime32
+#endif
+
+#ifndef ·TimerGetTime
+# define ·TimerGetTime ·TimerGetTime32
+#endif
+
+#ifndef ·TimerFdSetTime
+# define ·TimerFdSetTime ·TimerFdSetTime32
+#endif
+
+#ifndef ·TimerFdGetTime
+# define ·TimerFdGetTime ·TimerFdGetTime32
+#endif
+
+#ifndef ·ClockSetTime
+# define ·ClockSetTime ·ClockSetTime32
+#endif
+
+#ifndef ·ClockGetTime
+# define ·ClockGetTime ·ClockGetTime32
+#endif
+
+#ifndef ·ClockGetRes
+# define ·ClockGetRes ·ClockGetResTime32
+#endif
+
+#ifndef ·ClockNanoSleep
+# define ·ClockNanoSleep ·ClockNanoSleepTime32
+#endif
+
+#ifndef ·GetTimeOfDay
+# define ·GetTimeOfDay ·GetTimeOfDayTime32
+#endif
+
+#ifndef ·SetTimeOfDay
+# define ·SetTimeOfDay ·SetTimeOfDayTime32
+#endif
+
+#ifndef ·ClockGetTime
+# define ·ClockGetTime ·ClockGetTime64
+#endif
+
+#ifndef ·ClockSetTime
+# define ·ClockSetTime ·ClockSetTime64
+#endif
+
+#ifndef ·ClockAdjTime
+# define ·ClockAdjTime ·ClockAdjTime64
+#endif
+
+#ifndef ·ClockGetRes
+# define ·ClockGetRes ·ClockGetResTime64
+#endif
+
+#ifndef ·ClockNanoSleep
+# define ·ClockNanoSleep ·ClockNanoSleepTime64
+#endif
+
+#ifndef ·TimerGetTime
+# define ·TimerGetTime ·TimerGetTime64
+#endif
+
+#ifndef ·TimerSetTime
+# define ·TimerSetTime ·TimerSetTime64
+#endif
+
+#ifndef ·TimerFdGetTime
+# define ·TimerFdGetTime ·TimerFdGetTime64
+#endif
+
+#ifndef ·TimerFdSetTime
+# define ·TimerFdSetTime ·TimerFdSetTime64
+#endif
+
+#ifndef ·UTimeNsAt
+# define ·UTimeNsAt ·UTimeNsAtTime64
+#endif
+
+#ifndef ·PSelect6
+# define ·PSelect6 ·PSelect6Time64
+#endif
+
+#ifndef ·PPoll
+# define ·PPoll ·PPollTime64
+#endif
+
+#ifndef ·RecvMMsg
+# define ·RecvMMsg ·RecvMMsgTime64
+#endif
+
+#ifndef ·MQTimedSend
+# define ·MQTimedSend ·MQTimedSendTime64
+#endif
+
+#ifndef ·MQTimedReceive
+# define ·MQTimedReceive ·MQTimedReceiveTime64
+#endif
+
+#ifndef ·RtSigTimedWait
+# define ·RtSigTimedWait ·RtSigTimedWaitTime64
+#endif
+
+#ifndef ·Futex
+# define ·Futex ·FutexTime64
+#endif
+
+#ifndef ·SchedRrGetInterval
+# define ·SchedRrGetInterval ·SchedRrGetIntervalTime64
+#endif
+
+#ifndef ·Accept
+# define ·Accept ·Accept4
+#endif
diff --git a/sys/src/open.c b/sys/src/open.c
index 580dd91..fcc014b 100644
--- a/sys/src/open.c
+++ b/sys/src/open.c
@@ -3,7 +3,6 @@
int
sys·open(char *path, int flag, int mode, int *ret)
{
- long err;
- err = *ret = syscall(·Open, flag, mode);
+ intptr err = *ret = syscall(·Open, flag, mode);
return error(err);
}
diff --git a/sys/src/read.c b/sys/src/read.c
index 3aa3e29..8d308ba 100644
--- a/sys/src/read.c
+++ b/sys/src/read.c
@@ -1,7 +1,8 @@
#include "internal.h"
-intptr
-sys·read(int fd, intptr len, void *buf)
+int
+sys·read(int fd, intptr len, void *buf, intptr *n)
{
- return syscall(·Read, fd, buf, len);
+ intptr ret = *n = syscall(·Read, fd, buf, len);
+ return error(ret);
}
diff --git a/sys/src/seek.c b/sys/src/seek.c
new file mode 100644
index 0000000..f1f8628
--- /dev/null
+++ b/sys/src/seek.c
@@ -0,0 +1,8 @@
+#include "internal.h"
+
+int
+sys·seek(int fd, intptr offset, int from, intptr *pos)
+{
+ long ret = *pos = syscall(·LSeek, fd, offset, from);
+ return error(ret);
+}
diff --git a/sys/src/write.c b/sys/src/write.c
index c1faff5..16c9f71 100644
--- a/sys/src/write.c
+++ b/sys/src/write.c
@@ -1,7 +1,8 @@
#include "internal.h"
-intptr
-sys·write(int fd, intptr size, intptr len, void *buf)
+int
+sys·write(int fd, intptr len, void *buf, intptr *ret)
{
- return syscall(·Write, fd, buf, size*len);
+ long err = *ret = syscall(·Write, fd, buf, len);
+ return err;
}