X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=ginge.git;a=blobdiff_plain;f=loader%2Fsyscalls.S;fp=loader%2Fsyscalls.S;h=e72e7d22f72d5bcb4b1906bd77d85308ee5301fc;hp=0000000000000000000000000000000000000000;hb=d0b9b0df7ed0dc36aabe30e2d584c27c8c32a3d9;hpb=1fc90bfe7c558b33f4e76f8346b9134baeb0c661 diff --git a/loader/syscalls.S b/loader/syscalls.S new file mode 100644 index 0000000..e72e7d2 --- /dev/null +++ b/loader/syscalls.S @@ -0,0 +1,88 @@ +@ vim:filetype=armasm +#include + + +.global sys_cacheflush @ const void *start_addr, const void *end_addr +sys_cacheflush: + mov r2, #0 +#ifdef __ARM_EABI__ + /* EABI version */ + str r7, [sp, #-4]! + mov r7, #(__ARM_NR_cacheflush & 0xff) +#if (__ARM_NR_cacheflush & 0x00ff00) + orr r7, r7, #(__ARM_NR_cacheflush & 0x00ff00) +#endif +#if (__ARM_NR_cacheflush & 0xff0000) + orr r7, r7, #(__ARM_NR_cacheflush & 0xff0000) +#endif + swi 0 + ldr r7, [sp], #4 +#else + /* OABI */ + swi __ARM_NR_cacheflush +#endif + bx lr + + +#ifdef __ARM_EABI__ +#error hm? +#endif + +.global g_syscall +g_syscall: + mov r12, sp + stmfd sp!, {r4, r5, r6} + ldmia r12, {r4, r5, r6} + swi __NR_syscall + ldmfd sp!, {r4, r5, r6} + +.global g_syscall_error +g_syscall_error: + cmn r0, #4096 + bxcc lr + stmfd sp!, {r4, lr} + rsb r4, r0, #0 + bl __errno_location + str r4, [r0] + mov r0, #-1 + ldmfd sp!, {r4, pc} + +.global g_clone +g_clone: + ldr r12,[sp, #4] @ arg6 - convenience func ptr + str r4, [sp, #-4]! + ldr r4, [sp, #4] @ arg5 + swi __NR_clone + tst r0, r0 + bxeq r12 @ child + cmn r0, #4096 + ldr r4, [sp], #4 + bcs g_syscall_error + bx lr + +@ raw - no errno +.macro raw_syscall_easy name nr +.global \name +\name: + swi \nr + bx lr +.endm + +.macro raw_syscall name nr +.global \name +\name: + mov r12, sp + stmfd sp!, {r4, r5, r6, lr} + ldmia r12, {r4, r5, r6} + swi \nr + stmfd sp!, {r4, r5, r6, pc} +.endm + +raw_syscall_easy g_open_raw, __NR_open +raw_syscall_easy g_read_raw, __NR_read +raw_syscall_easy g_write_raw, __NR_write +raw_syscall_easy g_futex_raw, __NR_futex +raw_syscall_easy g_nanosleep_raw, __NR_nanosleep +raw_syscall_easy g_clock_gettime_raw, __NR_clock_gettime +raw_syscall_easy g_rt_sigprocmask_raw, __NR_rt_sigprocmask +