#ifndef _MACH_ARM_SYSCALL_SW_H_
#define _MACH_ARM_SYSCALL_SW_H_
#if defined(__arm__)
#include <mach/machine/vm_param.h>
#include <architecture/arm/asm_help.h>
#define _kernel_trap_0to4(trap_name, trap_number) \
mov r12, # ## trap_number ; \
swi #SWI_SYSCALL ; \
bx lr ;
#define _kernel_trap_5(trap_name, trap_number) \
mov ip, sp ; \
stmfd sp!, { r4-r5 } ; \
ldr r4, [ ip ] ; \
mov r12, # ## trap_number ; \
swi #SWI_SYSCALL ; \
ldmfd sp!, { r4-r5 } ;\
bx lr ;
#define _kernel_trap_6to9(trap_name, trap_number, save_regs, arg_regs) \
mov ip, sp ; \
stmfd sp!, { save_regs } ; \
ldmia ip, { arg_regs } ;\
mov r12, # ## trap_number ; \
swi #SWI_SYSCALL ; \
ldmfd sp!, { save_regs } ;\
bx lr ;
#define COMMA ,
#if __BIGGEST_ALIGNMENT__ > 4
#define _kernel_trap_0(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_1(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_2(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_3(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_4(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r5, r4-r5)
#undef _kernel_trap_5
#define _kernel_trap_5(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r5, r4-r5)
#define _kernel_trap_6(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6 COMMA r8)
#define _kernel_trap_7(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6 COMMA r8)
#define _kernel_trap_8(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6 COMMA r8)
#define _kernel_trap_9(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6 COMMA r8)
#else // !(__BIGGEST_ALIGNMENT__ > 4)
#define _kernel_trap_0(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_1(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_2(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_3(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_4(trap_name, trap_number) _kernel_trap_0to4(trap_name, trap_number)
#define _kernel_trap_6(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r5, r4-r5)
#define _kernel_trap_7(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6)
#define _kernel_trap_8(trap_name, trap_number) _kernel_trap_6to9(trap_name, trap_number, r4-r6 COMMA r8, r4-r6 COMMA r8)
#define _kernel_trap_9(trap_name, trap_number) _kernel_trap_8(trap_name, trap_number)
#endif // __BIGGEST_ALIGNMENT__ > 4
#define kernel_trap(trap_name, trap_number, num_args) \
LEAF(_##trap_name, 0) \
_kernel_trap_##num_args(trap_name, trap_number)
#elif defined(__arm64__)
#include <mach/machine/vm_param.h>
#define kernel_trap(trap_name, trap_number, num_args) \
.globl _##trap_name %% \
.text %% \
.align 2 %% \
_##trap_name: %% \
mov x16, #(trap_number) %% \
svc #SWI_SYSCALL %% \
ret
#else
#error Unsupported architecture
#endif
#endif