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

source code of glibc/sysdeps/unix/sh/sysdep.S