#import <sys/syscall.h>
#define SWI_SYSCALL 0x80 // from <mach/vm_param.h>
#if defined(__DYNAMIC__)
#define MI_GET_ADDRESS(reg,var) \
ldr reg, 4f ;\
3: ldr reg, [pc, reg] ;\
b 5f ;\
4: .long 6f - (3b + 8) ;\
5: ;\
.non_lazy_symbol_pointer ;\
6: ;\
.indirect_symbol var ;\
.long 0 ;\
.text ;\
.align 2
#else
#define MI_GET_ADDRESS(reg,var) \
ldr reg, 3f ;\
b 4f ;\
3: .long var ;\
4:
#endif
#if defined(__DYNAMIC__)
#define MI_BRANCH_EXTERNAL(var) \
.globl var ;\
MI_GET_ADDRESS(ip, var) ;\
bx ip
#else
#define MI_BRANCH_EXTERNAL(var) ;\
.globl var ;\
b var
#endif
#if defined(__DYNAMIC__)
#define MI_CALL_EXTERNAL(var) \
.globl var ;\
MI_GET_ADDRESS(ip,var) ;\
mov lr, pc ;\
bx ip
#else
#define MI_CALL_EXTERNAL(var) \
.globl var ;\
bl var
#endif
#define MI_ENTRY_POINT(name) \
.align 2 ;\
.globl name ;\
.text ;\
name:
#define DO_SYSCALL(num) \
.if (((num) & 0xff) == (num)) ;\
mov r12, #(num) ;\
.elseif (((num) & 0x3fc) == (num)) ;\
mov r12, #(num) ;\
.else ;\
mov r12, #((num) & 0xffffff00) ;\
orr r12, r12, #((num) & 0xff) ;\
.endif ;\
swi #SWI_SYSCALL
#define SYSCALL_0to4(name) \
MI_ENTRY_POINT(_##name) ;\
DO_SYSCALL(SYS_##name) ;\
bxcc lr ; \
1: MI_BRANCH_EXTERNAL(cerror)
#define SYSCALL_5(name) \
MI_ENTRY_POINT(_##name) ;\
mov ip, sp ; \
stmfd sp!, { r4-r5 } ;\
ldr r4, [ip] ; \
DO_SYSCALL(SYS_##name) ;\
ldmfd sp!, { r4-r5 } ; \
bxcc lr ; \
1: MI_BRANCH_EXTERNAL(cerror)
#define SYSCALL_6to8(name, save_regs, arg_regs) \
MI_ENTRY_POINT(_##name) ;\
mov ip, sp ; \
stmfd sp!, { save_regs } ;\
ldmia ip, { arg_regs } ; \
DO_SYSCALL(SYS_##name) ;\
ldmfd sp!, { save_regs } ; \
bxcc lr ; \
1: MI_BRANCH_EXTERNAL(cerror)
#define COMMA ,
#define SYSCALL_0(name) SYSCALL_0to4(name)
#define SYSCALL_1(name) SYSCALL_0to4(name)
#define SYSCALL_2(name) SYSCALL_0to4(name)
#define SYSCALL_3(name) SYSCALL_0to4(name)
#define SYSCALL_4(name) SYSCALL_0to4(name)
#define SYSCALL_6(name) SYSCALL_6to8(name, r4-r5, r4-r5)
#define SYSCALL_7(name) SYSCALL_6to8(name, r4-r6 COMMA r8, r4-r6)
#define SYSCALL(name, nargs) SYSCALL_##nargs(name)
#define SYSCALL_NONAME_0to4(name) \
DO_SYSCALL(SYS_##name) ;\
bcc 1f ; \
MI_BRANCH_EXTERNAL(cerror) ; \
1:
#define SYSCALL_NONAME_5(name) \
mov ip, sp ; \
stmfd sp!, { r4-r5 } ;\
ldr r4, [ip] ; \
DO_SYSCALL(SYS_##name) ;\
ldmfd sp!, { r4-r5 } ; \
bcc 1f ; \
MI_BRANCH_EXTERNAL(cerror) ; \
1:
#define SYSCALL_NONAME_6to8(name, save_regs, arg_regs) \
mov ip, sp ; \
stmfd sp!, { save_regs } ;\
ldmia ip, { arg_regs } ; \
DO_SYSCALL(SYS_##name) ;\
ldmfd sp!, { save_regs } ; \
bcc 1f ; \
MI_BRANCH_EXTERNAL(cerror) ; \
1:
#define SYSCALL_NONAME_0(name) SYSCALL_NONAME_0to4(name)
#define SYSCALL_NONAME_1(name) SYSCALL_NONAME_0to4(name)
#define SYSCALL_NONAME_2(name) SYSCALL_NONAME_0to4(name)
#define SYSCALL_NONAME_3(name) SYSCALL_NONAME_0to4(name)
#define SYSCALL_NONAME_4(name) SYSCALL_NONAME_0to4(name)
#define SYSCALL_NONAME_6(name) SYSCALL_NONAME_6to8(name, r4-r5, r4-r5)
#define SYSCALL_NONAME_7(name) SYSCALL_NONAME_6to8(name, r4-r6 COMMA r8, r4-r6)
#define SYSCALL_NONAME(name, nargs) SYSCALL_NONAME_##nargs(name)
#define PSEUDO(pseudo, name, nargs) \
.globl _##pseudo ;\
.text ;\
.align 2 ;\
_##pseudo: ;\
SYSCALL_NONAME(name, nargs)
#undef END
#import <mach/arm/syscall_sw.h>
#if !defined(SYS___pthread_canceled)
#define SYS___pthread_markcancel 332
#define SYS___pthread_canceled 333
#define SYS___semwait_signal 334
#endif