1/* Copyright (C) 1992-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#include <sys/asm.h> 21 22 .set nomips16 23 24#ifdef _LIBC_REENTRANT 25 26LOCALSZ= 3 27FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK 28RAOFF= FRAMESZ-(1*SZREG) 29GPOFF= FRAMESZ-(2*SZREG) 30V0OFF= FRAMESZ-(3*SZREG) 31 32ENTRY(__syscall_error) 33#ifdef __PIC__ 34 .set noat 35 SETUP_GPX (AT) 36 .set at 37#endif 38 PTR_SUBU sp, FRAMESZ 39 .set noat 40 SETUP_GPX64(GPOFF,AT) 41 .set at 42#ifdef __PIC__ 43 SAVE_GP(GPOFF) 44#endif 45 REG_S v0, V0OFF(sp) 46 REG_S ra, RAOFF(sp) 47 48#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 49 /* We translate the system's EWOULDBLOCK error into EAGAIN. 50 The GNU C library always defines EWOULDBLOCK==EAGAIN. 51 EWOULDBLOCK_sys is the original number. */ 52 bne v0, EWOULDBLOCK_sys, L(skip) 53 nop 54 li v0, EAGAIN 55L(skip): 56#endif 57 /* Find our per-thread errno address */ 58 jal __errno_location 59 60 /* Store the error value. */ 61 REG_L t0, V0OFF(sp) 62 sw t0, 0(v0) 63 64 /* And just kick back a -1. */ 65 REG_L ra, RAOFF(sp) 66 RESTORE_GP64 67 PTR_ADDU sp, FRAMESZ 68 li v0, -1 69 j ra 70 END(__syscall_error) 71 72#else /* _LIBC_REENTRANT */ 73 74 75ENTRY(__syscall_error) 76#ifdef __PIC__ 77 SETUP_GPX (AT) 78#endif 79 SETUP_GPX64 (t9, AT) 80 81#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 82 /* We translate the system's EWOULDBLOCK error into EAGAIN. 83 The GNU C library always defines EWOULDBLOCK==EAGAIN. 84 EWOULDBLOCK_sys is the original number. */ 85 bne v0, EWOULDBLOCK_sys, L(skip) 86 li v0, EAGAIN 87L(skip): 88#endif 89 /* Store it in errno... */ 90 sw v0, errno 91 92 /* And just kick back a -1. */ 93 li v0, -1 94 95 RESTORE_GP64 96 j ra 97 END(__syscall_error) 98#endif /* _LIBC_REENTRANT */ 99