blob: 12402aca4da6a138d737bfb3afa3e0daa02c8c04 [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
Christopher Ferris605ee812015-04-13 14:20:11 -070018 .cfi_adjust_cfa_offset 4
19 .cfi_rel_offset ebx, 0
Bruce Beare3c543e12010-03-04 10:29:38 -080020 push %esi
Christopher Ferris605ee812015-04-13 14:20:11 -070021 .cfi_adjust_cfa_offset 4
22 .cfi_rel_offset esi, 0
Bruce Beare3c543e12010-03-04 10:29:38 -080023 push %edi
Christopher Ferris605ee812015-04-13 14:20:11 -070024 .cfi_adjust_cfa_offset 4
25 .cfi_rel_offset edi, 0
Jin Weic164f2a2012-04-12 16:50:42 +080026 push %ebp
Christopher Ferris605ee812015-04-13 14:20:11 -070027 .cfi_adjust_cfa_offset 4
28 .cfi_rel_offset ebp, 0
Bruce Beare3c543e12010-03-04 10:29:38 -080029
Mingwei Shibe910522015-11-12 07:02:14 +000030 # Get and save the system call entry address.
31 call __kernel_syscall
32 push %eax
33 .cfi_adjust_cfa_offset 4
34 .cfi_rel_offset eax, 0
35
Jin Weic164f2a2012-04-12 16:50:42 +080036 # Load all the arguments from the calling frame.
37 # (Not all will be valid, depending on the syscall.)
Mingwei Shibe910522015-11-12 07:02:14 +000038 mov 24(%esp),%eax
39 mov 28(%esp),%ebx
40 mov 32(%esp),%ecx
41 mov 36(%esp),%edx
42 mov 40(%esp),%esi
43 mov 44(%esp),%edi
44 mov 48(%esp),%ebp
Jin Weic164f2a2012-04-12 16:50:42 +080045
46 # Make the system call.
Mingwei Shibe910522015-11-12 07:02:14 +000047 call *(%esp)
48 addl $4, %esp
Bruce Beare3c543e12010-03-04 10:29:38 -080049
Jin Weic164f2a2012-04-12 16:50:42 +080050 # Error?
Elliott Hughesa85aaf12014-01-02 16:23:24 -080051 cmpl $-MAX_ERRNO, %eax
Bruce Beare3c543e12010-03-04 10:29:38 -080052 jb 1f
Jin Weic164f2a2012-04-12 16:50:42 +080053 # Yes, so set errno.
Bruce Beare3c543e12010-03-04 10:29:38 -080054 negl %eax
55 pushl %eax
Elliott Hughes011e1112014-09-08 15:25:01 -070056 call __set_errno_internal
Bruce Beare3c543e12010-03-04 10:29:38 -080057 addl $4, %esp
Bruce Beare3c543e12010-03-04 10:29:38 -0800581:
Jin Weic164f2a2012-04-12 16:50:42 +080059 # Restore the callee save registers.
60 pop %ebp
Christopher Ferris605ee812015-04-13 14:20:11 -070061 .cfi_adjust_cfa_offset -4
Christopher Ferris940d3122015-04-14 17:02:31 -070062 .cfi_restore ebp
Bruce Beare3c543e12010-03-04 10:29:38 -080063 pop %edi
Christopher Ferris605ee812015-04-13 14:20:11 -070064 .cfi_adjust_cfa_offset -4
Christopher Ferris940d3122015-04-14 17:02:31 -070065 .cfi_restore edi
Bruce Beare3c543e12010-03-04 10:29:38 -080066 pop %esi
Christopher Ferris605ee812015-04-13 14:20:11 -070067 .cfi_adjust_cfa_offset -4
Christopher Ferris940d3122015-04-14 17:02:31 -070068 .cfi_restore esi
Bruce Beare3c543e12010-03-04 10:29:38 -080069 pop %ebx
Christopher Ferris605ee812015-04-13 14:20:11 -070070 .cfi_adjust_cfa_offset -4
Christopher Ferris940d3122015-04-14 17:02:31 -070071 .cfi_restore ebx
Bruce Beare3c543e12010-03-04 10:29:38 -080072 ret
Elliott Hughesbdff26d2013-02-11 17:08:16 -080073END(syscall)