1/* 2 * Copyright (c) 1999-2007 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 31#include "SYS.h" 32 33#if defined(__ppc__) || defined(__ppc64__) 34 35/* We use mode-independent "g" opcodes such as "srgi", and/or 36 * mode-independent macros such as MI_GET_ADDRESS. These expand 37 * into word operations when targeting __ppc__, and into doubleword 38 * operations when targeting __ppc64__. 39 */ 40#include <architecture/ppc/mode_independent_asm.h> 41 42 .globl _errno 43 44MI_ENTRY_POINT(cerror) 45 MI_PUSH_STACK_FRAME 46 MI_GET_ADDRESS(r12,_errno) 47 stw r3,0(r12) /* save syscall return code in global */ 48 MI_CALL_EXTERNAL(_cthread_set_errno_self) 49 li r3,-1 /* then bug return value */ 50 li r4,-1 /* in case we're returning a long-long in 32-bit mode, etc */ 51 MI_POP_STACK_FRAME_AND_RETURN 52 53 54 .globl _processor_facilities_used 55 .align 2 56_processor_facilities_used: 57 li r0,0x7FF3 58 sc 59 blr 60 61#elif defined(__i386__) 62 63 .globl _errno 64 65LABEL(cerror) 66 REG_TO_EXTERN(%eax, _errno) 67 mov %esp,%edx 68 andl $0xfffffff0,%esp 69 subl $16,%esp 70 movl %edx,4(%esp) 71 movl %eax,(%esp) 72 CALL_EXTERN(_cthread_set_errno_self) 73 movl 4(%esp),%esp 74 movl $-1,%eax 75 movl $-1,%edx /* in case a 64-bit value is returned */ 76 ret 77 78 .private_extern __sysenter_trap 79 ALIGN 80__sysenter_trap: 81 popl %edx 82 movl %esp, %ecx 83 sysenter 84 85#elif defined(__x86_64__) 86 87 .globl _errno 88 89LABEL(cerror) 90 REG_TO_EXTERN(%rax, _errno) 91 mov %rsp,%rdx 92 andq $-16,%rsp 93 subq $16,%rsp 94 // Preserve the original stack 95 movq %rdx,(%rsp) 96 movq %rax,%rdi 97 CALL_EXTERN(_cthread_set_errno_self) 98 // Restore the original stack 99 movq (%rsp),%rsp 100 movq $-1,%rax 101 movq $-1,%rdx /* in case a 128-bit value is returned */ 102 ret 103 104#else 105#error Unsupported architecture 106#endif 107 108#if defined(__i386__) || defined(__x86_64__) 109 110 .globl _i386_get_ldt 111 ALIGN 112_i386_get_ldt: 113 movl $6,%eax 114 MACHDEP_SYSCALL_TRAP 115 jnb 2f 116 jmp cerror 1172: ret 118 119 120 .globl _i386_set_ldt 121 ALIGN 122_i386_set_ldt: 123 movl $5,%eax 124 MACHDEP_SYSCALL_TRAP 125 jnb 2f 126 jmp cerror 1272: ret 128 129#endif 130