diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/hppa/sysdep.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/sysdep.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.c b/sysdeps/unix/sysv/linux/hppa/sysdep.c index bf4d4af5c7..192efbaf75 100644 --- a/sysdeps/unix/sysv/linux/hppa/sysdep.c +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 2001, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,6 +19,10 @@ #include <sysdep.h> #include <errno.h> +extern int __syscall_error(int err_no); +extern int syscall (int sysnum, int arg0, int arg1, int arg2, + int arg3, int arg4, int arg5); + /* This routine is jumped to by all the syscall handlers, to stash an error number into errno. */ int @@ -30,25 +34,31 @@ __syscall_error (int err_no) /* HPPA implements syscall() in 'C'; the assembler version would - typically be in syscall.S. */ - + typically be in syscall.S. Also note that we have INLINE_SYSCALL, + INTERNAL_SYSCALL, and all the generated pure assembly syscall wrappers. + How often the function is used is unknown. */ int -syscall (int sysnum, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5) +syscall (int sysnum, int arg0, int arg1, int arg2, int arg3, int arg4, + int arg5) { - long __sys_res; + /* FIXME: Keep this matching INLINE_SYSCALL for hppa */ + long int __sys_res; { - register unsigned long __res asm("r28"); - LOAD_ARGS_6(arg0, arg1, arg2, arg3, arg4, arg5) - asm volatile ("ble 0x100(%%sr2, %%r0)\n\t" - "copy %1, %%r20" - : "=r" (__res) - : "r" (sysnum) ASM_ARGS_6); + register unsigned long int __res asm("r28"); + LOAD_ARGS_6 (arg0, arg1, arg2, arg3, arg4, arg5) + asm volatile (STW_ASM_PIC + " ble 0x100(%%sr2, %%r0) \n" + " copy %1, %%r20 \n" + LDW_ASM_PIC + : "=r" (__res) + : "r" (sysnum) ASM_ARGS_6 + : CALL_CLOB_REGS CLOB_ARGS_6); __sys_res = __res; } - if ((unsigned long) __sys_res >= (unsigned long)-4095) + if ((unsigned long int) __sys_res >= (unsigned long int) -4095) { - __set_errno(-__sys_res); - __sys_res = -1; - } + __set_errno (-__sys_res); + __sys_res = -1; + } return __sys_res; } |