| /* |
| * Copyright (C) 2004-2007 Atmel Corporation |
| * |
| * This file is subject to the terms and conditions of the GNU Lesser General |
| * Public License. See the file "COPYING.LIB" in the main directory of this |
| * archive for more details. |
| */ |
| #include <features.h> |
| |
| .text |
| |
| /* |
| * long int syscall(long int sysno, ...) |
| */ |
| .global syscall |
| .type syscall, @function |
| .align 2 |
| syscall: |
| stm --sp, r3,r5,r6,lr |
| sub lr, sp, -16 |
| mov r8, r12 |
| ldm lr, r3,r5,r9-r12 |
| scall |
| cp.w r12, -4095 |
| brlo .Ldone |
| |
| #ifdef __PIC__ |
| lddpc r6, .Lgot |
| .Lgotcalc: |
| rsub r6, pc |
| # ifdef __UCLIBC_HAS_THREADS__ |
| rsub r3, r12, 0 |
| mcall r6[__errno_location@got] |
| st.w r12[0], r3 |
| # else |
| ld.w r3, r6[errno@got] |
| neg r12 |
| st.w r3[0], r12 |
| # endif |
| #else |
| # ifdef __UCLIBC_HAS_THREADS__ |
| rsub r3, r12, 0 |
| mcall .Lerrno_location |
| st.w r12[0], r3 |
| # else |
| lddpc r3, .Lerrno |
| neg r12 |
| st.w r3[0], r12 |
| # endif |
| #endif |
| mov r12, -1 |
| |
| .Ldone: |
| ldm sp++, r3,r5,r6,pc |
| |
| .align 2 |
| #ifdef __PIC__ |
| .Lgot: |
| .long .Lgotcalc - _GLOBAL_OFFSET_TABLE_ |
| #else |
| # ifdef __UCLIBC_HAS_THREADS__ |
| .Lerrno_location: |
| .long __errno_location |
| # else |
| .Lerrno: |
| .long errno |
| # endif |
| #endif |
| |
| |
| .size syscall, . - syscall |