1/* Copyright (C) 2001-2021 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#include <tls.h> 21 22#if IS_IN (rtld) 23# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */ 24#endif 25 26.globl C_SYMBOL_NAME(errno) 27.globl syscall_error 28 29__syscall_error: 30#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 31 /* We translate the system's EWOULDBLOCK error into EAGAIN. 32 The GNU C library always defines EWOULDBLOCK==EAGAIN. 33 EWOULDBLOCK_sys is the original number. */ 34 cmp $EWOULDBLOCK_sys, %RAX_LP /* Is it the old EWOULDBLOCK? */ 35 jne notb /* Branch if not. */ 36 movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */ 37notb: 38#endif 39#ifdef PIC 40 movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx 41 movl %eax, %fs:0(%rcx) 42#else 43 movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF) 44#endif 45 or $-1, %RAX_LP 46 ret 47 48#undef __syscall_error 49END (__syscall_error) 50