OSDN Git Service

x86 syscall system call implementation
authorBruce Beare <brucex.j.beare@intel.com>
Thu, 4 Mar 2010 18:29:38 +0000 (10:29 -0800)
committerBruce Beare <brucex.j.beare@intel.com>
Thu, 4 Mar 2010 18:29:38 +0000 (10:29 -0800)
libc/Android.mk
libc/arch-x86/bionic/syscall.S [new file with mode: 0644]

index bafc118..9013e9a 100644 (file)
@@ -329,6 +329,7 @@ libc_common_src_files += \
        arch-x86/bionic/setjmp.S \
        arch-x86/bionic/_setjmp.S \
        arch-x86/bionic/vfork.S \
+       arch-x86/bionic/syscall.S \
        arch-x86/string/bzero.S \
        arch-x86/string/memset.S \
        arch-x86/string/memcmp.S \
diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S
new file mode 100644 (file)
index 0000000..71abe6b
--- /dev/null
@@ -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