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