]>
Commit | Line | Data |
---|---|---|
688903eb | 1 | /* Copyright (C) 1996-2018 Free Software Foundation, Inc. |
3c7b2587 UD |
2 | This file is part of the GNU C Library. |
3 | Contributed by David Mosberger <davidm@azstarnet.com>, 1996. | |
6932e444 | 4 | |
3c7b2587 | 5 | The GNU C Library is free software; you can redistribute it and/or |
3214b89b AJ |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
6932e444 | 9 | |
3c7b2587 UD |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
3214b89b | 13 | Lesser General Public License for more details. |
6932e444 | 14 | |
3214b89b | 15 | You should have received a copy of the GNU Lesser General Public |
ab84e3ff PE |
16 | License along with the GNU C Library. If not, see |
17 | <http://www.gnu.org/licenses/>. */ | |
6932e444 RM |
18 | |
19 | #include <sysdep.h> | |
20 | ||
21 | /* | |
22 | * This is for COMPATIBILITY with Linux/x86 only. Linux/Alpha system | |
5556231d | 23 | * calls return an error indication in a3. This allows arbitrary 64bit |
2e6c2875 AJ |
24 | * values to be returned in v0 (because negative values are not |
25 | * mistaken as error numbers). However, C allows only one value to | |
26 | * be returned, so the interface below folds the error indication passed in | |
6932e444 RM |
27 | * a3 back into v0: it sets v0 to -errno if an error occurs. Thus, |
28 | * no negative 64bit numbers can be returned. To avoid this problem, | |
29 | * use assembly stubs wherever possible/convenient. | |
30 | * | |
31 | * Usage: | |
32 | * | |
f3ce45f3 | 33 | * long syscall(syscall_number, arg1, arg2, arg3, arg4, arg5, arg6) |
6932e444 RM |
34 | * |
35 | * syscall_number = the index of the system call we're invoking | |
f3ce45f3 | 36 | * arg1-arg6 = up to 6 integer arguments to the system call |
6932e444 RM |
37 | * |
38 | * We need to do some arg shifting: the kernel expects the | |
f3ce45f3 | 39 | * syscall number in v0 and the first six args in a0-a5. |
6932e444 RM |
40 | * |
41 | */ | |
42 | ||
43 | ||
24c177a0 | 44 | LEAF(__syscall, 0) |
dd4b8913 UD |
45 | #ifdef PROF |
46 | ldgp gp, 0(pv) | |
3c7b2587 | 47 | .set noat |
dd4b8913 UD |
48 | lda AT, _mcount |
49 | jsr AT, (AT), _mcount | |
3c7b2587 | 50 | .set at |
dd4b8913 UD |
51 | .prologue 1 |
52 | #else | |
53 | .prologue 0 | |
54 | #endif | |
55 | ||
07f03a4d RM |
56 | mov a0, v0 /* Syscall number -> v0 */ |
57 | mov a1, a0 /* arg1-arg5 -> a0-a4 */ | |
58 | mov a2, a1 | |
59 | mov a3, a2 | |
60 | mov a4, a3 | |
61 | mov a5, a4 | |
f3ce45f3 | 62 | ldq a5,0(sp) /* arg6 -> a5 */ |
07f03a4d RM |
63 | |
64 | call_pal PAL_callsys /* Invoke system call */ | |
c18b7473 | 65 | bne a3, SYSCALL_ERROR_LABEL |
6932e444 RM |
66 | ret |
67 | ||
c18b7473 | 68 | PSEUDO_END(__syscall) |
3c7b2587 | 69 | |
8796ce21 | 70 | weak_alias (__syscall, syscall) |