blob: b9318821bddbd080d47546c96f7a794f56dd6c40 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/* Copyright (C) 2005 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, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17 02111-1307 USA. */
18
19#include <sys/syscall.h>
20#include <bits/arm_asm.h>
21
22/* In the EABI syscall interface, we don't need a special syscall to
23 implement syscall(). It won't work reliably with 64-bit arguments
24 (but that is true on many modern platforms). */
25
26.text
27.global syscall
28.type syscall,%function
29.align 4
30#if defined(THUMB1_ONLY)
31.thumb_func
32syscall:
33 push {r4, r5, r6, r7}
34 mov ip, r0
35 mov r0, r1
36 mov r1, r2
37 mov r2, r3
38 add r7, sp, #(4 * 4)
39 ldmia r7!, {r3, r4, r5, r6}
40 mov r7, ip
41 swi 0x0
42 pop {r4, r5, r6, r7}
43 ldr r1, =0xfffff000
44 cmp r0, r1
45 bcs 1f
46 bx lr
471:
48 push {r3, lr}
49 bl __syscall_error
50 POP_RET
51.pool
52#else
53syscall:
54 mov ip, sp
55 stmfd sp!, {r4, r5, r6, r7}
56 mov r7, r0
57 mov r0, r1
58 mov r1, r2
59 mov r2, r3
60 ldmfd ip, {r3, r4, r5, r6}
61 swi 0x0
62 ldmfd sp!, {r4, r5, r6, r7}
63 cmn r0, #4096
64 IT(t, cc)
65#if defined(__USE_BX__)
66 bxcc lr
67#else
68 movcc pc, lr
69#endif
70 b __syscall_error
71#endif
72
73.size syscall,.-syscall