#include <sys/syscall.h>
#ifndef SYS_setquota
#define SYS_setquota 148
#endif
#ifndef SYS_quota
#define SYS_quota 149
#endif
#if defined(__ppc__) || defined(__ppc64__)
#include <architecture/ppc/mode_independent_asm.h>
#define SYSCALL(name, nargs) \
.globl cerror @\
MI_ENTRY_POINT(_##name) @\
li r0,SYS_##name @\
sc @\
b 1f @\
blr @\
1: MI_BRANCH_EXTERNAL(cerror)
#define SYSCALL_NONAME(name, nargs) \
.globl cerror @\
li r0,SYS_##name @\
sc @\
b 1f @\
b 2f @\
1: MI_BRANCH_EXTERNAL(cerror) @\
2:
#define PSEUDO(pseudo, name, nargs) \
.private_extern _##pseudo @\
.text @\
.align 2 @\
_##pseudo: @\
SYSCALL_NONAME(name, nargs)
#define __SYSCALL(pseudo, name, nargs) \
PSEUDO(pseudo, name, nargs) @\
blr
#elif defined(__i386__)
#include <architecture/i386/asm_help.h>
#include <mach/i386/syscall_sw.h>
#define UNIX_SYSCALL_SYSENTER call __sysenter_trap
#define UNIX_SYSCALL(name, nargs) \
.globl cerror ;\
LEAF(_##name, 0) ;\
movl $ SYS_##name, %eax ;\
UNIX_SYSCALL_SYSENTER ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#define UNIX_SYSCALL_INT(name, nargs) \
.globl cerror ;\
LEAF(_##name, 0) ;\
movl $ SYS_##name, %eax ;\
UNIX_SYSCALL_TRAP ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#if defined(__SYSCALL_32BIT_ARG_BYTES) && ((__SYSCALL_32BIT_ARG_BYTES >= 4) && (__SYSCALL_32BIT_ARG_BYTES <= 20))
#define UNIX_SYSCALL_NONAME(name, nargs) \
movl $(SYS_##name | (__SYSCALL_32BIT_ARG_BYTES << I386_SYSCALL_ARG_BYTES_SHIFT)), %eax ;\
UNIX_SYSCALL_SYSENTER ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#else
#define UNIX_SYSCALL_NONAME(name, nargs) \
.globl cerror ;\
movl $ SYS_##name, %eax ;\
UNIX_SYSCALL_SYSENTER ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#endif
#define UNIX_SYSCALL_INT_NONAME(name, nargs) \
.globl cerror ;\
movl $ SYS_##name, %eax ;\
UNIX_SYSCALL_TRAP ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#define PSEUDO(pseudo, name, nargs) \
LEAF(_##pseudo, 0) ;\
UNIX_SYSCALL_NONAME(name, nargs)
#define PSEUDO_INT(pseudo, name, nargs) \
LEAF(_##pseudo, 0) ;\
UNIX_SYSCALL_INT_NONAME(name, nargs)
#define __SYSCALL(pseudo, name, nargs) \
PSEUDO(pseudo, name, nargs) ;\
ret
#define __SYSCALL_INT(pseudo, name, nargs) \
PSEUDO_INT(pseudo, name, nargs) ;\
ret
#elif defined(__x86_64__)
#include <architecture/i386/asm_help.h>
#include <mach/i386/syscall_sw.h>
#define UNIX_SYSCALL_SYSCALL \
movq %rcx, %r10 ;\
syscall
#define UNIX_SYSCALL(name, nargs) \
.globl cerror ;\
LEAF(_##name, 0) ;\
movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\
UNIX_SYSCALL_SYSCALL ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#define UNIX_SYSCALL_NONAME(name, nargs) \
.globl cerror ;\
movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\
UNIX_SYSCALL_SYSCALL ;\
jnb 2f ;\
BRANCH_EXTERN(cerror) ;\
2:
#define PSEUDO(pseudo, name, nargs) \
LEAF(_##pseudo, 0) ;\
UNIX_SYSCALL_NONAME(name, nargs)
#define __SYSCALL(pseudo, name, nargs) \
PSEUDO(pseudo, name, nargs) ;\
ret
#else
#error Unsupported architecture
#endif