1/* Copyright (C) 1991-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 <errno.h> 20 21#if IS_IN (rtld) 22# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */ 23#endif 24 25#include <tls.h> 26 27#undef syscall_error 28__syscall_error: 29#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 30 /* We translate the system's EWOULDBLOCK error into EAGAIN. 31 The GNU C library always defines EWOULDBLOCK==EAGAIN. 32 EWOULDBLOCK_sys is the original number. */ 33 cmp r0, $EWOULDBLOCK_sys /* Is it the old EWOULDBLOCK? */ 34 it eq 35 moveq r0, $EAGAIN /* Yes; translate it to EAGAIN. */ 36#endif 37 38#if !IS_IN (rtld) 39 mov r1, r0 40 GET_TLS (r2) 41 ldr r2, 1f 42#ifdef __thumb__ 432: add r2, r2, pc 44 ldr r2, [r2] 45#else 462: ldr r2, [pc, r2] 47#endif 48 str r1, [r0, r2] 49 mvn r0, #0 50 DO_RET(lr) 51 521: .word errno(gottpoff) + (. - 2b - PC_OFS) 53#elif RTLD_PRIVATE_ERRNO 54 LDST_PCREL(str, r0, r1, C_SYMBOL_NAME(rtld_errno)) 55 mvn r0, #0 56 DO_RET(r14) 57#else 58#error "Unsupported non-TLS case" 59#endif 60 61#undef __syscall_error 62END (__syscall_error) 63