summaryrefslogtreecommitdiff
path: root/sys.s
diff options
context:
space:
mode:
Diffstat (limited to 'sys.s')
-rw-r--r--sys.s69
1 files changed, 69 insertions, 0 deletions
diff --git a/sys.s b/sys.s
new file mode 100644
index 0000000..2a76e09
--- /dev/null
+++ b/sys.s
@@ -0,0 +1,69 @@
+.ifndef __SYS__
+.set __SYS__, 1
+
+.include "syscall.s"
+
+# sys call args:
+# %rdi
+# %rsi
+# %rdx
+# %rcx
+# %r8
+# %r9
+
+.macro __putargs6 arg:req, args:vararg
+ movq \arg, %r9
+.endm
+
+.macro __putargs5 arg:req, args:vararg
+ movq \arg, %r8
+.ifnb \args
+ __putargs6 \args
+.endif
+.endm
+
+.macro __putargs4 arg:req, args:vararg
+ movq \arg, %rcx
+.ifnb \args
+ __putargs5 \args
+.endif
+.endm
+
+.macro __putargs3 arg:req, args:vararg
+ movq \arg, %rdx
+.ifnb \args
+ __putargs4 \args
+.endif
+.endm
+
+.macro __putargs2 arg:req, args:vararg
+ movq \arg, %rsi
+.ifnb \args
+ __putargs3 \args
+.endif
+.endm
+
+.macro __putargs1 arg:req, args:vararg
+ movq \arg, %rdi
+.ifnb \args
+ __putargs2 \args
+.endif
+.endm
+
+.macro sysargs args:vararg
+.ifnb \args
+ __putargs1 \args
+.endif
+.endm
+
+.macro sys func:req, args:vararg
+ sysargs \args
+ movq $__NR_\func, %rax
+ syscall
+.endm
+
+.set STDIN, 0
+.set STDOUT, 1
+.set STDERR, 2
+
+.endif