Implement syscall.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / linux / hppa / sysdep.c
1 /* Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
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 Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    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    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #include <sysdep.h>
20 #include <errno.h>
21
22 /* This routine is jumped to by all the syscall handlers, to stash
23    an error number into errno.  */
24 int
25 __syscall_error (int err_no)
26 {
27   __set_errno (err_no);
28   return -1;
29 }
30
31 /* We also have to have a 'real' definition of errno.  */
32 #undef errno
33 int errno = 0;
34 weak_alias (errno, _errno)
35
36
37 /* HPPA implements syscall() in 'C'; the assembler version would
38    typically be in syscall.S.  */
39
40 int
41 syscall (int sysnum, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5)
42 {
43   long __sys_res;
44   {
45     register unsigned long __res asm("r28");
46     LOAD_ARGS_6(arg0, arg1, arg2, arg3, arg4, arg5)
47       asm volatile ("ble  0x100(%%sr2, %%r0)\n\t"
48                     "copy %1, %%r20"
49                     : "=r" (__res)
50                     : "r" (sysnum) ASM_ARGS_6);
51     __sys_res = __res;
52   }
53   if ((unsigned long) __sys_res >= (unsigned long)-4095)
54     {
55     __set_errno(-__sys_res);
56     __sys_res = -1;
57   }
58   return __sys_res;
59 }