1/* Copyright (C) 1999-2022 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 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 16 <https://www.gnu.org/licenses/>. */ 17 18#include <sysdep.h> 19#include <features.h> 20#include <tls.h> 21 22ENTRY(__syscall_error) 23#if RTLD_PRIVATE_ERRNO 24 /* 25 * Note that the gp has to be set properly for this to work. 26 * As long as all syscalls are in the same load unit 27 * (executable or shared library) as this routine, we should 28 * be fine. Otherwise, we would have to first load the global 29 * pointer register from __gp. 30 */ 31 addl r2=@gprel(rtld_errno),gp 32 ;; 33 st4 [r2]=r8 34 mov r8=-1 35#else 36# if IS_IN (libc) 37# define SYSCALL_ERROR_ERRNO __libc_errno 38# else 39# define SYSCALL_ERROR_ERRNO errno 40# endif 41 addl r2=@ltoff(@tprel(SYSCALL_ERROR_ERRNO)), gp;; 42 ld8 r2=[r2] 43 mov r3=r8;; 44 mov r8=-1 45 add r2=r2,r13;; 46 st4 [r2]=r3 47#endif 48 ret // ret is #define'd in syscall.h! 49END(__syscall_error) 50 51ENTRY(__ia64_syscall) 52 mov r15=r37 /* syscall number */ 53 break __IA64_BREAK_SYSCALL 54 cmp.eq p6,p0=-1,r10 /* r10 = -1 on error */ 55(p6) br.cond.spnt.few __syscall_error 56 ret 57PSEUDO_END(__ia64_syscall) 58