blob: 55c1b1fa29d5f890ff9b87f8dc48d755584644ec [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
2 * Copyright (C) 2004-2007 Atmel Corporation
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser General
5 * Public License. See the file "COPYING.LIB" in the main directory of this
6 * archive for more details.
7 */
8#include <features.h>
9
10 .text
11
12 /*
13 * long int syscall(long int sysno, ...)
14 */
15 .global syscall
16 .type syscall, @function
17 .align 2
18syscall:
19 stm --sp, r3,r5,r6,lr
20 sub lr, sp, -16
21 mov r8, r12
22 ldm lr, r3,r5,r9-r12
23 scall
24 cp.w r12, -4095
25 brlo .Ldone
26
27#ifdef __PIC__
28 lddpc r6, .Lgot
29.Lgotcalc:
30 rsub r6, pc
31# ifdef __UCLIBC_HAS_THREADS__
32 rsub r3, r12, 0
33 mcall r6[__errno_location@got]
34 st.w r12[0], r3
35# else
36 ld.w r3, r6[errno@got]
37 neg r12
38 st.w r3[0], r12
39# endif
40#else
41# ifdef __UCLIBC_HAS_THREADS__
42 rsub r3, r12, 0
43 mcall .Lerrno_location
44 st.w r12[0], r3
45# else
46 lddpc r3, .Lerrno
47 neg r12
48 st.w r3[0], r12
49# endif
50#endif
51 mov r12, -1
52
53.Ldone:
54 ldm sp++, r3,r5,r6,pc
55
56 .align 2
57#ifdef __PIC__
58.Lgot:
59 .long .Lgotcalc - _GLOBAL_OFFSET_TABLE_
60#else
61# ifdef __UCLIBC_HAS_THREADS__
62.Lerrno_location:
63 .long __errno_location
64# else
65.Lerrno:
66 .long errno
67# endif
68#endif
69
70
71 .size syscall, . - syscall