summary refs log tree commit diff
path: root/linux.e
diff options
context:
space:
mode:
Diffstat (limited to 'linux.e')
-rw-r--r--linux.e48
1 files changed, 33 insertions, 15 deletions
diff --git a/linux.e b/linux.e
index bf5a3e1..fb386f9 100644
--- a/linux.e
+++ b/linux.e
@@ -11,6 +11,22 @@
 ~ that, since rsp is preserved, or we can use one of the other registers. We
 ~ don't ourselves save other registers because our caller should do that, if
 ~ it cares.
+~
+~   In the kernel source, you may find the following files useful to
+~ reference:
+~
+~   * arch/x86/entry/syscalls/syscall_64.tbl
+~   * include/linux/syscalls.h
+~   * include/linux/compat.h
+~
+~   Don't be confused by tools/scripts/syscall.tbl, it's not for x86.
+~
+~   This file loads early, before dynamic.e. So, although it superficially
+~ appears to be able to do allocation and high-level flow control, those come
+~ from the transforms, which means they're shallow implementations. The stuff
+~ here can't be moved later, because input.e relies on it, and the dynamic
+~ stuff relies on that. So, there's additional Linux functionality in another
+~ file that loads later, linux-dynamic.e.
 
 
 ~ (call number -- return value)
@@ -21,91 +37,93 @@
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
-~ (call number, first param -- return value)
+~ (first param, call number -- return value)
 : syscall-1
   [ here @
-    :rdi pop-reg64               ~ first param
     :rax pop-reg64               ~ syscall number
+    :rdi pop-reg64               ~ first param
     syscall
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
-~ (call number, first param, second param -- return value)
+~ (first param, second param, call number -- return value)
 : syscall-2
   [ here @
     :rsi :rbx mov-reg64-reg64    ~ save rsi
+    :rax pop-reg64               ~ syscall number
     :rsi pop-reg64               ~ second param
     :rdi pop-reg64               ~ first param
-    :rax pop-reg64               ~ syscall number
     syscall
     :rbx :rsi mov-reg64-reg64    ~ restore rsi
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
-~ (call number, first param, second param, third param -- return value)
+~ (first param, second param, third param, call number -- return value)
 : syscall-3
   [ here @
     :rsi :rbx mov-reg64-reg64    ~ save rsi
+    :rax pop-reg64               ~ syscall number
     :rdx pop-reg64               ~ third param
     :rsi pop-reg64               ~ second param
     :rdi pop-reg64               ~ first param
-    :rax pop-reg64               ~ syscall number
     syscall
     :rbx :rsi mov-reg64-reg64    ~ restore rsi
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
-~ (call number, first param, second param, third param, fourth param
+~ (first param, second param, third param, fourth param, call number
 ~  -- return value)
 : syscall-4
   [ here @
     :rsi :rbx mov-reg64-reg64    ~ save rsi
+    :rax pop-reg64               ~ syscall number
     :r10 pop-extrareg64          ~ fourth param
     :rdx pop-reg64               ~ third param
     :rsi pop-reg64               ~ second param
     :rdi pop-reg64               ~ first param
-    :rax pop-reg64               ~ syscall number
     syscall
     :rbx :rsi mov-reg64-reg64    ~ restore rsi
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
 
-~ (call number, first param, second param, third param, fourth param,
-~  fifth param -- return value)
+~ (first param, second param, third param, fourth param, fifth param,
+~  call number -- return value)
 : syscall-5
   [ here @
     :rsi :rbx mov-reg64-reg64    ~ save rsi
+    :rax pop-reg64               ~ syscall number
     :r8 pop-extrareg64           ~ fifth param
     :r10 pop-extrareg64          ~ fourth param
     :rdx pop-reg64               ~ third param
     :rsi pop-reg64               ~ second param
     :rdi pop-reg64               ~ first param
-    :rax pop-reg64               ~ syscall number
     syscall
     :rbx :rsi mov-reg64-reg64    ~ restore rsi
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
 
-~ (call number, first param, second param, third param, fourth param,
-~  fifth param, sixth param -- return value)
+~ (first param, second param, third param, fourth param, fifth param,
+~  sixth param, call number -- return value)
 : syscall-6
   [ here @
     :rsi :rbx mov-reg64-reg64    ~ save rsi
+    :rax pop-reg64               ~ syscall number
     :r9 pop-extrareg64           ~ sixth param
     :r8 pop-extrareg64           ~ fifth param
     :r10 pop-extrareg64          ~ fourth param
     :rdx pop-reg64               ~ third param
     :rsi pop-reg64               ~ second param
     :rdi pop-reg64               ~ first param
-    :rax pop-reg64               ~ syscall number
     syscall
     :rbx :rsi mov-reg64-reg64    ~ restore rsi
     :rax push-reg64              ~ return value
     here ! ] ;asm
 
 
+~ Raw system calls
+~ ~~~~~~~~~~~~~~~~
 
 ~   This does the Linux exit() system call, passing it an exit code taken
 ~ from the stack. It does not return.
@@ -148,7 +166,7 @@
     here ! ] ;asm
 
 
-~ (length to read, base address -- *)
+~ (length to read, base address -- result code)
 : sys-read
   [ here @
     :rcx pop-reg64               ~ address from stack