X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..143464d58d2bd6378e74eec636961ceb0d32fb91:/libsyscall/custom/SYS.h diff --git a/libsyscall/custom/SYS.h b/libsyscall/custom/SYS.h index 3f95dbbaf..46e3735d9 100644 --- a/libsyscall/custom/SYS.h +++ b/libsyscall/custom/SYS.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2007 Apple Inc. All rights reserved. + * Copyright (c) 1999-2011 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -48,6 +48,8 @@ #include +/* Binary compatibility stubs for syscalls that no longer exist */ + #ifndef SYS_setquota #define SYS_setquota 148 #endif @@ -55,60 +57,7 @@ #define SYS_quota 149 #endif -#if defined(__ppc__) || defined(__ppc64__) - -#include - -/* From rhapsody kernel mach/ppc/syscall_sw.h */ -#define kernel_trap_args_0 -#define kernel_trap_args_1 -#define kernel_trap_args_2 -#define kernel_trap_args_3 -#define kernel_trap_args_4 -#define kernel_trap_args_5 -#define kernel_trap_args_6 -#define kernel_trap_args_7 -#define kernel_trap_args_8 -/* End of rhapsody kernel mach/ppc/syscall_sw.h */ - -/* - * Macros. - */ - -#define SYSCALL(name, nargs) \ - .globl cerror @\ - MI_ENTRY_POINT(_##name) @\ - kernel_trap_args_##nargs @\ - li r0,SYS_##name @\ - sc @\ - b 1f @\ - blr @\ -1: MI_BRANCH_EXTERNAL(cerror) - - -#define SYSCALL_NONAME(name, nargs) \ - .globl cerror @\ - kernel_trap_args_##nargs @\ - 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__) +#if defined(__i386__) #include #include @@ -121,58 +70,61 @@ _##pseudo: @\ #define UNIX_SYSCALL_SYSENTER call __sysenter_trap #define UNIX_SYSCALL(name, nargs) \ - .globl cerror ;\ + .globl tramp_cerror ;\ LEAF(_##name, 0) ;\ movl $ SYS_##name, %eax ;\ UNIX_SYSCALL_SYSENTER ;\ jnb 2f ;\ - BRANCH_EXTERN(cerror) ;\ + BRANCH_EXTERN(tramp_cerror) ;\ 2: #define UNIX_SYSCALL_INT(name, nargs) \ - .globl cerror ;\ + .globl tramp_cerror ;\ LEAF(_##name, 0) ;\ movl $ SYS_##name, %eax ;\ UNIX_SYSCALL_TRAP ;\ jnb 2f ;\ - BRANCH_EXTERN(cerror) ;\ + BRANCH_EXTERN(tramp_cerror) ;\ 2: -#if defined(__SYSCALL_I386_ARG_BYTES) && ((__SYSCALL_I386_ARG_BYTES >= 4) && (__SYSCALL_I386_ARG_BYTES <= 20)) -#define UNIX_SYSCALL_NONAME(name, nargs) \ - movl $(SYS_##name | (__SYSCALL_I386_ARG_BYTES << I386_SYSCALL_ARG_BYTES_SHIFT)), %eax ;\ +#if defined(__SYSCALL_32BIT_ARG_BYTES) && ((__SYSCALL_32BIT_ARG_BYTES >= 4) && (__SYSCALL_32BIT_ARG_BYTES <= 20)) +#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ + movl $(SYS_##name | (__SYSCALL_32BIT_ARG_BYTES << I386_SYSCALL_ARG_BYTES_SHIFT)), %eax ;\ UNIX_SYSCALL_SYSENTER ;\ jnb 2f ;\ - BRANCH_EXTERN(cerror) ;\ + BRANCH_EXTERN(tramp_##cerror) ;\ 2: -#else /* __SYSCALL_I386_ARG_BYTES < 4 || > 20 */ -#define UNIX_SYSCALL_NONAME(name, nargs) \ - .globl cerror ;\ +#else /* __SYSCALL_32BIT_ARG_BYTES < 4 || > 20 */ +#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ movl $ SYS_##name, %eax ;\ UNIX_SYSCALL_SYSENTER ;\ jnb 2f ;\ - BRANCH_EXTERN(cerror) ;\ + BRANCH_EXTERN(tramp_##cerror) ;\ 2: #endif #define UNIX_SYSCALL_INT_NONAME(name, nargs) \ - .globl cerror ;\ + .globl tramp_cerror_nocancel ;\ movl $ SYS_##name, %eax ;\ UNIX_SYSCALL_TRAP ;\ jnb 2f ;\ - BRANCH_EXTERN(cerror) ;\ + BRANCH_EXTERN(tramp_cerror_nocancel) ;\ 2: -#define PSEUDO(pseudo, name, nargs) \ -LEAF(_##pseudo, 0) ;\ - UNIX_SYSCALL_NONAME(name, nargs) +#define PSEUDO(pseudo, name, nargs, cerror) \ +LEAF(pseudo, 0) ;\ + UNIX_SYSCALL_NONAME(name, nargs, cerror) -#define PSEUDO_INT(pseudo, name, nargs) \ -LEAF(_##pseudo, 0) ;\ +#define PSEUDO_INT(pseudo, name, nargs) \ +LEAF(pseudo, 0) ;\ UNIX_SYSCALL_INT_NONAME(name, nargs) +#define __SYSCALL2(pseudo, name, nargs, cerror) \ + PSEUDO(pseudo, name, nargs, cerror) ;\ + ret + #define __SYSCALL(pseudo, name, nargs) \ - PSEUDO(pseudo, name, nargs) ;\ + PSEUDO(pseudo, name, nargs, cerror) ;\ ret #define __SYSCALL_INT(pseudo, name, nargs) \ @@ -188,208 +140,38 @@ LEAF(_##pseudo, 0) ;\ 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) ;\ +#define UNIX_SYSCALL(name, nargs) \ + .globl cerror ;\ +LEAF(_##name, 0) ;\ + movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\ + UNIX_SYSCALL_SYSCALL ;\ + jnb 2f ;\ + movq %rax, %rdi ;\ + 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) ;\ +#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ + .globl cerror ;\ + movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\ + UNIX_SYSCALL_SYSCALL ;\ + jnb 2f ;\ + movq %rax, %rdi ;\ + BRANCH_EXTERN(_##cerror) ;\ 2: -#define PSEUDO(pseudo, name, nargs) \ -LEAF(_##pseudo, 0) ;\ - UNIX_SYSCALL_NONAME(name, nargs) +#define PSEUDO(pseudo, name, nargs, cerror) \ +LEAF(pseudo, 0) ;\ + UNIX_SYSCALL_NONAME(name, nargs, cerror) -#define __SYSCALL(pseudo, name, nargs) \ - PSEUDO(pseudo, name, nargs) ;\ +#define __SYSCALL2(pseudo, name, nargs, cerror) \ + PSEUDO(pseudo, name, nargs, cerror) ;\ ret -#elif defined(__arm__) - -#define SWI_SYSCALL 0x80 // from - -/* - * ARM system call interface: - * - * swi 0x80 - * args: r0-r6 - * return code: r0 - * on error, carry bit is set in the psr, otherwise carry bit is cleared. - */ - -/* - * Macros. - */ - -/* - * until we update the architecture project, these live here - */ - -#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: - -/* load the syscall number into r12 and trap */ -#define DO_SYSCALL(num) \ - .if (((num) & 0xff) == (num)) ;\ - mov r12, #(num) ;\ - .elseif (((num) & 0x3fc) == (num)) ;\ - mov r12, #(num) ;\ - .else ;\ - mov r12, #((num) & 0xffffff00) /* top half of the syscall number */ ;\ - orr r12, r12, #((num) & 0xff) /* bottom half */ ;\ - .endif ;\ - swi #SWI_SYSCALL - -/* simple syscalls (0 to 4 args) */ -#define SYSCALL_0to4(name) \ - MI_ENTRY_POINT(_##name) ;\ - DO_SYSCALL(SYS_##name) ;\ - bxcc lr /* return if carry is clear (no error) */ ; \ -1: MI_BRANCH_EXTERNAL(cerror) - -/* syscalls with 5 args is different, because of the single arg register load */ -#define SYSCALL_5(name) \ - MI_ENTRY_POINT(_##name) ;\ - mov ip, sp /* save a pointer to the args */ ; \ - stmfd sp!, { r4-r5 } /* save r4-r5 */ ;\ - ldr r4, [ip] /* load 5th arg */ ; \ - DO_SYSCALL(SYS_##name) ;\ - ldmfd sp!, { r4-r5 } /* restore r4-r5 */ ; \ - bxcc lr /* return if carry is clear (no error) */ ; \ -1: MI_BRANCH_EXTERNAL(cerror) - -/* syscalls with 6 to 8 args */ -#define SYSCALL_6to8(name, save_regs, arg_regs) \ - MI_ENTRY_POINT(_##name) ;\ - mov ip, sp /* save a pointer to the args */ ; \ - stmfd sp!, { save_regs } /* callee saved regs */ ;\ - ldmia ip, { arg_regs } /* load arg regs */ ; \ - DO_SYSCALL(SYS_##name) ;\ - ldmfd sp!, { save_regs } /* restore callee saved regs */ ; \ - bxcc lr /* return if carry is clear (no error) */ ; \ -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) -/* SYSCALL_5 declared above */ -#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_8(name) SYSCALL_6to8(name, r4-r6 COMMA r8, r4-r6 COMMA r8) - -/* select the appropriate syscall code, based on the number of arguments */ -#define SYSCALL(name, nargs) SYSCALL_##nargs(name) - -#define SYSCALL_NONAME_0to4(name) \ - DO_SYSCALL(SYS_##name) ;\ - bcc 1f /* branch if carry bit is clear (no error) */ ; \ - MI_BRANCH_EXTERNAL(cerror) /* call cerror */ ; \ -1: - -#define SYSCALL_NONAME_5(name) \ - mov ip, sp /* save a pointer to the args */ ; \ - stmfd sp!, { r4-r5 } /* save r4-r5 */ ;\ - ldr r4, [ip] /* load 5th arg */ ; \ - DO_SYSCALL(SYS_##name) ;\ - ldmfd sp!, { r4-r5 } /* restore r4-r7 */ ; \ - bcc 1f /* branch if carry bit is clear (no error) */ ; \ - MI_BRANCH_EXTERNAL(cerror) /* call cerror */ ; \ -1: - -#define SYSCALL_NONAME_6to8(name, save_regs, arg_regs) \ - mov ip, sp /* save a pointer to the args */ ; \ - stmfd sp!, { save_regs } /* callee save regs */ ;\ - ldmia ip, { arg_regs } /* load arguments */ ; \ - DO_SYSCALL(SYS_##name) ;\ - ldmfd sp!, { save_regs } /* restore callee saved regs */ ; \ - bcc 1f /* branch if carry bit is clear (no error) */ ; \ - MI_BRANCH_EXTERNAL(cerror) /* call 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) -/* SYSCALL_NONAME_5 declared above */ -#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_8(name) SYSCALL_NONAME_6to8(name, r4-r6 COMMA r8, r4-r6 COMMA r8) - -/* select the appropriate syscall code, based on the number of arguments */ -#define SYSCALL_NONAME(name, nargs) SYSCALL_NONAME_##nargs(name) - -#define PSEUDO(pseudo, name, nargs) \ - .globl _##pseudo ;\ - .text ;\ - .align 2 ;\ -_##pseudo: ;\ - SYSCALL_NONAME(name, nargs) - -#define __SYSCALL(pseudo, name, nargs) \ - PSEUDO(pseudo, name, nargs) ;\ - bx lr +#define __SYSCALL(pseudo, name, nargs) \ + PSEUDO(pseudo, name, nargs, cerror) ;\ + ret #else #error Unsupported architecture #endif +