blob: 0178f41d1a9c37dfbc3e8d0f550e732f03f174f6 [file] [log] [blame]
Bruce Beare3c543e12010-03-04 10:29:38 -08001/*
2 * Generic syscall call.
Jin Weic164f2a2012-04-12 16:50:42 +08003 * Upon entry:
4 * %eax: system call number - caller save
5 * %ebx: arg0 to system call - callee save
6 * %ecx: arg1 - caller save
7 * %edx: arg2 - caller save
8 * %esi: arg3 - callee save
9 * %edi: arg4 - callee save
10 * %ebp: arg5 - callee save
Bruce Beare3c543e12010-03-04 10:29:38 -080011 */
12
Elliott Hughesa85aaf12014-01-02 16:23:24 -080013#include <private/bionic_asm.h>
Bruce Beare3c543e12010-03-04 10:29:38 -080014
Elliott Hughesbdff26d2013-02-11 17:08:16 -080015ENTRY(syscall)
Jin Weic164f2a2012-04-12 16:50:42 +080016 # Push the callee save registers.
Bruce Beare3c543e12010-03-04 10:29:38 -080017 push %ebx
Bruce Beare3c543e12010-03-04 10:29:38 -080018 push %esi
19 push %edi
Jin Weic164f2a2012-04-12 16:50:42 +080020 push %ebp
Bruce Beare3c543e12010-03-04 10:29:38 -080021
Jin Weic164f2a2012-04-12 16:50:42 +080022 # Load all the arguments from the calling frame.
23 # (Not all will be valid, depending on the syscall.)
24 mov 20(%esp),%eax
25 mov 24(%esp),%ebx
26 mov 28(%esp),%ecx
27 mov 32(%esp),%edx
28 mov 36(%esp),%esi
29 mov 40(%esp),%edi
30 mov 44(%esp),%ebp
31
32 # Make the system call.
Bruce Beare3c543e12010-03-04 10:29:38 -080033 int $0x80
34
Jin Weic164f2a2012-04-12 16:50:42 +080035 # Error?
Elliott Hughesa85aaf12014-01-02 16:23:24 -080036 cmpl $-MAX_ERRNO, %eax
Bruce Beare3c543e12010-03-04 10:29:38 -080037 jb 1f
Jin Weic164f2a2012-04-12 16:50:42 +080038 # Yes, so set errno.
Bruce Beare3c543e12010-03-04 10:29:38 -080039 negl %eax
40 pushl %eax
41 call __set_errno
42 addl $4, %esp
43 orl $-1, %eax
441:
Jin Weic164f2a2012-04-12 16:50:42 +080045 # Restore the callee save registers.
46 pop %ebp
Bruce Beare3c543e12010-03-04 10:29:38 -080047 pop %edi
48 pop %esi
Bruce Beare3c543e12010-03-04 10:29:38 -080049 pop %ebx
Bruce Beare3c543e12010-03-04 10:29:38 -080050 ret
Elliott Hughesbdff26d2013-02-11 17:08:16 -080051END(syscall)