support ancient toolchains
[ginge.git] / loader / syscalls.S
... / ...
CommitLineData
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
16sys_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
42g_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
50g_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
61g_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
91raw_syscall_easy g_open_raw, __NR_open
92raw_syscall_easy g_read_raw, __NR_read
93raw_syscall_easy g_write_raw, __NR_write
94raw_syscall g_mmap2_raw, __NR_mmap2
95raw_syscall_easy g_munmap_raw, __NR_munmap
96raw_syscall_easy g_ioctl_raw, __NR_ioctl
97raw_syscall_easy g_close_raw, __NR_close
98raw_syscall_easy g_chdir_raw, __NR_chdir
99raw_syscall_easy g_futex_raw, __NR_futex
100raw_syscall_easy g_nanosleep_raw, __NR_nanosleep
101raw_syscall_easy g_readlink_raw, __NR_readlink
102raw_syscall_easy g_execve_raw, __NR_execve
103raw_syscall_easy g_clock_gettime_raw, __NR_clock_gettime
104raw_syscall_easy g_rt_sigprocmask_raw, __NR_rt_sigprocmask
105raw_syscall_easy g_exit_group_raw, __NR_exit_group