1/* 2 * Copyright (c) 1999-2011 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved. 29 * 30 * File: SYS.h 31 * 32 * Definition of the user side of the UNIX system call interface 33 * for M98K. 34 * 35 * Errors are flagged by the location of the trap return (ie., which 36 * instruction is executed upon rfi): 37 * 38 * SC PC + 4: Error (typically branch to cerror()) 39 * SC PC + 8: Success 40 * 41 * HISTORY 42 * 18-Nov-92 Ben Fathi (benf@next.com) 43 * Ported to m98k. 44 * 45 * 9-Jan-92 Peter King (king@next.com) 46 * Created. 47 */ 48 49#include <sys/syscall.h> 50 51/* Binary compatibility stubs for syscalls that no longer exist */ 52 53#ifndef SYS_setquota 54#define SYS_setquota 148 55#endif 56#ifndef SYS_quota 57#define SYS_quota 149 58#endif 59 60#if defined(__i386__) 61 62#include <architecture/i386/asm_help.h> 63#include <mach/i386/syscall_sw.h> 64 65/* 66 * We have two entry points. int's is used for syscalls which need to preserve 67 * %ecx across the call, or return a 64-bit value in %eax:%edx. sysenter is used 68 * for the majority of syscalls which just return a value in %eax. 69 */ 70 71#define UNIX_SYSCALL_SYSENTER call __sysenter_trap 72#define UNIX_SYSCALL(name, nargs) \ 73 .globl tramp_cerror ;\ 74LEAF(_##name, 0) ;\ 75 movl $ SYS_##name, %eax ;\ 76 UNIX_SYSCALL_SYSENTER ;\ 77 jnb 2f ;\ 78 BRANCH_EXTERN(tramp_cerror) ;\ 792: 80 81#define UNIX_SYSCALL_INT(name, nargs) \ 82 .globl tramp_cerror ;\ 83LEAF(_##name, 0) ;\ 84 movl $ SYS_##name, %eax ;\ 85 UNIX_SYSCALL_TRAP ;\ 86 jnb 2f ;\ 87 BRANCH_EXTERN(tramp_cerror) ;\ 882: 89 90#if defined(__SYSCALL_32BIT_ARG_BYTES) && ((__SYSCALL_32BIT_ARG_BYTES >= 4) && (__SYSCALL_32BIT_ARG_BYTES <= 20)) 91#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ 92 movl $(SYS_##name | (__SYSCALL_32BIT_ARG_BYTES << I386_SYSCALL_ARG_BYTES_SHIFT)), %eax ;\ 93 UNIX_SYSCALL_SYSENTER ;\ 94 jnb 2f ;\ 95 BRANCH_EXTERN(tramp_##cerror) ;\ 962: 97#else /* __SYSCALL_32BIT_ARG_BYTES < 4 || > 20 */ 98#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ 99 movl $ SYS_##name, %eax ;\ 100 UNIX_SYSCALL_SYSENTER ;\ 101 jnb 2f ;\ 102 BRANCH_EXTERN(tramp_##cerror) ;\ 1032: 104#endif 105 106#define UNIX_SYSCALL_INT_NONAME(name, nargs) \ 107 .globl tramp_cerror_nocancel ;\ 108 movl $ SYS_##name, %eax ;\ 109 UNIX_SYSCALL_TRAP ;\ 110 jnb 2f ;\ 111 BRANCH_EXTERN(tramp_cerror_nocancel) ;\ 1122: 113 114#define PSEUDO(pseudo, name, nargs, cerror) \ 115LEAF(pseudo, 0) ;\ 116 UNIX_SYSCALL_NONAME(name, nargs, cerror) 117 118#define PSEUDO_INT(pseudo, name, nargs) \ 119LEAF(pseudo, 0) ;\ 120 UNIX_SYSCALL_INT_NONAME(name, nargs) 121 122#define __SYSCALL2(pseudo, name, nargs, cerror) \ 123 PSEUDO(pseudo, name, nargs, cerror) ;\ 124 ret 125 126#define __SYSCALL(pseudo, name, nargs) \ 127 PSEUDO(pseudo, name, nargs, cerror) ;\ 128 ret 129 130#define __SYSCALL_INT(pseudo, name, nargs) \ 131 PSEUDO_INT(pseudo, name, nargs) ;\ 132 ret 133 134#elif defined(__x86_64__) 135 136#include <architecture/i386/asm_help.h> 137#include <mach/i386/syscall_sw.h> 138 139#define UNIX_SYSCALL_SYSCALL \ 140 movq %rcx, %r10 ;\ 141 syscall 142 143#define UNIX_SYSCALL(name, nargs) \ 144 .globl cerror ;\ 145LEAF(_##name, 0) ;\ 146 movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\ 147 UNIX_SYSCALL_SYSCALL ;\ 148 jnb 2f ;\ 149 movq %rax, %rdi ;\ 150 BRANCH_EXTERN(_cerror) ;\ 1512: 152 153#define UNIX_SYSCALL_NONAME(name, nargs, cerror) \ 154 .globl cerror ;\ 155 movl $ SYSCALL_CONSTRUCT_UNIX(SYS_##name), %eax ;\ 156 UNIX_SYSCALL_SYSCALL ;\ 157 jnb 2f ;\ 158 movq %rax, %rdi ;\ 159 BRANCH_EXTERN(_##cerror) ;\ 1602: 161 162#define PSEUDO(pseudo, name, nargs, cerror) \ 163LEAF(pseudo, 0) ;\ 164 UNIX_SYSCALL_NONAME(name, nargs, cerror) 165 166#define __SYSCALL2(pseudo, name, nargs, cerror) \ 167 PSEUDO(pseudo, name, nargs, cerror) ;\ 168 ret 169 170#define __SYSCALL(pseudo, name, nargs) \ 171 PSEUDO(pseudo, name, nargs, cerror) ;\ 172 ret 173 174#else 175#error Unsupported architecture 176#endif 177 178