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
20#include <sys/asm.h>
21
22/* Usage:
23   long int syscall (syscall_number, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
24
25   We need to do some arg shifting, syscall_number will be in v0.  */
26
27
28	.text
29NESTED (syscall, SZREG, ra)
30	.mask 0x00010000, -SZREG
31	.fmask 0x00000000, 0
32	PTR_ADDIU sp, -SZREG
33	cfi_adjust_cfa_offset (SZREG)
34	REG_S s0, (sp)
35	cfi_rel_offset (s0, 0)
36
37	move s0, a0
38	move a0, a1		/* shift arg1 - arg7.  */
39	move a1, a2
40	move a2, a3
41	move a3, a4
42	move a4, a5
43	move a5, a6
44	move a6, a7
45
46	move v0, s0		/* Syscall number -> v0 */
47	syscall			/* Do the system call.  */
48
49	REG_L s0, (sp)
50	cfi_restore (s0)
51	PTR_ADDIU sp, SZREG
52	cfi_adjust_cfa_offset (-SZREG)
53	bne a3, zero, L(error)
54
55	ret
56
57L(error):
58	SETUP_GP64_REG (a0, syscall)
59	PTR_LA t9, __syscall_error
60	RESTORE_GP64_REG
61	jr t9
62
63END (syscall)
64