summaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/i386/syscall.s21
-rw-r--r--src/internal/syscall.c11
-rw-r--r--src/internal/syscall_ret.c11
-rw-r--r--src/internal/x86_64/syscall.s14
4 files changed, 46 insertions, 11 deletions
diff --git a/src/internal/i386/syscall.s b/src/internal/i386/syscall.s
new file mode 100644
index 00000000..5b19a1b8
--- /dev/null
+++ b/src/internal/i386/syscall.s
@@ -0,0 +1,21 @@
+.global __syscall
+.type __syscall,%function
+__syscall:
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+ pushl %ebp
+ movl 20(%esp),%eax
+ movl 24(%esp),%ebx
+ movl 28(%esp),%ecx
+ movl 32(%esp),%edx
+ movl 36(%esp),%esi
+ movl 40(%esp),%edi
+ movl 44(%esp),%ebp
+ int $128
+ popl %ebp
+ popl %edi
+ popl %esi
+ popl %ebx
+ ret
+.size __syscall,.-__syscall
diff --git a/src/internal/syscall.c b/src/internal/syscall.c
index 4f159e0b..e69de29b 100644
--- a/src/internal/syscall.c
+++ b/src/internal/syscall.c
@@ -1,11 +0,0 @@
-#include <errno.h>
-#include <unistd.h>
-
-long __syscall_ret(unsigned long r)
-{
- if (r >= (unsigned long)-1 - 4096) {
- errno = -(long)r;
- return -1;
- }
- return (long)r;
-}
diff --git a/src/internal/syscall_ret.c b/src/internal/syscall_ret.c
new file mode 100644
index 00000000..4f159e0b
--- /dev/null
+++ b/src/internal/syscall_ret.c
@@ -0,0 +1,11 @@
+#include <errno.h>
+#include <unistd.h>
+
+long __syscall_ret(unsigned long r)
+{
+ if (r >= (unsigned long)-1 - 4096) {
+ errno = -(long)r;
+ return -1;
+ }
+ return (long)r;
+}
diff --git a/src/internal/x86_64/syscall.s b/src/internal/x86_64/syscall.s
new file mode 100644
index 00000000..7bec7291
--- /dev/null
+++ b/src/internal/x86_64/syscall.s
@@ -0,0 +1,14 @@
+.global __syscall
+.type __syscall,%function
+__syscall:
+di,si,dx,cx,r8,r9
+ movq %rdi,%rax
+ movq %rsi,%rdi
+ movq %rdx,%rsi
+ movq %rcx,%rdx
+ movq %r8,%r10
+ movq %r9,%r8
+ movq 8(%rsp),%r9
+ syscall
+ ret
+.size __syscall,.-__syscall