]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/avr32/syscall.S
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / avr32 / syscall.S
1 /*
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
18 syscall:
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