1/* Copyright (C) 2000-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 <tls.h> 20 21/* The following code is only used in the shared library when we 22 compile the reentrant version. Otherwise each system call defines 23 each own version. */ 24 25/* The syscall stubs jump here when they detect an error. */ 26 27#undef CALL_MCOUNT 28#define CALL_MCOUNT 29 30 .text 31ENTRY(__syscall_error) 32#ifndef PIC 33# if IS_IN (libc) 34# define SYSCALL_ERROR_ERRNO __libc_errno 35# else 36# define SYSCALL_ERROR_ERRNO errno 37# endif 38 basr %r1,0 390: l %r1,1f-0b(%r1) 40 ear %r3,%a0 41 lcr %r2,%r2 42 st %r2,0(%r1,%r3) 43 lhi %r2,-1 44 br %r14 451: .long SYSCALL_ERROR_ERRNO@ntpoff 46#else 47# if RTLD_PRIVATE_ERRNO 48 basr %r1,0 490: al %r1,1f-0b(%r1) 50 lcr %r2,%r2 51 st %r2,0(%r1) 52 lhi %r2,-1 53 br %r14 541: .long rtld_errno - 0b 55# else 56# if IS_IN (libc) 57# define SYSCALL_ERROR_ERRNO __libc_errno 58# else 59# define SYSCALL_ERROR_ERRNO errno 60# endif 61 basr %r1,0 620: al %r1,1f-0b(%r1) 63 ear %r3,%a0 64 l %r1,SYSCALL_ERROR_ERRNO@gotntpoff(%r1) 65 lcr %r2,%r2 66 st %r2,0(%r1,%r3) 67 lhi %r2,-1 68 br %r14 691: .long _GLOBAL_OFFSET_TABLE_-0b 70# endif 71#endif 72 73END (__syscall_error) 74