diff options
author | David Turner <digit@android.com> | 2010-03-17 14:07:27 -0700 |
---|---|---|
committer | Android Code Review <code-review@android.com> | 2010-03-17 14:07:27 -0700 |
commit | ede2e75f4942293342dfb8dfd4751369600ed8f1 (patch) | |
tree | 00cc20bb91b42892be7f4f659af255adcb2fc7fb | |
parent | b0ae864dffd288c3547618b3a193569ea579eea5 (diff) | |
parent | 3c543e1da9a2780a70b25299f39734bf0a18c4a0 (diff) | |
download | bionic-ede2e75f4942293342dfb8dfd4751369600ed8f1.zip bionic-ede2e75f4942293342dfb8dfd4751369600ed8f1.tar.gz bionic-ede2e75f4942293342dfb8dfd4751369600ed8f1.tar.bz2 |
Merge "x86 syscall system call implementation"
-rw-r--r-- | libc/Android.mk | 1 | ||||
-rw-r--r-- | libc/arch-x86/bionic/syscall.S | 52 |
2 files changed, 53 insertions, 0 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index bafc118..9013e9a 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -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 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 |