]>
Commit | Line | Data |
---|---|---|
04277e02 | 1 | /* Copyright (C) 1997-2019 Free Software Foundation, Inc. |
3f823f48 CD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Lesser General Public | |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Lesser General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Lesser General Public | |
15 | License along with the GNU C Library. If not, see | |
5a82c748 | 16 | <https://www.gnu.org/licenses/>. */ |
3f823f48 CD |
17 | |
18 | #include <stdarg.h> | |
19 | #include <sysdep.h> | |
20 | #include <errno.h> | |
21 | ||
22 | /* HPPA implements syscall() in 'C'; the assembler version would | |
23 | typically be in syscall.S. Also note that we have INLINE_SYSCALL, | |
24 | INTERNAL_SYSCALL, and all the generated pure assembly syscall wrappers. | |
25 | How often the function is used is unknown. */ | |
26 | ||
27 | long int | |
28 | syscall (long int __sysno, ...) | |
29 | { | |
30 | /* FIXME: Keep this matching INLINE_SYSCALL for hppa */ | |
31 | va_list args; | |
32 | long int arg0, arg1, arg2, arg3, arg4, arg5; | |
33 | long int __sys_res; | |
34 | ||
35 | /* Load varargs */ | |
36 | va_start (args, __sysno); | |
37 | arg0 = va_arg (args, long int); | |
38 | arg1 = va_arg (args, long int); | |
39 | arg2 = va_arg (args, long int); | |
40 | arg3 = va_arg (args, long int); | |
41 | arg4 = va_arg (args, long int); | |
42 | arg5 = va_arg (args, long int); | |
43 | va_end (args); | |
44 | ||
45 | { | |
04ece7d2 | 46 | LOAD_ARGS_6 (arg0, arg1, arg2, arg3, arg4, arg5) |
3f823f48 CD |
47 | register unsigned long int __res asm("r28"); |
48 | PIC_REG_DEF | |
04ece7d2 | 49 | LOAD_REGS_6 |
3f823f48 CD |
50 | asm volatile (SAVE_ASM_PIC |
51 | " ble 0x100(%%sr2, %%r0) \n" | |
52 | " copy %1, %%r20 \n" | |
53 | LOAD_ASM_PIC | |
54 | : "=r" (__res) | |
55 | : "r" (__sysno) PIC_REG_USE ASM_ARGS_6 | |
56 | : "memory", CALL_CLOB_REGS CLOB_ARGS_6); | |
57 | __sys_res = __res; | |
58 | } | |
59 | if ((unsigned long int) __sys_res >= (unsigned long int) -4095) | |
60 | { | |
61 | __set_errno (-__sys_res); | |
62 | __sys_res = -1; | |
63 | } | |
64 | return __sys_res; | |
65 | } |