x86 syscall system call implementation
diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S
new file mode 100644
index 0000000..71abe6b
--- /dev/null
+++ b/libc/arch-x86/bionic/syscall.S
@@ -0,0 +1,52 @@
+/*
+ * Generic syscall call.
+ * Upon entry
+ *	%eax: system call number
+ *	%ebx: arg0 to system call
+ *	%ecx: arg..
+ *	%edx: arg..
+ *	%esi: arg..
+ *	%edi: arg..
+ * We push these (to save them) load them up with the
+ * values from the calling frame (not all will actually be valid)
+ * and make the syscall.
+ */
+
+#include <sys/linux-syscalls.h>
+
+    .text
+    .type syscall, @function
+    .globl syscall
+    .align 4
+
+syscall:
+    push    %eax
+    push    %ebx
+    push    %ecx
+    push    %edx
+    push    %esi
+    push    %edi
+    mov     28(%esp),%eax
+    mov     32(%esp),%ebx
+    mov     36(%esp),%ecx
+    mov     40(%esp),%edx
+    mov     44(%esp),%esi
+    mov     48(%esp),%edi
+
+    int     $0x80
+
+    cmpl    $-129, %eax
+    jb      1f
+    negl    %eax
+    pushl   %eax
+    call    __set_errno
+    addl    $4, %esp
+    orl     $-1, %eax
+1:
+    pop    %edi
+    pop    %esi
+    pop    %edx
+    pop    %ecx
+    pop    %ebx
+    pop    %eax
+    ret