get rid of pthreads
[ginge.git] / loader / syscalls.S
1 @ vim:filetype=armasm
2 #include <sys/syscall.h>
3
4
5 .global sys_cacheflush @ const void *start_addr, const void *end_addr
6 sys_cacheflush:
7     mov     r2, #0
8 #ifdef __ARM_EABI__
9     /* EABI version */
10     str     r7, [sp, #-4]!
11     mov     r7, #(__ARM_NR_cacheflush & 0xff)
12 #if (__ARM_NR_cacheflush & 0x00ff00)
13     orr     r7, r7, #(__ARM_NR_cacheflush & 0x00ff00)
14 #endif
15 #if (__ARM_NR_cacheflush & 0xff0000)
16     orr     r7, r7, #(__ARM_NR_cacheflush & 0xff0000)
17 #endif
18     swi     0
19     ldr     r7, [sp], #4
20 #else
21     /* OABI */
22     swi     __ARM_NR_cacheflush
23 #endif
24     bx      lr
25
26
27 #ifdef __ARM_EABI__
28 #error hm?
29 #endif
30
31 .global g_syscall
32 g_syscall:
33     mov   r12, sp
34     stmfd sp!, {r4, r5, r6}
35     ldmia r12, {r4, r5, r6}
36     swi   __NR_syscall
37     ldmfd sp!, {r4, r5, r6}
38
39 .global g_syscall_error
40 g_syscall_error:
41     cmn   r0, #4096
42     bxcc  lr
43     stmfd sp!, {r4, lr}
44     rsb   r4, r0, #0
45     bl    __errno_location
46     str   r4, [r0]
47     mov   r0, #-1
48     ldmfd sp!, {r4, pc}
49
50 .global g_clone
51 g_clone:
52     ldr   r12,[sp, #4]      @ arg6 - convenience func ptr
53     str   r4, [sp, #-4]!
54     ldr   r4, [sp, #4]      @ arg5
55     swi   __NR_clone
56     tst   r0, r0
57     bxeq  r12               @ child
58     cmn   r0, #4096
59     ldr   r4, [sp], #4
60     bcs   g_syscall_error
61     bx    lr
62
63 @ raw - no errno
64 .macro raw_syscall_easy name nr
65 .global \name
66 \name:
67     swi   \nr
68     bx    lr
69 .endm
70
71 .macro raw_syscall name nr
72 .global \name
73 \name:
74     mov   r12, sp
75     stmfd sp!, {r4, r5, r6, lr}
76     ldmia r12, {r4, r5, r6}
77     swi   \nr
78     stmfd sp!, {r4, r5, r6, pc}
79 .endm
80
81 raw_syscall_easy g_open_raw,           __NR_open
82 raw_syscall_easy g_read_raw,           __NR_read
83 raw_syscall_easy g_write_raw,          __NR_write
84 raw_syscall_easy g_futex_raw,          __NR_futex
85 raw_syscall_easy g_nanosleep_raw,      __NR_nanosleep
86 raw_syscall_easy g_clock_gettime_raw,  __NR_clock_gettime
87 raw_syscall_easy g_rt_sigprocmask_raw, __NR_rt_sigprocmask
88