| | 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 |