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 <errno.h> 20 21ENTRY(__syscall_error) 22#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 23 /* We translate the system's EWOULDBLOCK error into EAGAIN. 24 The GNU C library always defines EWOULDBLOCK==EAGAIN. 25 EWOULDBLOCK_sys is the original number. */ 26 mov.l .L1, r1 27 cmp/eq r1, r0 28 bf skip 29 nop 30 mov.l .L2, r0 31skip: 32#endif 33 /* Store it in errno... */ 34#ifndef SHARED 35#ifndef _LIBC_REENTRANT 36 mov.l .L3, r1 37 mov.l r0, @r1 38#else 39 mov.l .L3, r1 40 sts.l pr, @-r15 41 cfi_adjust_cfa_offset (4) 42 cfi_rel_offset (pr, 0) 43 mov.l r0, @-r15 44 cfi_adjust_cfa_offset (4) 45 jsr @r1 46 nop 47 mov.l @r15+, r1 48 cfi_adjust_cfa_offset (-4) 49 lds.l @r15+, pr 50 cfi_adjust_cfa_offset (-4) 51 cfi_restore (pr) 52 mov.l r1, @r0 53#endif 54#else 55 mov.l r12, @-r15 56 cfi_adjust_cfa_offset (4) 57 cfi_rel_offset (r12, 0) 58#ifndef _LIBC_REENTRANT 59 mov r0, r2 60 mov.l 0f, r12 61 mova 0f, r0 62 add r0, r12 63 mov.l .L3, r0 64 mov.l @(r0,r12), r1 65 mov.l r2, @r1 66#else 67 mov.l r0, @-r15 68 cfi_adjust_cfa_offset (4) 69 sts.l pr, @-r15 70 cfi_adjust_cfa_offset (4) 71 cfi_rel_offset (pr, 0) 72 mov.l 0f, r12 73 mova 0f, r0 74 add r0, r12 75 mov.l .L3, r1 76 mova .L3, r0 77 add r0, r1 78 jsr @r1 79 nop 80 lds.l @r15+, pr 81 cfi_adjust_cfa_offset (-4) 82 cfi_restore (pr) 83 mov.l @r15+, r1 84 cfi_adjust_cfa_offset (-4) 85 mov.l r1, @r0 86#endif 87 mov.l @r15+, r12 88 cfi_adjust_cfa_offset (-4) 89 cfi_restore (r12) 90#endif 91 /* And just kick back a -1. */ 92 rts 93 mov #-1, r0 94 95 .align 2 96#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN 97.L1: .long EWOULDBLOCK_sys 98.L2: .long EAGAIN 99#endif 100#ifndef SHARED 101#ifndef _LIBC_REENTRANT 102.L3: .long C_SYMBOL_NAME(errno) 103#else 104.L3: .long C_SYMBOL_NAME(__errno_location) 105#endif 106#else 1070: 108 .long _GLOBAL_OFFSET_TABLE_ 109#ifndef _LIBC_REENTRANT 110.L3: .long C_SYMBOL_NAME(errno@GOT) 111#else 112.L3: .long C_SYMBOL_NAME(__errno_location@PLT) 113#endif 114#endif 115END(__syscall_error) 116