blob: 49d6f8de8171efa6d1195253acf6fee54464a3bf [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
13#include <sys/linux-syscalls.h>
14
15 .text
16 .type syscall, @function
17 .globl syscall
18 .align 4
19
20syscall:
Jin Weic164f2a2012-04-12 16:50:42 +080021 # Push the callee save registers.
Bruce Beare3c543e12010-03-04 10:29:38 -080022 push %ebx
Bruce Beare3c543e12010-03-04 10:29:38 -080023 push %esi
24 push %edi
Jin Weic164f2a2012-04-12 16:50:42 +080025 push %ebp
Bruce Beare3c543e12010-03-04 10:29:38 -080026
Jin Weic164f2a2012-04-12 16:50:42 +080027 # Load all the arguments from the calling frame.
28 # (Not all will be valid, depending on the syscall.)
29 mov 20(%esp),%eax
30 mov 24(%esp),%ebx
31 mov 28(%esp),%ecx
32 mov 32(%esp),%edx
33 mov 36(%esp),%esi
34 mov 40(%esp),%edi
35 mov 44(%esp),%ebp
36
37 # Make the system call.
Bruce Beare3c543e12010-03-04 10:29:38 -080038 int $0x80
39
Jin Weic164f2a2012-04-12 16:50:42 +080040 # Error?
Jun Nakajima5288fee2011-06-17 14:37:50 -070041 cmpl $-4095, %eax
Bruce Beare3c543e12010-03-04 10:29:38 -080042 jb 1f
Jin Weic164f2a2012-04-12 16:50:42 +080043 # Yes, so set errno.
Bruce Beare3c543e12010-03-04 10:29:38 -080044 negl %eax
45 pushl %eax
46 call __set_errno
47 addl $4, %esp
48 orl $-1, %eax
491:
Jin Weic164f2a2012-04-12 16:50:42 +080050 # Restore the callee save registers.
51 pop %ebp
Bruce Beare3c543e12010-03-04 10:29:38 -080052 pop %edi
53 pop %esi
Bruce Beare3c543e12010-03-04 10:29:38 -080054 pop %ebx
Bruce Beare3c543e12010-03-04 10:29:38 -080055 ret