aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/builtin/linux_bare
diff options
context:
space:
mode:
authorIndrajith K L2022-12-03 17:00:20 +0530
committerIndrajith K L2022-12-03 17:00:20 +0530
commitf5c4671bfbad96bf346bd7e9a21fc4317b4959df (patch)
tree2764fc62da58f2ba8da7ed341643fc359873142f /v_windows/v/vlib/builtin/linux_bare
downloadcli-tools-windows-master.tar.gz
cli-tools-windows-master.tar.bz2
cli-tools-windows-master.zip
Adds most of the toolsHEADmaster
Diffstat (limited to 'v_windows/v/vlib/builtin/linux_bare')
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/libc_impl.v162
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/linux_syscalls.v433
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/memory_managment.v29
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/.gitignore5
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/checks.v32
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/consts/consts.v22
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/forkedtest/forkedtest.v49
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/linuxsys/linuxsys.v300
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/readme.md5
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/sample_text1.txt1
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/string/string.v63
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/.checks/structs/structs.v42
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/array_bare.v53
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/builtin_bare.v60
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/linuxsys_bare.v759
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v58
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/string_bare.v150
-rw-r--r--v_windows/v/vlib/builtin/linux_bare/old/syscallwrapper_test.v27
18 files changed, 2250 insertions, 0 deletions
diff --git a/v_windows/v/vlib/builtin/linux_bare/libc_impl.v b/v_windows/v/vlib/builtin/linux_bare/libc_impl.v
new file mode 100644
index 0000000..a8d6d63
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/libc_impl.v
@@ -0,0 +1,162 @@
+module builtin
+
+[unsafe]
+pub fn memcpy(dest &C.void, src &C.void, n size_t) &C.void {
+ dest_ := unsafe { &byte(dest) }
+ src_ := unsafe { &byte(src) }
+ unsafe {
+ for i in 0 .. int(n) {
+ dest_[i] = src_[i]
+ }
+ }
+ return unsafe { dest }
+}
+
+[export: 'malloc']
+[unsafe]
+fn __malloc(n size_t) &C.void {
+ return unsafe { malloc(int(n)) }
+}
+
+[unsafe]
+fn strlen(_s &C.void) size_t {
+ s := unsafe { &byte(_s) }
+ mut i := 0
+ for ; unsafe { s[i] } != 0; i++ {}
+ return size_t(i)
+}
+
+[unsafe]
+fn realloc(old_area &C.void, new_size size_t) &C.void {
+ if old_area == 0 {
+ return unsafe { malloc(int(new_size)) }
+ }
+ if new_size == size_t(0) {
+ unsafe { free(old_area) }
+ return 0
+ }
+ old_size := unsafe { *(&u64(old_area - sizeof(u64))) }
+ if u64(new_size) <= old_size {
+ return unsafe { old_area }
+ } else {
+ new_area := unsafe { malloc(int(new_size)) }
+ unsafe { memmove(new_area, old_area, size_t(old_size)) }
+ unsafe { free(old_area) }
+ return new_area
+ }
+}
+
+[unsafe]
+fn memset(s &C.void, c int, n size_t) &C.void {
+ mut s_ := unsafe { &char(s) }
+ for i in 0 .. int(n) {
+ unsafe {
+ s_[i] = char(c)
+ }
+ }
+ return unsafe { s }
+}
+
+[unsafe]
+fn memmove(dest &C.void, src &C.void, n size_t) &C.void {
+ dest_ := unsafe { &byte(dest) }
+ src_ := unsafe { &byte(src) }
+ mut temp_buf := unsafe { malloc(int(n)) }
+ for i in 0 .. int(n) {
+ unsafe {
+ temp_buf[i] = src_[i]
+ }
+ }
+
+ for i in 0 .. int(n) {
+ unsafe {
+ dest_[i] = temp_buf[i]
+ }
+ }
+ unsafe { free(temp_buf) }
+ return unsafe { dest }
+}
+
+[export: 'calloc']
+[unsafe]
+fn __calloc(nmemb size_t, size size_t) &C.void {
+ new_area := unsafe { malloc(int(nmemb) * int(size)) }
+ unsafe { memset(new_area, 0, nmemb * size) }
+ return new_area
+}
+
+fn getchar() int {
+ x := byte(0)
+ sys_read(0, &x, 1)
+ return int(x)
+}
+
+fn memcmp(a &C.void, b &C.void, n size_t) int {
+ a_ := unsafe { &byte(a) }
+ b_ := unsafe { &byte(b) }
+ for i in 0 .. int(n) {
+ if unsafe { a_[i] != b_[i] } {
+ unsafe {
+ return a_[i] - b_[i]
+ }
+ }
+ }
+ return 0
+}
+
+[export: 'free']
+[unsafe]
+fn __free(ptr &C.void) {
+ err := mm_free(ptr)
+ if err != .enoerror {
+ eprintln('free error:')
+ panic(err)
+ }
+}
+
+fn vsprintf(str &char, format &char, ap &byte) int {
+ panic('vsprintf(): string interpolation is not supported in `-freestanding`')
+}
+
+fn vsnprintf(str &char, size size_t, format &char, ap &byte) int {
+ panic('vsnprintf(): string interpolation is not supported in `-freestanding`')
+}
+
+// not really needed
+fn bare_read(buf &byte, count u64) (i64, Errno) {
+ return sys_read(0, buf, count)
+}
+
+fn bare_print(buf &byte, len u64) {
+ sys_write(1, buf, len)
+}
+
+fn bare_eprint(buf &byte, len u64) {
+ sys_write(2, buf, len)
+}
+
+pub fn write(fd i64, buf &byte, count u64) i64 {
+ x, _ := sys_write(fd, buf, count)
+ return x
+}
+
+[noreturn]
+fn bare_panic(msg string) {
+ println('V panic' + msg)
+ exit(1)
+}
+
+fn bare_backtrace() string {
+ return 'backtraces are not available with `-freestanding`'
+}
+
+[export: 'exit']
+[noreturn]
+fn __exit(code int) {
+ sys_exit(code)
+}
+
+[export: 'qsort']
+fn __qsort(base voidptr, nmemb size_t, size size_t, sort_cb FnSortCB) {
+ panic('qsort() is not yet implemented in `-freestanding`')
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/linux_syscalls.v b/v_windows/v/vlib/builtin/linux_bare/linux_syscalls.v
new file mode 100644
index 0000000..b0b2c47
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/linux_syscalls.v
@@ -0,0 +1,433 @@
+module builtin
+
+enum SigIndex {
+ si_signo = 0x00
+ si_code = 0x02
+ si_pid = 0x04
+ si_uid = 0x05
+ si_status = 0x06
+ si_size = 0x80
+}
+
+enum Signo {
+ sighup = 1 // Hangup.
+ sigint = 2 // Interactive attention signal.
+ sigquit = 3 // Quit.
+ sigill = 4 // Illegal instruction.
+ sigtrap = 5 // Trace/breakpoint trap.
+ sigabrt = 6 // Abnormal termination.
+ sigbus = 7
+ sigfpe = 8 // Erroneous arithmetic operation.
+ sigkill = 9 // Killed.
+ sigusr1 = 10
+ sigsegv = 11 // Invalid access to memory.
+ sigusr2 = 12
+ sigpipe = 13 // Broken pipe.
+ sigalrm = 14 // Alarm clock.
+ sigterm = 15 // Termination request.
+ sigstkflt = 16
+ sigchld = 17
+ sigcont = 18
+ sigstop = 19
+ sigtstp = 20
+ sigttin = 21 // Background read from control terminal.
+ sigttou = 22 // Background write to control terminal.
+ sigurg = 23
+ sigxcpu = 24 // CPU time limit exceeded.
+ sigxfsz = 25 // File size limit exceeded.
+ sigvtalrm = 26 // Virtual timer expired.
+ sigprof = 27 // Profiling timer expired.
+ sigwinch = 28
+ sigpoll = 29
+ sigsys = 31
+}
+
+// List of all the errors returned by syscalls
+enum Errno {
+ enoerror = 0x00000000
+ eperm = 0x00000001
+ enoent = 0x00000002
+ esrch = 0x00000003
+ eintr = 0x00000004
+ eio = 0x00000005
+ enxio = 0x00000006
+ e2big = 0x00000007
+ enoexec = 0x00000008
+ ebadf = 0x00000009
+ echild = 0x0000000a
+ eagain = 0x0000000b
+ enomem = 0x0000000c
+ eacces = 0x0000000d
+ efault = 0x0000000e
+ enotblk = 0x0000000f
+ ebusy = 0x00000010
+ eexist = 0x00000011
+ exdev = 0x00000012
+ enodev = 0x00000013
+ enotdir = 0x00000014
+ eisdir = 0x00000015
+ einval = 0x00000016
+ enfile = 0x00000017
+ emfile = 0x00000018
+ enotty = 0x00000019
+ etxtbsy = 0x0000001a
+ efbig = 0x0000001b
+ enospc = 0x0000001c
+ espipe = 0x0000001d
+ erofs = 0x0000001e
+ emlink = 0x0000001f
+ epipe = 0x00000020
+ edom = 0x00000021
+ erange = 0x00000022
+}
+
+enum MemProt {
+ prot_read = 0x1
+ prot_write = 0x2
+ prot_exec = 0x4
+ prot_none = 0x0
+ prot_growsdown = 0x01000000
+ prot_growsup = 0x02000000
+}
+
+enum MapFlags {
+ map_shared = 0x01
+ map_private = 0x02
+ map_shared_validate = 0x03
+ map_type = 0x0f
+ map_fixed = 0x10
+ map_file = 0x00
+ map_anonymous = 0x20
+ map_huge_shift = 26
+ map_huge_mask = 0x3f
+}
+
+// const (
+// fcntlf_dupfd = 0x00000000
+// fcntlf_exlck = 0x00000004
+// fcntlf_getfd = 0x00000001
+// fcntlf_getfl = 0x00000003
+// fcntlf_getlk = 0x00000005
+// fcntlf_getlk64 = 0x0000000c
+// fcntlf_getown = 0x00000009
+// fcntlf_getowner_uids = 0x00000011
+// fcntlf_getown_ex = 0x00000010
+// fcntlf_getsig = 0x0000000b
+// fcntlf_ofd_getlk = 0x00000024
+// fcntlf_ofd_setlk = 0x00000025
+// fcntlf_ofd_setlkw = 0x00000026
+// fcntlf_owner_pgrp = 0x00000002
+// fcntlf_owner_pid = 0x00000001
+// fcntlf_owner_tid = 0x00000000
+// fcntlf_rdlck = 0x00000000
+// fcntlf_setfd = 0x00000002
+// fcntlf_setfl = 0x00000004
+// fcntlf_setlk = 0x00000006
+// fcntlf_setlk64 = 0x0000000d
+// fcntlf_setlkw = 0x00000007
+// fcntlf_setlkw64 = 0x0000000e
+// fcntlf_setown = 0x00000008
+// fcntlf_setown_ex = 0x0000000f
+// fcntlf_setsig = 0x0000000a
+// fcntlf_shlck = 0x00000008
+// fcntlf_unlck = 0x00000002
+// fcntlf_wrlck = 0x00000001
+// fcntllock_ex = 0x00000002
+// fcntllock_mand = 0x00000020
+// fcntllock_nb = 0x00000004
+// fcntllock_read = 0x00000040
+// fcntllock_rw = 0x000000c0
+// fcntllock_sh = 0x00000001
+// fcntllock_un = 0x00000008
+// fcntllock_write = 0x00000080
+// fcntlo_accmode = 0x00000003
+// fcntlo_append = 0x00000400
+// fcntlo_cloexec = 0x00080000
+// fcntlo_creat = 0x00000040
+// fcntlo_direct = 0x00004000
+// fcntlo_directory = 0x00010000
+// fcntlo_dsync = 0x00001000
+// fcntlo_excl = 0x00000080
+// fcntlo_largefile = 0x00008000
+// fcntlo_ndelay = 0x00000800
+// fcntlo_noatime = 0x00040000
+// fcntlo_noctty = 0x00000100
+// fcntlo_nofollow = 0x00020000
+// fcntlo_nonblock = 0x00000800
+// fcntlo_path = 0x00200000
+// fcntlo_rdonly = 0x00000000
+// fcntlo_rdwr = 0x00000002
+// fcntlo_trunc = 0x00000200
+// fcntlo_wronly = 0x00000001
+// )
+
+/*
+Paraphrased from "man 2 waitid" on Linux
+
+ Upon successful return, waitid() fills in the
+ following fields of the siginfo_t structure
+ pointed to by infop:
+
+ si_pid, offset 0x10, int index 0x04:
+ The process ID of the child.
+
+ si_uid: offset 0x14, int index 0x05
+ The real user ID of the child.
+
+ si_signo: offset 0x00, int index 0x00
+ Always set to SIGCHLD.
+
+ si_status: ofset 0x18, int index 0x06
+ 1 the exit status of the child, as given to _exit(2)
+ (or exit(3)) (sc_sys.cld_exited)
+ 2 the signal that caused the child to terminate, stop,
+ or continue.
+ 3 The si_code field can be used to determine how to
+ interpret this field.
+
+ si_code, set to one of (enum Wi_si_code), offset 0x08, int index 0x02:
+ CLD_EXITED (child called _exit(2));
+ CLD_KILLED (child killed by signal);
+ CLD_DUMPED (child killed by signal, and dumped core);
+ CLD_STOPPED (child stopped by signal);
+ CLD_TRAPPED (traced child has trapped);
+ CLD_CONTINUED (child continued by SIGCONT).
+*/
+
+const (
+ wp_sys_wnohang = u64(0x00000001)
+ wp_sys_wuntraced = u64(0x00000002)
+ wp_sys_wstopped = u64(0x00000002)
+ wp_sys_wexited = u64(0x00000004)
+ wp_sys_wcontinued = u64(0x00000008)
+ wp_sys_wnowait = u64(0x01000000) // don't reap, just poll status.
+ wp_sys___wnothread = u64(0x20000000) // don't wait on children of other threads in this group
+ wp_sys___wall = u64(0x40000000) // wait on all children, regardless of type
+ wp_sys___wclone = u64(0x80000000) // wait only on non-sigchld children
+)
+
+// First argument to waitid:
+enum WiWhich {
+ p_all = 0
+ p_pid = 1
+ p_pgid = 2
+}
+
+enum WiSiCode {
+ cld_exited = 1 // child has exited
+ cld_killed = 2 // child was killed
+ cld_dumped = 3 // child terminated abnormally
+ cld_trapped = 4 // traced child has trapped
+ cld_stopped = 5 // child has stopped
+ cld_continued = 6 // stopped child has continued
+}
+
+fn split_int_errno(rc_in u64) (i64, Errno) {
+ rc := i64(rc_in)
+ if rc < 0 {
+ return i64(-1), Errno(-rc)
+ }
+ return rc, Errno.enoerror
+}
+
+// 0 sys_read
+fn sys_read(fd i64, buf &byte, count u64) (i64, Errno) {
+ return split_int_errno(sys_call3(0, u64(fd), u64(buf), count))
+}
+
+// 1 sys_write
+pub fn sys_write(fd i64, buf &byte, count u64) (i64, Errno) {
+ return split_int_errno(sys_call3(1, u64(fd), u64(buf), count))
+}
+
+// 2 sys_open
+fn sys_open(filename &byte, flags i64, mode int) (i64, Errno) {
+ return split_int_errno(sys_call3(2, u64(filename), u64(flags), u64(mode)))
+}
+
+// 3 sys_close
+fn sys_close(fd i64) Errno {
+ return Errno(-i64(sys_call1(3, u64(fd))))
+}
+
+// 9 sys_mmap
+fn sys_mmap(addr &byte, len u64, prot MemProt, flags MapFlags, fildes u64, off u64) (&byte, Errno) {
+ rc := sys_call6(9, u64(addr), len, u64(prot), u64(flags), fildes, off)
+ a, e := split_int_errno(rc)
+ return &byte(a), e
+}
+
+// 11 sys_munmap
+fn sys_munmap(addr voidptr, len u64) Errno {
+ return Errno(-sys_call2(11, u64(addr), len))
+}
+
+// 22 sys_pipe
+fn sys_pipe(filedes &int) Errno {
+ return Errno(sys_call1(22, u64(filedes)))
+}
+
+// 24 sys_sched_yield
+fn sys_sched_yield() Errno {
+ return Errno(sys_call0(24))
+}
+
+// 28 sys_madvise
+fn sys_madvise(addr voidptr, len u64, advice int) Errno {
+ return Errno(sys_call3(28, u64(addr), len, u64(advice)))
+}
+
+// 39 sys_getpid
+fn sys_getpid() int {
+ return int(sys_call0(39))
+}
+
+// 57 sys_fork
+fn sys_fork() int {
+ return int(sys_call0(57))
+}
+
+// 58 sys_vfork
+fn sys_vfork() int {
+ return int(sys_call0(58))
+}
+
+// 33 sys_dup2
+fn sys_dup2(oldfd int, newfd int) (i64, Errno) {
+ return split_int_errno(sys_call2(33, u64(oldfd), u64(newfd)))
+}
+
+// 59 sys_execve
+fn sys_execve(filename &byte, argv []&byte, envp []&byte) int {
+ return int(sys_call3(59, u64(filename), argv.data, envp.data))
+}
+
+// 60 sys_exit
+[noreturn]
+fn sys_exit(ec int) {
+ sys_call1(60, u64(ec))
+ for {}
+}
+
+// 102 sys_getuid
+fn sys_getuid() int {
+ return int(sys_call0(102))
+}
+
+// 247 sys_waitid
+fn sys_waitid(which WiWhich, pid int, infop &int, options int, ru voidptr) Errno {
+ return Errno(sys_call5(247, u64(which), u64(pid), u64(infop), u64(options), u64(ru)))
+}
+
+fn sys_call0(scn u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ }
+ return res
+}
+
+fn sys_call1(scn u64, arg1 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ }
+ return res
+}
+
+fn sys_call2(scn u64, arg1 u64, arg2 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ }
+ return res
+}
+
+fn sys_call3(scn u64, arg1 u64, arg2 u64, arg3 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ }
+ return res
+}
+
+fn sys_call4(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ ; r10
+ }
+ return res
+}
+
+fn sys_call5(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ mov r8, arg5
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ r (arg5)
+ ; r10
+ r8
+ }
+ return res
+}
+
+fn sys_call6(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 u64, arg6 u64) u64 {
+ mut res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ mov r8, arg5
+ mov r9, arg6
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ r (arg5)
+ r (arg6)
+ ; r10
+ r8
+ r9
+ }
+ return res
+}
+
+asm amd64 {
+ .globl _start
+ _start:
+ call main
+ mov rax, 60
+ xor rdi, rdi
+ syscall
+ ret
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/memory_managment.v b/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
new file mode 100644
index 0000000..9c23dcf
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
@@ -0,0 +1,29 @@
+module builtin
+
+fn mm_alloc(size u64) (&byte, Errno) {
+ // BEGIN CONSTS
+ // the constants need to be here, since the initialization of other constants,
+ // which happen before these ones would, require malloc
+ mem_prot := MemProt(int(MemProt.prot_read) | int(MemProt.prot_write))
+ map_flags := MapFlags(int(MapFlags.map_private) | int(MapFlags.map_anonymous))
+ // END CONSTS
+
+ a, e := sys_mmap(&byte(0), size + sizeof(u64), mem_prot, map_flags, -1, 0)
+ if e == .enoerror {
+ unsafe {
+ mut ap := &u64(a)
+ *ap = size
+ x2 := &byte(a + sizeof(u64))
+ return x2, e
+ }
+ }
+ return &byte(0), e
+}
+
+fn mm_free(addr &byte) Errno {
+ unsafe {
+ ap := &u64(addr - sizeof(u64))
+ size := *ap
+ return sys_munmap(addr - sizeof(u64), size + sizeof(u64))
+ }
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/.gitignore b/v_windows/v/vlib/builtin/linux_bare/old/.checks/.gitignore
new file mode 100644
index 0000000..4132964
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/.gitignore
@@ -0,0 +1,5 @@
+checks
+linuxsys/linuxsys
+string/string
+consts/consts
+structs/structs
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/checks.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/checks.v
new file mode 100644
index 0000000..8fd3575
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/checks.v
@@ -0,0 +1,32 @@
+module main
+
+import os
+
+fn failed (msg string) {
+ println ("!!! failed: $msg")
+}
+
+fn passed (msg string) {
+ println (">>> passed: $msg")
+}
+
+
+fn vcheck(vfile string) {
+ run_check := "v -user_mod_path . -freestanding run "
+ if 0 == os.system("$run_check $vfile/${vfile}.v") {
+ passed(run_check)
+ } else {
+ failed(run_check)
+ }
+ os.system("ls -lh $vfile/$vfile")
+ os.system("rm -f $vfile/$vfile")
+}
+
+fn main() {
+ vcheck("linuxsys")
+ vcheck("string")
+ vcheck("consts")
+ vcheck("structs")
+ exit(0)
+}
+
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/consts/consts.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/consts/consts.v
new file mode 100644
index 0000000..eee2c61
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/consts/consts.v
@@ -0,0 +1,22 @@
+module main
+import forkedtest
+
+const (
+ integer1 = 111
+ integer2 = 222
+ integer3 = integer1+integer2
+ integer9 = integer3 * 3
+ abc = "123"
+)
+
+fn check_const_initialization() {
+ assert abc == "123"
+ assert integer9 == 999
+}
+
+fn main(){
+ mut fails := 0
+ fails += forkedtest.normal_run(check_const_initialization, "check_const_initialization")
+ assert fails == 0
+ sys_exit(0)
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/forkedtest/forkedtest.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/forkedtest/forkedtest.v
new file mode 100644
index 0000000..6d9272c
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/forkedtest/forkedtest.v
@@ -0,0 +1,49 @@
+module forkedtest
+
+pub fn run (op fn(), label string, code Wi_si_code, status int) int {
+ child := sys_fork()
+ if child == 0 {
+ op()
+ sys_exit(0)
+ }
+
+ siginfo := []int{len:int(Sig_index.si_size)}
+
+ e := sys_waitid(.p_pid, child, intptr(&siginfo[0]), .wexited, 0)
+
+ assert e == .enoerror
+ assert siginfo[int(Sig_index.si_pid)] == child
+ assert siginfo[int(Sig_index.si_signo)] == int(Signo.sigchld)
+ assert siginfo[int(Sig_index.si_uid)] == sys_getuid()
+
+ r_code := siginfo[Sig_index.si_code]
+ r_status := siginfo[Sig_index.si_status]
+
+ print("+++ ")
+ print(label)
+ if (int(code) == r_code) && (status == r_status) {
+ println(" PASSED")
+ return 0
+ }
+ println(" FAILED")
+
+ if int(code) != r_code {
+ print(">> Expecting si_code 0x")
+ println(i64_str(int(code),16))
+ print(">> Got 0x")
+ println(i64_str(r_code,16))
+ }
+
+ if status != r_status {
+ print(">> Expecting status 0x")
+ println(i64_str(status,16))
+ print(">> Got 0x")
+ println(i64_str(r_status,16))
+ }
+
+ return 1
+}
+
+pub fn normal_run (op fn(), label string) int {
+ return run (op, label, .cld_exited, 0)
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/linuxsys/linuxsys.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/linuxsys/linuxsys.v
new file mode 100644
index 0000000..cca5cb6
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/linuxsys/linuxsys.v
@@ -0,0 +1,300 @@
+module main
+import forkedtest
+
+const (
+ sample_text_file1 = ""
+)
+
+fn check_fork_minimal () {
+ child := sys_fork()
+ ec := 100
+ if child == 0 {
+ println("child")
+ sys_exit(ec)
+ }
+ siginfo := [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0]
+
+ e := sys_waitid(.p_pid, child, intptr(siginfo.data) , .wexited, 0)
+
+ assert e == .enoerror
+ //println(i64_tos(buffer0,80,siginfo[Sig_index.si_code],16))
+ assert siginfo[Sig_index.si_code] == int(Wi_si_code.cld_exited)
+ assert siginfo[Sig_index.si_pid] == child
+ assert siginfo[Sig_index.si_status] == ec
+ assert siginfo[Sig_index.si_signo] == int(Signo.sigchld)
+ assert siginfo[Sig_index.si_uid] == sys_getuid()
+}
+
+fn check_read_write_pipe() {
+ // Checks the following system calls:
+ // sys_pipe
+ // sys_write
+ // sys_read
+ // sys_close
+ //
+ buffer0 := []byte{len:(128)}
+ buffer := byteptr(buffer0.data)
+
+ fd := [-1, -1]
+
+ assert fd[0] == -1
+ assert fd[1] == -1
+
+ a := sys_pipe(intptr(&fd[0]))
+
+ assert a == .enoerror
+
+ assert fd[0] != -1
+ assert fd[1] != -1
+
+ test_data := "test_data"
+ b := test_data.len + 1
+ c1, e1 := sys_write (fd[1], test_data.str, u64(b))
+
+ assert e1 == .enoerror
+ assert c1 == b
+
+ c2, e2 := sys_read(fd[0], buffer, u64(b))
+
+ assert e2 == .enoerror
+ assert c2 == b
+
+ assert buffer[b-1] == 0
+
+ for i in 0..b {
+ assert test_data[i] == buffer[i]
+ }
+
+ assert sys_close(fd[0]) == .enoerror
+ assert sys_close(fd[1]) == .enoerror
+
+ assert sys_close(-1) == .ebadf
+}
+
+fn check_read_file() {
+ /*
+ Checks the following system calls:
+ sys_read
+ sys_write
+ sys_close
+ sys_open
+ */
+ buffer0 := []byte{len:(128)}
+ buffer := byteptr(buffer0.data)
+
+ test_file := "sample_text1.txt"
+ sample_text := "Do not change this text.\n"
+ fd, ec := sys_open(test_file.str, .o_rdonly, 0)
+ assert fd > 0
+ assert ec == .enoerror
+ n := sample_text.len
+ c, e := sys_read(fd, buffer, u64(n*2))
+ assert e == .enoerror
+ assert c == n
+ for i in 0..n {
+ assert sample_text[i] == buffer[i]
+ }
+ assert sys_close(fd) == .enoerror
+}
+
+fn check_open_file_fail() {
+ fd1, ec1 := sys_open("./nofilehere".str, .o_rdonly, 0)
+ assert fd1 == -1
+ assert ec1 == .enoent
+}
+
+/*
+fn check_print() {
+ println ("checking print and println")
+
+ a := sys_pipe(intptr(fd))
+ assert a != -1
+ assert fd[0] != -1
+ assert fd[1] != -1
+
+ //sys_dup2
+ println ("print and println passed")
+}
+*/
+
+fn check_munmap_fail() {
+ ec := sys_munmap(-16384,8192)
+ assert ec == .einval
+}
+
+fn check_mmap_one_page() {
+ mp := int(Mm_prot.prot_read) | int(Mm_prot.prot_write)
+ mf := int(Map_flags.map_private) | int(Map_flags.map_anonymous)
+ mut a, e := sys_mmap(0, u64(Linux_mem.page_size), Mm_prot(mp), Map_flags(mf), -1, 0)
+
+ assert e == .enoerror
+ assert a != byteptr(-1)
+
+ for i in 0..int(Linux_mem.page_size) {
+ b := i & 0xFF
+ a[i] = b
+ assert a[i] == b
+ }
+
+ ec := sys_munmap(a, u64(Linux_mem.page_size))
+ assert ec == .enoerror
+}
+
+fn check_mm_pages() {
+ for i in 0 .. int(Linux_mem.page_size)-4 {
+ assert u32(1) == mm_pages(u64(i))
+ }
+ for i in int(Linux_mem.page_size)-3 .. (int(Linux_mem.page_size)*2)-4 {
+ assert u32(2) == mm_pages(u64(i))
+ }
+ for i in (int(Linux_mem.page_size)*2)-3 .. (int(Linux_mem.page_size)*3)-4 {
+ assert u32(3) == mm_pages(u64(i))
+ }
+}
+
+//pub fn mm_alloc(size u64) (voidptr, Errno)
+
+fn check_mm_alloc() {
+ for i in 1 .. 2000 {
+ size := u64(i*1000)
+ pages := mm_pages(size)
+ mut a, e := mm_alloc(size)
+
+ assert e == .enoerror
+ ap := intptr(a-4)
+ assert *ap == int(pages)
+ assert e == .enoerror
+ assert !isnil(a)
+
+ if (i%111) == 0 {
+ for j in 0 .. int(size) {
+ b := j & 0xFF
+ a[j] = b
+ assert b == int(a[j])
+ }
+ }
+
+ mfa := mm_free(a)
+
+ assert mfa == .enoerror
+ }
+}
+
+fn check_int_array_ro() {
+ a := [100,110,120,130]
+ assert a.len == 4
+ assert a[0] == 100
+ assert a[1] == 110
+ assert a[2] == 120
+ assert a[3] == 130
+}
+
+fn check_int_array_rw() {
+ mut a := [-10,-11,-12,-13]
+ assert a.len == 4
+ assert a[0] == -10
+ assert a[1] == -11
+ assert a[2] == -12
+ assert a[3] == -13
+ for i in 0..a.len {
+ b := -a[i] * 10
+ a[i] = b
+ assert a[i] == b
+ }
+ assert a[3] == 130
+}
+
+fn check_int64_array_ro() {
+ a := [i64(1000),1100,1200,1300,1400]
+ assert a.len == 5
+ assert a[0] == 1000
+ assert a[1] == 1100
+ assert a[2] == 1200
+ assert a[3] == 1300
+ assert a[4] == 1400
+}
+
+fn check_voidptr_array_ro() {
+ a := [
+ voidptr(10000),
+ voidptr(11000),
+ voidptr(12000),
+ voidptr(13000),
+ voidptr(14000),
+ voidptr(15000)
+ ]
+ assert a.len == 6
+ assert a[0] == voidptr(10000)
+ assert a[1] == voidptr(11000)
+ assert a[2] == voidptr(12000)
+ assert a[3] == voidptr(13000)
+ assert a[4] == voidptr(14000)
+ assert a[5] == voidptr(15000)
+}
+
+fn check_voidptr_array_rw() {
+ mut a := [
+ voidptr(-1),
+ voidptr(-1),
+ voidptr(-1),
+ voidptr(-1),
+ voidptr(-1),
+ voidptr(-1)
+ ]
+ assert a.len == 6
+
+ assert a[0] == voidptr(-1)
+ assert a[1] == voidptr(-1)
+ assert a[2] == voidptr(-1)
+ assert a[3] == voidptr(-1)
+ assert a[4] == voidptr(-1)
+ assert a[5] == voidptr(-1)
+
+ a[0] = voidptr(100000)
+ assert a[0] == voidptr(100000)
+
+ a[1] = voidptr(110000)
+ assert a[1] == voidptr(110000)
+
+ a[2] = voidptr(120000)
+ assert a[2] == voidptr(120000)
+
+ a[3] = voidptr(130000)
+ assert a[3] == voidptr(130000)
+
+ a[4] = voidptr(140000)
+ assert a[4] == voidptr(140000)
+
+ a[5] = voidptr(150000)
+ assert a[5] == voidptr(150000)
+}
+
+
+fn main() {
+ mut fails := 0
+ fails += forkedtest.normal_run(check_fork_minimal, "check_fork_minimal")
+ fails += forkedtest.normal_run(check_munmap_fail, "check_munmap_fail")
+ fails += forkedtest.normal_run(check_mmap_one_page, "check_mmap_one_page")
+ fails += forkedtest.normal_run(check_mm_pages, "check_mm_pages")
+ fails += forkedtest.normal_run(check_mm_alloc, "check_mm_alloc")
+ fails += forkedtest.normal_run(check_read_write_pipe, "check_read_write_pipe")
+ fails += forkedtest.normal_run(check_read_file, "check_read_file")
+ // check_print()
+ fails += forkedtest.normal_run(check_open_file_fail, "check_open_file_fail")
+ fails += forkedtest.normal_run(check_int_array_ro, "check_int_array_ro")
+ fails += forkedtest.normal_run(check_int_array_rw, "check_int_array_rw")
+ fails += forkedtest.normal_run(check_int64_array_ro, "check_int64_array_ro")
+ fails += forkedtest.normal_run(check_voidptr_array_ro, "check_voidptr_array_ro")
+ fails += forkedtest.normal_run(check_voidptr_array_rw, "check_voidptr_array_rw")
+
+ assert fails == 0
+ sys_exit(0)
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/readme.md b/v_windows/v/vlib/builtin/linux_bare/old/.checks/readme.md
new file mode 100644
index 0000000..03c1b30
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/readme.md
@@ -0,0 +1,5 @@
+In this directory:
+```
+v run checks.v
+```
+
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/sample_text1.txt b/v_windows/v/vlib/builtin/linux_bare/old/.checks/sample_text1.txt
new file mode 100644
index 0000000..f06e75a
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/sample_text1.txt
@@ -0,0 +1 @@
+Do not change this text.
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/string/string.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/string/string.v
new file mode 100644
index 0000000..54c06e7
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/string/string.v
@@ -0,0 +1,63 @@
+module main
+import forkedtest
+
+fn check_string_eq () {
+ assert "monkey" != "rat"
+ some_animal := "a bird"
+ assert some_animal == "a bird"
+}
+
+fn check_i64_tos() {
+ buffer0 := []byte{len:(128)}
+ buffer := byteptr(buffer0.data)
+
+ s0 := i64_tos(buffer, 70, 140, 10)
+ assert s0 == "140"
+
+ s1 := i64_tos(buffer, 70, -160, 10)
+ assert s1 == "-160"
+
+ s2 := i64_tos(buffer, 70, 65537, 16)
+ assert s2 == "10001"
+
+ s3 := i64_tos(buffer, 70, -160000, 10)
+ assert s3 == "-160000"
+}
+
+fn check_i64_str() {
+ assert "141" == i64_str(141, 10)
+ assert "-161" == i64_str(-161, 10)
+ assert "10002" == i64_str(65538, 16)
+ assert "-160001" == i64_str(-160001, 10)
+}
+
+fn check_str_clone() {
+ a := i64_str(1234,10)
+ b := a.clone()
+ assert a == b
+ c := i64_str(-6789,10).clone()
+ assert c == "-6789"
+}
+
+fn check_string_add_works(){
+ abc := 'abc'
+ combined := 'a' + 'b' + 'c'
+ assert abc.len == combined.len
+ assert abc[0] == combined[0]
+ assert abc[1] == combined[1]
+ assert abc[2] == combined[2]
+ assert abc[0] == `a`
+ assert abc == combined
+}
+
+fn main () {
+ mut fails := 0
+ fails += forkedtest.normal_run(check_string_eq, "check_string_eq")
+ fails += forkedtest.normal_run(check_i64_tos, "check_i64_tos")
+ fails += forkedtest.normal_run(check_i64_str, "check_i64_str")
+ fails += forkedtest.normal_run(check_str_clone, "check_str_clone")
+ fails += forkedtest.normal_run(check_string_add_works, "check_string_add_works")
+ assert fails == 0
+ sys_exit(0)
+}
+
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/.checks/structs/structs.v b/v_windows/v/vlib/builtin/linux_bare/old/.checks/structs/structs.v
new file mode 100644
index 0000000..f63285d
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/.checks/structs/structs.v
@@ -0,0 +1,42 @@
+module main
+import forkedtest
+
+struct SimpleEmptyStruct{
+}
+
+struct NonEmptyStruct{
+ x int
+ y int
+ z int
+}
+
+fn check_simple_empty_struct(){
+ s := SimpleEmptyStruct{}
+ addr_s := &s
+ str_addr_s := ptr_str( addr_s )
+ assert !isnil(addr_s)
+ assert str_addr_s.len > 3
+ println(str_addr_s)
+}
+
+fn check_non_empty_struct(){
+ a := NonEmptyStruct{1,2,3}
+ b := NonEmptyStruct{4,5,6}
+ assert sizeof(NonEmptyStruct) > 0
+ assert sizeof(SimpleEmptyStruct) < sizeof(NonEmptyStruct)
+ assert a.x == 1
+ assert a.y == 2
+ assert a.z == 3
+ assert b.x + b.y + b.z == 15
+ assert ptr_str(&a) != ptr_str(&b)
+ println('sizeof SimpleEmptyStruct:' + i64_str( sizeof(SimpleEmptyStruct) , 10 ))
+ println('sizeof NonEmptyStruct:' + i64_str( sizeof(NonEmptyStruct) , 10 ))
+}
+
+fn main(){
+ mut fails := 0
+ fails += forkedtest.normal_run(check_simple_empty_struct, "check_simple_empty_struct")
+ fails += forkedtest.normal_run(check_non_empty_struct, "check_non_empty_struct")
+ assert fails == 0
+ sys_exit(0)
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/array_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/array_bare.v
new file mode 100644
index 0000000..b92214f
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/array_bare.v
@@ -0,0 +1,53 @@
+module builtin
+
+pub struct array {
+pub:
+ data voidptr
+ len int
+ cap int
+ element_size int
+}
+
+// for now off the stack
+fn new_array_from_c_array(len int, cap int, elm_size int, c_array voidptr) array {
+ arr := array{
+ len: len
+ cap: cap
+ element_size: elm_size
+ data: c_array
+ }
+ return arr
+}
+
+// Private function. Used to implement array[] operator
+fn (a array) get(i int) voidptr {
+ if i < 0 || i >= a.len {
+ panic('array.get: index out of range') // FIXME: (i == $i, a.len == $a.len)')
+ }
+ return a.data + i * a.element_size
+}
+
+// Private function. Used to implement assigment to the array element.
+fn (mut a array) set(i int, val voidptr) {
+ if i < 0 || i >= a.len {
+ panic('array.set: index out of range') // FIXME: (i == $i, a.len == $a.len)')
+ }
+ mem_copy(a.data + a.element_size * i, val, a.element_size)
+}
+
+// array.repeat returns new array with the given array elements
+// repeated `nr_repeat` times
+pub fn (a array) repeat(nr_repeats int) array {
+ assert nr_repeats >= 0
+
+ arr := array{
+ len: nr_repeats * a.len
+ cap: nr_repeats * a.len
+ element_size: a.element_size
+ data: malloc(nr_repeats * a.len * a.element_size)
+ }
+ for i in 0 .. nr_repeats {
+ mem_copy(arr.data + i * a.len * a.element_size, a.data, a.len * a.element_size)
+ }
+ return arr
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/builtin_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/builtin_bare.v
new file mode 100644
index 0000000..a7be853
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/builtin_bare.v
@@ -0,0 +1,60 @@
+module builtin
+
+// called by the generated main/init
+fn init() {
+}
+
+pub fn isnil(p voidptr) bool {
+ return p == 0
+}
+
+pub fn print(s string) {
+ sys_write(1, s.str, u64(s.len))
+}
+
+pub fn println(s string) {
+ print(s)
+ print('\n')
+}
+
+pub fn panic(s string) {
+ eprint('V panic: ')
+ eprintln(s)
+ sys_exit(1)
+}
+
+// replaces panic when -debug arg is passed
+fn panic_debug(line_no int, file string, mod string, fn_name string, s string) {
+ eprintln('================ V panic ================')
+ eprint(' module: ')
+ eprintln('mod')
+ eprint(' function: ')
+ eprint(fn_name)
+ eprintln('()')
+ eprintln(' file: ')
+ eprintln(file)
+ // println(' line: ${line_no}')
+ eprint(' message: ')
+ eprintln(s)
+ eprintln('=========================================')
+ sys_exit(1)
+}
+
+pub fn eprint(s string) {
+ if isnil(s.str) {
+ panic('eprint(NIL)')
+ }
+ sys_write(2, s.str, u64(s.len))
+}
+
+pub fn eprint_ln(s string) {
+ eprint(s)
+ eprint('\n')
+}
+
+pub fn eprintln(s string) {
+ if isnil(s.str) {
+ panic('eprintln(NIL)')
+ }
+ eprint_ln(s)
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/linuxsys_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/linuxsys_bare.v
new file mode 100644
index 0000000..ddec203
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/linuxsys_bare.v
@@ -0,0 +1,759 @@
+module builtin
+
+pub enum Linux_mem {
+ page_size = 4096
+}
+
+pub const (
+ wp_sys_wnohang = u64(0x00000001)
+ wp_sys_wuntraced = u64(0x00000002)
+ wp_sys_wstopped = u64(0x00000002)
+ wp_sys_wexited = u64(0x00000004)
+ wp_sys_wcontinued = u64(0x00000008)
+ wp_sys_wnowait = u64(0x01000000) // don't reap, just poll status.
+ wp_sys___wnothread = u64(0x20000000) // don't wait on children of other threads in this group
+ wp_sys___wall = u64(0x40000000) // wait on all children, regardless of type
+ wp_sys___wclone = u64(0x80000000) // wait only on non-sigchld children
+)
+
+// First argument to waitid:
+pub enum Wi_which {
+ p_all = 0
+ p_pid = 1
+ p_pgid = 2
+}
+
+pub enum Wi_si_code {
+ cld_exited = 1 // child has exited
+ cld_killed = 2 // child was killed
+ cld_dumped = 3 // child terminated abnormally
+ cld_trapped = 4 // traced child has trapped
+ cld_stopped = 5 // child has stopped
+ cld_continued = 6 // stopped child has continued
+}
+
+/*
+Paraphrased from "man 2 waitid" on Linux
+
+ Upon successful return, waitid() fills in the
+ following fields of the siginfo_t structure
+ pointed to by infop:
+
+ si_pid, offset 0x10, int index 0x04:
+ The process ID of the child.
+
+ si_uid: offset 0x14, int index 0x05
+ The real user ID of the child.
+
+ si_signo: offset 0x00, int index 0x00
+ Always set to SIGCHLD.
+
+ si_status: ofset 0x18, int index 0x06
+ 1 the exit status of the child, as given to _exit(2)
+ (or exit(3)) (sc_sys.cld_exited)
+ 2 the signal that caused the child to terminate, stop,
+ or continue.
+ 3 The si_code field can be used to determine how to
+ interpret this field.
+
+ si_code, set to one of (enum Wi_si_code), offset 0x08, int index 0x02:
+ CLD_EXITED (child called _exit(2));
+ CLD_KILLED (child killed by signal);
+ CLD_DUMPED (child killed by signal, and dumped core);
+ CLD_STOPPED (child stopped by signal);
+ CLD_TRAPPED (traced child has trapped);
+ CLD_CONTINUED (child continued by SIGCONT).
+*/
+
+pub enum Sig_index {
+ si_signo = 0x00
+ si_code = 0x02
+ si_pid = 0x04
+ si_uid = 0x05
+ si_status = 0x06
+ si_size = 0x80
+}
+
+pub enum Signo {
+ sighup = 1 // Hangup.
+ sigint = 2 // Interactive attention signal.
+ sigquit = 3 // Quit.
+ sigill = 4 // Illegal instruction.
+ sigtrap = 5 // Trace/breakpoint trap.
+ sigabrt = 6 // Abnormal termination.
+ sigbus = 7
+ sigfpe = 8 // Erroneous arithmetic operation.
+ sigkill = 9 // Killed.
+ sigusr1 = 10
+ sigsegv = 11 // Invalid access to storage.
+ sigusr2 = 12
+ sigpipe = 13 // Broken pipe.
+ sigalrm = 14 // Alarm clock.
+ sigterm = 15 // Termination request.
+ sigstkflt = 16
+ sigchld = 17
+ sigcont = 18
+ sigstop = 19
+ sigtstp = 20
+ sigttin = 21 // Background read from control terminal.
+ sigttou = 22 // Background write to control terminal.
+ sigurg = 23
+ sigxcpu = 24 // CPU time limit exceeded.
+ sigxfsz = 25 // File size limit exceeded.
+ sigvtalrm = 26 // Virtual timer expired.
+ sigprof = 27 // Profiling timer expired.
+ sigwinch = 28
+ sigpoll = 29
+ sigsys = 31
+}
+
+pub const (
+ fcntlf_dupfd = 0x00000000
+ fcntlf_exlck = 0x00000004
+ fcntlf_getfd = 0x00000001
+ fcntlf_getfl = 0x00000003
+ fcntlf_getlk = 0x00000005
+ fcntlf_getlk64 = 0x0000000c
+ fcntlf_getown = 0x00000009
+ fcntlf_getowner_uids = 0x00000011
+ fcntlf_getown_ex = 0x00000010
+ fcntlf_getsig = 0x0000000b
+ fcntlf_ofd_getlk = 0x00000024
+ fcntlf_ofd_setlk = 0x00000025
+ fcntlf_ofd_setlkw = 0x00000026
+ fcntlf_owner_pgrp = 0x00000002
+ fcntlf_owner_pid = 0x00000001
+ fcntlf_owner_tid = 0x00000000
+ fcntlf_rdlck = 0x00000000
+ fcntlf_setfd = 0x00000002
+ fcntlf_setfl = 0x00000004
+ fcntlf_setlk = 0x00000006
+ fcntlf_setlk64 = 0x0000000d
+ fcntlf_setlkw = 0x00000007
+ fcntlf_setlkw64 = 0x0000000e
+ fcntlf_setown = 0x00000008
+ fcntlf_setown_ex = 0x0000000f
+ fcntlf_setsig = 0x0000000a
+ fcntlf_shlck = 0x00000008
+ fcntlf_unlck = 0x00000002
+ fcntlf_wrlck = 0x00000001
+ fcntllock_ex = 0x00000002
+ fcntllock_mand = 0x00000020
+ fcntllock_nb = 0x00000004
+ fcntllock_read = 0x00000040
+ fcntllock_rw = 0x000000c0
+ fcntllock_sh = 0x00000001
+ fcntllock_un = 0x00000008
+ fcntllock_write = 0x00000080
+ fcntlo_accmode = 0x00000003
+ fcntlo_append = 0x00000400
+ fcntlo_cloexec = 0x00080000
+ fcntlo_creat = 0x00000040
+ fcntlo_direct = 0x00004000
+ fcntlo_directory = 0x00010000
+ fcntlo_dsync = 0x00001000
+ fcntlo_excl = 0x00000080
+ fcntlo_largefile = 0x00008000
+ fcntlo_ndelay = 0x00000800
+ fcntlo_noatime = 0x00040000
+ fcntlo_noctty = 0x00000100
+ fcntlo_nofollow = 0x00020000
+ fcntlo_nonblock = 0x00000800
+ fcntlo_path = 0x00200000
+ fcntlo_rdonly = 0x00000000
+ fcntlo_rdwr = 0x00000002
+ fcntlo_trunc = 0x00000200
+ fcntlo_wronly = 0x00000001
+)
+
+pub enum Errno {
+ enoerror = 0x00000000
+ e2big = 0x00000007
+ eacces = 0x0000000d
+ eagain = 0x0000000b
+ ebadf = 0x00000009
+ ebusy = 0x00000010
+ echild = 0x0000000a
+ edom = 0x00000021
+ eexist = 0x00000011
+ efault = 0x0000000e
+ efbig = 0x0000001b
+ eintr = 0x00000004
+ einval = 0x00000016
+ eio = 0x00000005
+ eisdir = 0x00000015
+ emfile = 0x00000018
+ emlink = 0x0000001f
+ enfile = 0x00000017
+ enodev = 0x00000013
+ enoent = 0x00000002
+ enoexec = 0x00000008
+ enomem = 0x0000000c
+ enospc = 0x0000001c
+ enotblk = 0x0000000f
+ enotdir = 0x00000014
+ enotty = 0x00000019
+ enxio = 0x00000006
+ eperm = 0x00000001
+ epipe = 0x00000020
+ erange = 0x00000022
+ erofs = 0x0000001e
+ espipe = 0x0000001d
+ esrch = 0x00000003
+ etxtbsy = 0x0000001a
+ exdev = 0x00000012
+}
+
+pub enum Mm_prot {
+ prot_read = 0x1
+ prot_write = 0x2
+ prot_exec = 0x4
+ prot_none = 0x0
+ prot_growsdown = 0x01000000
+ prot_growsup = 0x02000000
+}
+
+pub enum Map_flags {
+ map_shared = 0x01
+ map_private = 0x02
+ map_shared_validate = 0x03
+ map_type = 0x0f
+ map_fixed = 0x10
+ map_file = 0x00
+ map_anonymous = 0x20
+ map_huge_shift = 26
+ map_huge_mask = 0x3f
+}
+
+fn sys_call0(scn u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ }
+ return res
+}
+
+fn sys_call1(scn u64, arg1 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ }
+ return res
+}
+
+fn sys_call2(scn u64, arg1 u64, arg2 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ }
+ return res
+}
+
+fn sys_call3(scn u64, arg1 u64, arg2 u64, arg3 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ }
+ return res
+}
+
+fn sys_call4(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ ; r10
+ }
+ return res
+}
+
+fn sys_call5(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ mov r8, arg5
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ r (arg5)
+ ; r10
+ r8
+ }
+ return res
+}
+
+fn sys_call6(scn u64, arg1 u64, arg2 u64, arg3 u64, arg4 u64, arg5 u64, arg6 u64) u64 {
+ res := u64(0)
+ asm amd64 {
+ mov r10, arg4
+ mov r8, arg5
+ mov r9, arg6
+ syscall
+ ; =a (res)
+ ; a (scn)
+ D (arg1)
+ S (arg2)
+ d (arg3)
+ r (arg4)
+ r (arg5)
+ r (arg6)
+ ; r10
+ r8
+ r9
+ }
+ return res
+}
+
+fn split_int_errno(rc_in u64) (i64, Errno) {
+ rc := i64(rc_in)
+ if rc < 0 {
+ return i64(-1), Errno(-rc)
+ }
+ return rc, Errno.enoerror
+}
+
+// 0 sys_read unsigned int fd char *buf size_t count
+pub fn sys_read(fd i64, buf &byte, count u64) (i64, Errno) {
+ return split_int_errno(sys_call3(0, u64(fd), u64(buf), count))
+}
+
+// 1 sys_write unsigned int fd, const char *buf, size_t count
+pub fn sys_write(fd i64, buf &byte, count u64) (i64, Errno) {
+ return split_int_errno(sys_call3(1, u64(fd), u64(buf), count))
+}
+
+pub fn sys_open(filename &byte, flags i64, mode int) (i64, Errno) {
+ // 2 sys_open const char *filename int flags int mode
+ return split_int_errno(sys_call3(2, u64(filename), u64(flags), u64(mode)))
+}
+
+pub fn sys_close(fd i64) Errno {
+ // 3 sys_close unsigned int fd
+ return Errno(-i64(sys_call1(3, u64(fd))))
+}
+
+// 9 sys_mmap unsigned long addr unsigned long len unsigned long prot unsigned long flags unsigned long fd unsigned long off
+pub fn sys_mmap(addr &byte, len u64, prot Mm_prot, flags Map_flags, fildes u64, off u64) (&byte, Errno) {
+ rc := sys_call6(9, u64(addr), len, u64(prot), u64(flags), fildes, off)
+ a, e := split_int_errno(rc)
+ return &byte(a), e
+}
+
+pub fn sys_munmap(addr voidptr, len u64) Errno {
+ // 11 sys_munmap unsigned long addr size_t len
+ return Errno(-sys_call2(11, u64(addr), len))
+}
+
+// 22 sys_pipe int *filedes
+pub fn sys_pipe(filedes &int) Errno {
+ return Errno(sys_call1(22, u64(filedes)))
+}
+
+// 24 sys_sched_yield
+pub fn sys_sched_yield() Errno {
+ return Errno(sys_call0(24))
+}
+
+pub fn sys_madvise(addr voidptr, len u64, advice int) Errno {
+ // 28 sys_madvise unsigned long start size_t len_in int behavior
+ return Errno(sys_call3(28, u64(addr), len, u64(advice)))
+}
+
+// 39 sys_getpid
+pub fn sys_getpid() int {
+ return int(sys_call0(39))
+}
+
+// 57 sys_fork
+pub fn sys_fork() int {
+ return int(sys_call0(57))
+}
+
+// 58 sys_vfork
+pub fn sys_vfork() int {
+ return int(sys_call0(58))
+}
+
+// 33 sys_dup2 unsigned int oldfd unsigned int newfd
+pub fn sys_dup2(oldfd int, newfd int) (i64, Errno) {
+ return split_int_errno(sys_call2(33, u64(oldfd), u64(newfd)))
+}
+
+// 59 sys_execve const char *filename const char *const argv[] const char *const envp[]
+// pub fn sys_execve(filename byteptr, argv []byteptr, envp []byteptr) int {
+// return sys_call3(59, filename, argv, envp)
+//}
+
+// 60 sys_exit int error_code
+pub fn sys_exit(ec int) {
+ sys_call1(60, u64(ec))
+}
+
+// 102 sys_getuid
+pub fn sys_getuid() int {
+ return int(sys_call0(102))
+}
+
+// 247 sys_waitid int which pid_t upid struct siginfo *infop int options struct rusage *ru
+pub fn sys_waitid(which Wi_which, pid int, infop &int, options int, ru voidptr) Errno {
+ return Errno(sys_call5(247, u64(which), u64(pid), u64(infop), u64(options), u64(ru)))
+}
+
+/*
+A few years old, but still relevant
+https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
+
+>0 sys_read unsigned int fd char *buf size_t count
+>1 sys_write unsigned int fd const char *buf size_t count
+>2 sys_open const char *filename int flags int mode
+>3 sys_close unsigned int fd
+4 sys_stat const char *filename struct stat *statbuf
+5 sys_fstat unsigned int fd struct stat *statbuf
+6 sys_lstat fconst char *filename struct stat *statbuf
+7 sys_poll struct poll_fd *ufds unsigned int nfds long timeout_msecs
+8 sys_lseek unsigned int fd off_t offset unsigned int origin
+>9 sys_mmap unsigned long addr unsigned long len unsigned long prot unsigned long flags unsigned long fd unsigned long off
+10 sys_mprotect unsigned long start size_t len unsigned long prot
+>11 sys_munmap unsigned long addr size_t len
+12 sys_brk unsigned long brk
+13 sys_rt_sigaction int sig const struct sigaction *act struct sigaction *oact size_t sigsetsize
+14 sys_rt_sigprocmask int how sigset_t *nset sigset_t *oset size_t sigsetsize
+15 sys_rt_sigreturn unsigned long __unused
+16 sys_ioctl unsigned int fd unsigned int cmd unsigned long arg
+17 sys_pread64 unsigned long fd char *buf size_t count loff_t pos
+18 sys_pwrite64 unsigned int fd const char *buf size_t count loff_t pos
+19 sys_readv unsigned long fd const struct iovec *vec unsigned long vlen
+20 sys_writev unsigned long fd const struct iovec *vec unsigned long vlen
+21 sys_access const char *filename int mode
+>22 sys_pipe int *filedes
+23 sys_select int n fd_set *inp fd_set *outp fd_set*exp struct timeval *tvp
+>24 sys_sched_yield
+25 sys_mremap unsigned long addr unsigned long old_len unsigned long new_len unsigned long flags unsigned long new_addr
+26 sys_msync unsigned long start size_t len int flags
+27 sys_mincore unsigned long start size_t len unsigned char *vec
+>28 sys_madvise unsigned long start size_t len_in int behavior
+29 sys_shmget key_t key size_t size int shmflg
+30 sys_shmat int shmid char *shmaddr int shmflg
+31 sys_shmctl int shmid int cmd struct shmid_ds *buf
+32 sys_dup unsigned int fildes
+33 sys_dup2 unsigned int oldfd unsigned int newfd
+34 sys_pause
+35 sys_nanosleep struct timespec *rqtp struct timespec *rmtp
+36 sys_getitimer int which struct itimerval *value
+37 sys_alarm unsigned int seconds
+38 sys_setitimer int which struct itimerval *value struct itimerval *ovalue
+>39 sys_getpid
+40 sys_sendfile int out_fd int in_fd off_t *offset size_t count
+41 sys_socket int family int type int protocol
+42 sys_connect int fd struct sockaddr *uservaddr int addrlen
+43 sys_accept int fd struct sockaddr *upeer_sockaddr int *upeer_addrlen
+44 sys_sendto int fd void *buff size_t len unsigned flags struct sockaddr *addr int addr_len
+45 sys_recvfrom int fd void *ubuf size_t size unsigned flags struct sockaddr *addr int *addr_len
+46 sys_sendmsg int fd struct msghdr *msg unsigned flags
+47 sys_recvmsg int fd struct msghdr *msg unsigned int flags
+48 sys_shutdown int fd int how
+49 sys_bind int fd struct sokaddr *umyaddr int addrlen
+50 sys_listen int fd int backlog
+51 sys_getsockname int fd struct sockaddr *usockaddr int *usockaddr_len
+52 sys_getpeername int fd struct sockaddr *usockaddr int *usockaddr_len
+53 sys_socketpair int family int type int protocol int *usockvec
+54 sys_setsockopt int fd int level int optname char *optval int optlen
+55 sys_getsockopt int fd int level int optname char *optval int *optlen
+56 sys_clone unsigned long clone_flags unsigned long newsp void *parent_tid void *child_tid
+>57 sys_fork
+>58 sys_vfork
+>59 sys_execve const char *filename const char *const argv[] const char *const envp[]
+>60 sys_exit int error_code
+61 sys_wait4 pid_t upid int *stat_addr int options struct rusage *ru
+62 sys_kill pid_t pid int sig
+63 sys_uname struct old_utsname *name
+64 sys_semget key_t key int nsems int semflg
+65 sys_semop int semid struct sembuf *tsops unsigned nsops
+66 sys_semctl int semid int semnum int cmd union semun arg
+67 sys_shmdt char *shmaddr
+68 sys_msgget key_t key int msgflg
+69 sys_msgsnd int msqid struct msgbuf *msgp size_t msgsz int msgflg
+70 sys_msgrcv int msqid struct msgbuf *msgp size_t msgsz long msgtyp int msgflg
+71 sys_msgctl int msqid int cmd struct msqid_ds *buf
+72 sys_fcntl unsigned int fd unsigned int cmd unsigned long arg
+73 sys_flock unsigned int fd unsigned int cmd
+74 sys_fsync unsigned int fd
+75 sys_fdatasync unsigned int fd
+76 sys_truncate const char *path long length
+77 sys_ftruncate unsigned int fd unsigned long length
+78 sys_getdents unsigned int fd struct linux_dirent *dirent unsigned int count
+79 sys_getcwd char *buf unsigned long size
+80 sys_chdir const char *filename
+81 sys_fchdir unsigned int fd
+82 sys_rename const char *oldname const char *newname
+83 sys_mkdir const char *pathname int mode
+84 sys_rmdir const char *pathname
+85 sys_creat const char *pathname int mode
+86 sys_link const char *oldname const char *newname
+87 sys_unlink const char *pathname
+88 sys_symlink const char *oldname const char *newname
+89 sys_readlink const char *path char *buf int bufsiz
+90 sys_chmod const char *filename mode_t mode
+91 sys_fchmod unsigned int fd mode_t mode
+92 sys_chown const char *filename uid_t user gid_t group
+93 sys_fchown unsigned int fd uid_t user gid_t group
+94 sys_lchown const char *filename uid_t user gid_t group
+95 sys_umask int mask
+96 sys_gettimeofday struct timeval *tv struct timezone *tz
+97 sys_getrlimit unsigned int resource struct rlimit *rlim
+98 sys_getrusage int who struct rusage *ru
+99 sys_sysinfo struct sysinfo *info
+100 sys_times struct sysinfo *info
+101 sys_ptrace long request long pid unsigned long addr unsigned long data
+>102 sys_getuid
+103 sys_syslog int type char *buf int len
+104 sys_getgid
+105 sys_setuid uid_t uid
+106 sys_setgid gid_t gid
+107 sys_geteuid
+108 sys_getegid
+109 sys_setpgid pid_t pid pid_t pgid
+110 sys_getppid
+111 sys_getpgrp
+112 sys_setsid
+113 sys_setreuid uid_t ruid uid_t euid
+114 sys_setregid gid_t rgid gid_t egid
+115 sys_getgroups int gidsetsize gid_t *grouplist
+116 sys_setgroups int gidsetsize gid_t *grouplist
+117 sys_setresuid uid_t *ruid uid_t *euid uid_t *suid
+118 sys_getresuid uid_t *ruid uid_t *euid uid_t *suid
+119 sys_setresgid gid_t rgid gid_t egid gid_t sgid
+120 sys_getresgid gid_t *rgid gid_t *egid gid_t *sgid
+121 sys_getpgid pid_t pid
+122 sys_setfsuid uid_t uid
+123 sys_setfsgid gid_t gid
+124 sys_getsid pid_t pid
+125 sys_capget cap_user_header_t header cap_user_data_t dataptr
+126 sys_capset cap_user_header_t header const cap_user_data_t data
+127 sys_rt_sigpending sigset_t *set size_t sigsetsize
+128 sys_rt_sigtimedwait const sigset_t *uthese siginfo_t *uinfo const struct timespec *uts size_t sigsetsize
+129 sys_rt_sigqueueinfo pid_t pid int sig siginfo_t *uinfo
+130 sys_rt_sigsuspend sigset_t *unewset size_t sigsetsize
+131 sys_sigaltstack const stack_t *uss stack_t *uoss
+132 sys_utime char *filename struct utimbuf *times
+133 sys_mknod const char *filename umode_t mode unsigned dev
+134 sys_uselib NOT IMPLEMENTED
+135 sys_personality unsigned int personality
+136 sys_ustat unsigned dev struct ustat *ubuf
+137 sys_statfs const char *pathname struct statfs *buf
+138 sys_fstatfs unsigned int fd struct statfs *buf
+139 sys_sysfs int option unsigned long arg1 unsigned long arg2
+140 sys_getpriority int which int who
+141 sys_setpriority int which int who int niceval
+142 sys_sched_setparam pid_t pid struct sched_param *param
+143 sys_sched_getparam pid_t pid struct sched_param *param
+144 sys_sched_setscheduler pid_t pid int policy struct sched_param *param
+145 sys_sched_getscheduler pid_t pid
+146 sys_sched_get_priority_max int policy
+147 sys_sched_get_priority_min int policy
+148 sys_sched_rr_get_interval pid_t pid struct timespec *interval
+149 sys_mlock unsigned long start size_t len
+150 sys_munlock unsigned long start size_t len
+151 sys_mlockall int flags
+152 sys_munlockall
+153 sys_vhangup
+154 sys_modify_ldt int func void *ptr unsigned long bytecount
+155 sys_pivot_root const char *new_root const char *put_old
+156 sys__sysctl struct __sysctl_args *args
+157 sys_prctl int option unsigned long arg2 unsigned long arg3 unsigned long arg4 unsigned long arg5
+158 sys_arch_prctl struct task_struct *task int code unsigned long *addr
+159 sys_adjtimex struct timex *txc_p
+160 sys_setrlimit unsigned int resource struct rlimit *rlim
+161 sys_chroot const char *filename
+162 sys_sync
+163 sys_acct const char *name
+164 sys_settimeofday struct timeval *tv struct timezone *tz
+165 sys_mount char *dev_name char *dir_name char *type unsigned long flags void *data
+166 sys_umount2 const char *target int flags
+167 sys_swapon const char *specialfile int swap_flags
+168 sys_swapoff const char *specialfile
+169 sys_reboot int magic1 int magic2 unsigned int cmd void *arg
+170 sys_sethostname char *name int len
+171 sys_setdomainname char *name int len
+172 sys_iopl unsigned int level struct pt_regs *regs
+173 sys_ioperm unsigned long from unsigned long num int turn_on
+174 sys_create_module REMOVED IN Linux 2.6
+175 sys_init_module void *umod unsigned long len const char *uargs
+176 sys_delete_module const chat *name_user unsigned int flags
+177 sys_get_kernel_syms REMOVED IN Linux 2.6
+178 sys_query_module REMOVED IN Linux 2.6
+179 sys_quotactl unsigned int cmd const char *special qid_t id void *addr
+180 sys_nfsservctl NOT IMPLEMENTED
+181 sys_getpmsg NOT IMPLEMENTED
+182 sys_putpmsg NOT IMPLEMENTED
+183 sys_afs_syscall NOT IMPLEMENTED
+184 sys_tuxcall NOT IMPLEMENTED
+185 sys_security NOT IMPLEMENTED
+186 sys_gettid
+187 sys_readahead int fd loff_t offset size_t count
+188 sys_setxattr const char *pathname const char *name const void *value size_t size int flags
+189 sys_lsetxattr const char *pathname const char *name const void *value size_t size int flags
+190 sys_fsetxattr int fd const char *name const void *value size_t size int flags
+191 sys_getxattr const char *pathname const char *name void *value size_t size
+192 sys_lgetxattr const char *pathname const char *name void *value size_t size
+193 sys_fgetxattr int fd const har *name void *value size_t size
+194 sys_listxattr const char *pathname char *list size_t size
+195 sys_llistxattr const char *pathname char *list size_t size
+196 sys_flistxattr int fd char *list size_t size
+197 sys_removexattr const char *pathname const char *name
+198 sys_lremovexattr const char *pathname const char *name
+199 sys_fremovexattr int fd const char *name
+200 sys_tkill pid_t pid ing sig
+201 sys_time time_t *tloc
+202 sys_futex u32 *uaddr int op u32 val struct timespec *utime u32 *uaddr2 u32 val3
+203 sys_sched_setaffinity pid_t pid unsigned int len unsigned long *user_mask_ptr
+204 sys_sched_getaffinity pid_t pid unsigned int len unsigned long *user_mask_ptr
+205 sys_set_thread_area NOT IMPLEMENTED. Use arch_prctl
+206 sys_io_setup unsigned nr_events aio_context_t *ctxp
+207 sys_io_destroy aio_context_t ctx
+208 sys_io_getevents aio_context_t ctx_id long min_nr long nr struct io_event *events
+209 sys_io_submit aio_context_t ctx_id long nr struct iocb **iocbpp
+210 sys_io_cancel aio_context_t ctx_id struct iocb *iocb struct io_event *result
+211 sys_get_thread_area NOT IMPLEMENTED. Use arch_prctl
+212 sys_lookup_dcookie u64 cookie64 long buf long len
+213 sys_epoll_create int size
+214 sys_epoll_ctl_old NOT IMPLEMENTED
+215 sys_epoll_wait_old NOT IMPLEMENTED
+216 sys_remap_file_pages unsigned long start unsigned long size unsigned long prot unsigned long pgoff unsigned long flags
+217 sys_getdents64 unsigned int fd struct linux_dirent64 *dirent unsigned int count
+218 sys_set_tid_address int *tidptr
+219 sys_restart_syscall
+220 sys_semtimedop int semid struct sembuf *tsops unsigned nsops const struct timespec *timeout
+221 sys_fadvise64 int fd loff_t offset size_t len int advice
+222 sys_timer_create const clockid_t which_clock struct sigevent *timer_event_spec timer_t *created_timer_id
+223 sys_timer_settime timer_t timer_id int flags const struct itimerspec *new_setting struct itimerspec *old_setting
+224 sys_timer_gettime timer_t timer_id struct itimerspec *setting
+225 sys_timer_getoverrun timer_t timer_id
+226 sys_timer_delete timer_t timer_id
+227 sys_clock_settime const clockid_t which_clock const struct timespec *tp
+228 sys_clock_gettime const clockid_t which_clock struct timespec *tp
+229 sys_clock_getres const clockid_t which_clock struct timespec *tp
+230 sys_clock_nanosleep const clockid_t which_clock int flags const struct timespec *rqtp struct timespec *rmtp
+231 sys_exit_group int error_code
+232 sys_epoll_wait int epfd struct epoll_event *events int maxevents int timeout
+233 sys_epoll_ctl int epfd int op int fd struct epoll_event *event
+234 sys_tgkill pid_t tgid pid_t pid int sig
+235 sys_utimes char *filename struct timeval *utimes
+236 sys_vserver NOT IMPLEMENTED
+237 sys_mbind unsigned long start unsigned long len unsigned long mode unsigned long *nmask unsigned long maxnode unsigned flags
+238 sys_set_mempolicy int mode unsigned long *nmask unsigned long maxnode
+239 sys_get_mempolicy int *policy unsigned long *nmask unsigned long maxnode unsigned long addr unsigned long flags
+240 sys_mq_open const char *u_name int oflag mode_t mode struct mq_attr *u_attr
+241 sys_mq_unlink const char *u_name
+242 sys_mq_timedsend mqd_t mqdes const char *u_msg_ptr size_t msg_len unsigned int msg_prio const stuct timespec *u_abs_timeout
+243 sys_mq_timedreceive mqd_t mqdes char *u_msg_ptr size_t msg_len unsigned int *u_msg_prio const struct timespec *u_abs_timeout
+244 sys_mq_notify mqd_t mqdes const struct sigevent *u_notification
+245 sys_mq_getsetattr mqd_t mqdes const struct mq_attr *u_mqstat struct mq_attr *u_omqstat
+246 sys_kexec_load unsigned long entry unsigned long nr_segments struct kexec_segment *segments unsigned long flags
+>247 sys_waitid int which pid_t upid struct siginfo *infop int options struct rusage *ru
+248 sys_add_key const char *_type const char *_description const void *_payload size_t plen
+249 sys_request_key const char *_type const char *_description const char *_callout_info key_serial_t destringid
+250 sys_keyctl int option unsigned long arg2 unsigned long arg3 unsigned long arg4 unsigned long arg5
+251 sys_ioprio_set int which int who int ioprio
+252 sys_ioprio_get int which int who
+253 sys_inotify_init
+254 sys_inotify_add_watch int fd const char *pathname u32 mask
+255 sys_inotify_rm_watch int fd __s32 wd
+256 sys_migrate_pages pid_t pid unsigned long maxnode const unsigned long *old_nodes const unsigned long *new_nodes
+257 sys_openat int dfd const char *filename int flags int mode
+258 sys_mkdirat int dfd const char *pathname int mode
+259 sys_mknodat int dfd const char *filename int mode unsigned dev
+260 sys_fchownat int dfd const char *filename uid_t user gid_t group int flag
+261 sys_futimesat int dfd const char *filename struct timeval *utimes
+262 sys_newfstatat int dfd const char *filename struct stat *statbuf int flag
+263 sys_unlinkat int dfd const char *pathname int flag
+264 sys_renameat int oldfd const char *oldname int newfd const char *newname
+265 sys_linkat int oldfd const char *oldname int newfd const char *newname int flags
+266 sys_symlinkat const char *oldname int newfd const char *newname
+267 sys_readlinkat int dfd const char *pathname char *buf int bufsiz
+268 sys_fchmodat int dfd const char *filename mode_t mode
+269 sys_faccessat int dfd const char *filename int mode
+270 sys_pselect6 int n fd_set *inp fd_set *outp fd_set *exp struct timespec *tsp void *sig
+271 sys_ppoll struct pollfd *ufds unsigned int nfds struct timespec *tsp const sigset_t *sigmask size_t sigsetsize
+272 sys_unshare unsigned long unshare_flags
+273 sys_set_robust_list struct robust_list_head *head size_t len
+274 sys_get_robust_list int pid struct robust_list_head **head_ptr size_t *len_ptr
+275 sys_splice int fd_in loff_t *off_in int fd_out loff_t *off_out size_t len unsigned int flags
+276 sys_tee int fdin int fdout size_t len unsigned int flags
+277 sys_sync_file_range long fd loff_t offset loff_t bytes long flags
+278 sys_vmsplice int fd const struct iovec *iov unsigned long nr_segs unsigned int flags
+279 sys_move_pages pid_t pid unsigned long nr_pages const void **pages const int *nodes int *status int flags
+280 sys_utimensat int dfd const char *filename struct timespec *utimes int flags
+281 sys_epoll_pwait int epfd struct epoll_event *events int maxevents int timeout const sigset_t *sigmask size_t sigsetsize
+282 sys_signalfd int ufd sigset_t *user_mask size_t sizemask
+283 sys_timerfd_create int clockid int flags
+284 sys_eventfd unsigned int count
+285 sys_fallocate long fd long mode loff_t offset loff_t len
+286 sys_timerfd_settime int ufd int flags const struct itimerspec *utmr struct itimerspec *otmr
+287 sys_timerfd_gettime int ufd struct itimerspec *otmr
+288 sys_accept4 int fd struct sockaddr *upeer_sockaddr int *upeer_addrlen int flags
+289 sys_signalfd4 int ufd sigset_t *user_mask size_t sizemask int flags
+290 sys_eventfd2 unsigned int count int flags
+291 sys_epoll_create1 int flags
+292 sys_dup3 unsigned int oldfd unsigned int newfd int flags
+293 sys_pipe2 int *filedes int flags
+294 sys_inotify_init1 int flags
+295 sys_preadv unsigned long fd const struct iovec *vec unsigned long vlen unsigned long pos_l unsigned long pos_h
+296 sys_pwritev unsigned long fd const struct iovec *vec unsigned long vlen unsigned long pos_l unsigned long pos_h
+297 sys_rt_tgsigqueueinfo pid_t tgid pid_t pid int sig siginfo_t *uinfo
+298 sys_perf_event_open struct perf_event_attr *attr_uptr pid_t pid int cpu int group_fd unsigned long flags
+299 sys_recvmmsg int fd struct msghdr *mmsg unsigned int vlen unsigned int flags struct timespec *timeout
+300 sys_fanotify_init unsigned int flags unsigned int event_f_flags
+301 sys_fanotify_mark long fanotify_fd long flags __u64 mask long dfd long pathname
+302 sys_prlimit64 pid_t pid unsigned int resource const struct rlimit64 *new_rlim struct rlimit64 *old_rlim
+303 sys_name_to_handle_at int dfd const char *name struct file_handle *handle int *mnt_id int flag
+304 sys_open_by_handle_at int dfd const char *name struct file_handle *handle int *mnt_id int flags
+305 sys_clock_adjtime clockid_t which_clock struct timex *tx
+306 sys_syncfs int fd
+307 sys_sendmmsg int fd struct mmsghdr *mmsg unsigned int vlen unsigned int flags
+308 sys_setns int fd int nstype
+309 sys_getcpu unsigned *cpup unsigned *nodep struct getcpu_cache *unused
+310 sys_process_vm_readv pid_t pid const struct iovec *lvec unsigned long liovcnt const struct iovec *rvec unsigned long riovcnt unsigned long flags
+311 sys_process_vm_writev pid_t pid const struct iovec *lvec unsigned long liovcnt const struct iovcc *rvec unsigned long riovcnt unsigned long flags
+312 sys_kcmp pid_t pid1 pid_t pid2 int type unsigned long idx1 unsigned long idx2
+313 sys_finit_module int fd const char __user *uargs int flags
+314 sys_sched_setattr pid_t pid struct sched_attr __user *attr unsigned int flags
+315 sys_sched_getattr pid_t pid struct sched_attr __user *attr unsigned int size unsigned int flags
+316 sys_renameat2 int olddfd const char __user *oldname int newdfd const char __user *newname unsigned int flags
+317 sys_seccomp unsigned int op unsigned int flags const char __user *uargs
+318 sys_getrandom char __user *buf size_t count unsigned int flags
+319 sys_memfd_create const char __user *uname_ptr unsigned int flags
+320 sys_kexec_file_load int kernel_fd int initrd_fd unsigned long cmdline_len const char __user *cmdline_ptr unsigned long flags
+321 sys_bpf int cmd union bpf_attr *attr unsigned int size
+322 stub_execveat int dfd const char __user *filename const char __user *const __user *argv const char __user *const __user *envp int flags
+323 userfaultfd int flags
+324 membarrier int cmd int flags
+325 mlock2 unsigned long start size_t len int flags
+326 copy_file_range int fd_in loff_t __user *off_in int fd_out loff_t __user * off_out size_t len unsigned int flags
+327 preadv2 unsigned long fd const struct iovec __user *vec unsigned long vlen unsigned long pos_l unsigned long pos_h int flags
+328 pwritev2 unsigned long fd const struct iovec __user *vec unsigned long vlen unsigned long pos_l unsigned long pos_h int flags
+*/
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v
new file mode 100644
index 0000000..cee5f99
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/mm_bare.v
@@ -0,0 +1,58 @@
+module builtin
+
+const (
+ mem_prot = Mm_prot(int(Mm_prot.prot_read) | int(Mm_prot.prot_write))
+ mem_flags = Map_flags(int(Map_flags.map_private) | int(Map_flags.map_anonymous))
+ page_size = u64(Linux_mem.page_size)
+)
+
+pub fn mm_pages(size u64) u32 {
+ pages := (size + u64(4) + page_size) / page_size
+ return u32(pages)
+}
+
+pub fn mm_alloc(size u64) (&byte, Errno) {
+ pages := mm_pages(size)
+ n_bytes := u64(pages * u32(Linux_mem.page_size))
+
+ a, e := sys_mmap(0, n_bytes, mem_prot, mem_flags, -1, 0)
+ if e == .enoerror {
+ mut ap := &int(a)
+ *ap = pages
+ return &byte(a + 4), e
+ }
+ return &byte(0), e
+}
+
+pub fn mm_free(addr &byte) Errno {
+ ap := &int(addr - 4)
+ size := u64(*ap) * u64(Linux_mem.page_size)
+
+ return sys_munmap(ap, size)
+}
+
+pub fn mem_copy(dest0 voidptr, src0 voidptr, n int) voidptr {
+ mut dest := &byte(dest0)
+ src := &byte(src0)
+ for i in 0 .. n {
+ dest[i] = src[i]
+ }
+ return dest0
+}
+
+[unsafe]
+pub fn malloc(n int) &byte {
+ if n < 0 {
+ panic('malloc(<0)')
+ }
+
+ ptr, e := mm_alloc(u64(n))
+ assert e == .enoerror
+ assert !isnil(ptr)
+ return ptr
+}
+
+[unsafe]
+pub fn free(ptr voidptr) {
+ assert mm_free(ptr) == .enoerror
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/string_bare.v b/v_windows/v/vlib/builtin/linux_bare/old/string_bare.v
new file mode 100644
index 0000000..8f7edfc
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/string_bare.v
@@ -0,0 +1,150 @@
+module builtin
+
+pub struct string {
+pub:
+ str &byte
+ len int
+}
+
+pub fn strlen(s &byte) int {
+ mut i := 0
+ for ; s[i] != 0; i++ {}
+ return i
+}
+
+pub fn tos(s &byte, len int) string {
+ if s == 0 {
+ panic('tos(): nil string')
+ }
+ return string{
+ str: s
+ len: len
+ }
+}
+
+fn (s string) add(a string) string {
+ new_len := a.len + s.len
+ mut res := string{
+ len: new_len
+ str: malloc(new_len + 1)
+ }
+ for j in 0 .. s.len {
+ res[j] = s[j]
+ }
+ for j in 0 .. a.len {
+ res[s.len + j] = a[j]
+ }
+ res[new_len] = 0 // V strings are not null terminated, but just in case
+ return res
+}
+
+/*
+pub fn tos_clone(s byteptr) string {
+ if s == 0 {
+ panic('tos: nil string')
+ }
+ return tos2(s).clone()
+}
+*/
+
+// Same as `tos`, but calculates the length. Called by `string(bytes)` casts.
+// Used only internally.
+pub fn tos2(s &byte) string {
+ if s == 0 {
+ panic('tos2: nil string')
+ }
+ return string{
+ str: s
+ len: strlen(s)
+ }
+}
+
+pub fn tos3(s &char) string {
+ if s == 0 {
+ panic('tos3: nil string')
+ }
+ return string{
+ str: &byte(s)
+ len: strlen(&byte(s))
+ }
+}
+
+pub fn string_eq(s1 string, s2 string) bool {
+ if s1.len != s2.len {
+ return false
+ }
+ for i in 0 .. s1.len {
+ if s1[i] != s2[i] {
+ return false
+ }
+ }
+ return true
+}
+
+pub fn string_ne(s1 string, s2 string) bool {
+ return !string_eq(s1, s2)
+}
+
+pub fn i64_tos(buf &byte, len int, n0 i64, base int) string {
+ if base < 2 {
+ panic('base must be >= 2')
+ }
+ if base > 36 {
+ panic('base must be <= 36')
+ }
+
+ mut b := tos(buf, len)
+ mut i := len - 1
+
+ mut n := n0
+ neg := n < 0
+ if neg {
+ n = -n
+ }
+
+ b[i--] = 0
+
+ for {
+ c := (n % base) + 48
+ b[i--] = if c > 57 { c + 7 } else { c }
+ if i < 0 {
+ panic('buffer to small')
+ }
+ n /= base
+ if n < 1 {
+ break
+ }
+ }
+ if neg {
+ if i < 0 {
+ panic('buffer to small')
+ }
+ b[i--] = 45
+ }
+ offset := i + 1
+ b.str = b.str + offset
+ b.len -= (offset + 1)
+ return b
+}
+
+pub fn i64_str(n0 i64, base int) string {
+ buf := malloc(80)
+ return i64_tos(buf, 79, n0, base)
+}
+
+pub fn ptr_str(ptr voidptr) string {
+ buf := [16]byte{}
+ hex := i64_tos(buf, 15, i64(ptr), 16)
+ res := '0x' + hex
+ return res
+}
+
+pub fn (a string) clone() string {
+ mut b := string{
+ len: a.len
+ str: malloc(a.len + 1)
+ }
+ mem_copy(b.str, a.str, a.len)
+ b[a.len] = 0
+ return b
+}
diff --git a/v_windows/v/vlib/builtin/linux_bare/old/syscallwrapper_test.v b/v_windows/v/vlib/builtin/linux_bare/old/syscallwrapper_test.v
new file mode 100644
index 0000000..1bd79c9
--- /dev/null
+++ b/v_windows/v/vlib/builtin/linux_bare/old/syscallwrapper_test.v
@@ -0,0 +1,27 @@
+import os
+
+fn test_syscallwrappers() {
+ if true {
+ return
+ }
+ $if linux {
+ $if x64 {
+ exe := os.executable()
+ vdir := os.dir(exe)
+ if vdir.len > 1 {
+ dot_checks := vdir + '/.checks'
+ assert os.is_dir(dot_checks)
+
+ os.chdir(dot_checks) or {}
+ checks_v := 'checks.v'
+ assert os.exists(checks_v)
+ rc := os.execute_or_exit('v run $checks_v')
+ assert rc.exit_code == 0
+ assert !rc.output.contains('V panic: An assertion failed.')
+ assert !rc.output.contains('failed')
+ } else {
+ panic("Can't find test directory")
+ }
+ }
+ }
+}