1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /*
- * 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
|