unset ld env before running command
[ginge.git] / loader / syscalls.S
1 @ vim:filetype=armasm
2 #include <sys/syscall.h>
3
4 @ support ancient toolchains (gcc 2.95.3 has upto 225)
5 #ifndef __NR_futex
6 #define __NR_futex                      (__NR_SYSCALL_BASE+240)
7 #endif
8 #ifndef __NR_exit_group
9 #define __NR_exit_group                 (__NR_SYSCALL_BASE+248)
10 #endif
11 #ifndef __NR_clock_gettime
12 #define __NR_clock_gettime              (__NR_SYSCALL_BASE+263)
13 #endif
14
15 .global sys_cacheflush @ const void *start_addr, const void *end_addr
16 sys_cacheflush:
17     mov     r2, #0
18 #ifdef __ARM_EABI__
19     /* EABI version */
20     str     r7, [sp, #-4]!
21     mov     r7, #(__ARM_NR_cacheflush & 0xff)
22 #if (__ARM_NR_cacheflush & 0x00ff00)
23     orr     r7, r7, #(__ARM_NR_cacheflush & 0x00ff00)
24 #endif
25 #if (__ARM_NR_cacheflush & 0xff0000)
26     orr     r7, r7, #(__ARM_NR_cacheflush & 0xff0000)
27 #endif
28     swi     0
29     ldr     r7, [sp], #4
30 #else
31     /* OABI */
32     swi     __ARM_NR_cacheflush
33 #endif
34     bx      lr
35
36
37 #ifdef __ARM_EABI__
38 #error hm?
39 #endif
40
41 .global g_syscall
42 g_syscall:
43     mov   r12, sp
44     stmfd sp!, {r4, r5, r6}
45     ldmia r12, {r4, r5, r6}
46     swi   __NR_syscall
47     ldmfd sp!, {r4, r5, r6}
48
49 .global g_syscall_error
50 g_syscall_error:
51     cmn   r0, #4096
52     bxcc  lr
53     stmfd sp!, {r4, lr}
54     rsb   r4, r0, #0
55     bl    __errno_location
56     str   r4, [r0]
57     mov   r0, #-1
58     ldmfd sp!, {r4, pc}
59
60 .global g_clone
61 g_clone:
62     ldr   r12,[sp, #4]      @ arg6 - convenience func ptr
63     str   r4, [sp, #-4]!
64     ldr   r4, [sp, #4]      @ arg5
65     swi   __NR_clone
66     tst   r0, r0
67     bxeq  r12               @ child
68     cmn   r0, #4096
69     ldr   r4, [sp], #4
70     bcs   g_syscall_error
71     bx    lr
72
73 @ raw - no errno
74 .macro raw_syscall_easy name nr
75 .global \name
76 \name:
77     swi   \nr
78     bx    lr
79 .endm
80
81 .macro raw_syscall name nr
82 .global \name
83 \name:
84     mov   r12, sp
85     stmfd sp!, {r4, r5, r6, lr}
86     ldmia r12, {r4, r5, r6}
87     swi   \nr
88     ldmfd sp!, {r4, r5, r6, pc}
89 .endm
90
91 raw_syscall_easy g_open_raw,           __NR_open
92 raw_syscall_easy g_read_raw,           __NR_read
93 raw_syscall_easy g_write_raw,          __NR_write
94 raw_syscall      g_mmap2_raw,          __NR_mmap2
95 raw_syscall_easy g_munmap_raw,         __NR_munmap
96 raw_syscall_easy g_ioctl_raw,          __NR_ioctl
97 raw_syscall_easy g_close_raw,          __NR_close
98 raw_syscall_easy g_chdir_raw,          __NR_chdir
99 raw_syscall_easy g_mkdir_raw,          __NR_mkdir
100 raw_syscall_easy g_futex_raw,          __NR_futex
101 raw_syscall_easy g_nanosleep_raw,      __NR_nanosleep
102 raw_syscall_easy g_readlink_raw,       __NR_readlink
103 raw_syscall_easy g_execve_raw,         __NR_execve
104 raw_syscall_easy g_clock_gettime_raw,  __NR_clock_gettime
105 raw_syscall_easy g_rt_sigprocmask_raw, __NR_rt_sigprocmask
106 raw_syscall_easy g_personality,        __NR_personality
107 raw_syscall_easy g_exit_group_raw,     __NR_exit_group