/*
- * Copyright (c) 1999-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 1999-2011 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include "SYS.h"
-#if defined(__ppc__) || defined(__ppc64__)
-
-/* We use mode-independent "g" opcodes such as "srgi", and/or
- * mode-independent macros such as MI_GET_ADDRESS. These expand
- * into word operations when targeting __ppc__, and into doubleword
- * operations when targeting __ppc64__.
- */
-#include <architecture/ppc/mode_independent_asm.h>
-
- .globl _errno
-
-MI_ENTRY_POINT(cerror)
- MI_PUSH_STACK_FRAME
- MI_GET_ADDRESS(r12,_errno)
- stw r3,0(r12) /* save syscall return code in global */
- MI_CALL_EXTERNAL(_cthread_set_errno_self)
- li r3,-1 /* then bug return value */
- li r4,-1 /* in case we're returning a long-long in 32-bit mode, etc */
- MI_POP_STACK_FRAME_AND_RETURN
-
-
- .globl _processor_facilities_used
- .align 2
-_processor_facilities_used:
- li r0,0x7FF3
- sc
- blr
-
-#elif defined(__i386__)
+#if defined(__i386__)
.globl _errno
LABEL(cerror)
- REG_TO_EXTERN(%eax, _errno)
+ movl $0,%ecx
+ jmp 1f
+LABEL(cerror_nocancel)
+ movl $1,%ecx
+1: REG_TO_EXTERN(%eax, _errno)
mov %esp,%edx
andl $0xfffffff0,%esp
subl $16,%esp
- movl %edx,4(%esp)
+ movl %edx,8(%esp)
+ movl %ecx,4(%esp)
movl %eax,(%esp)
CALL_EXTERN(_cthread_set_errno_self)
- movl 4(%esp),%esp
+ movl 8(%esp),%esp
movl $-1,%eax
movl $-1,%edx /* in case a 64-bit value is returned */
ret
- .private_extern __sysenter_trap
- ALIGN
-__sysenter_trap:
+LABEL(__sysenter_trap)
popl %edx
movl %esp, %ecx
sysenter
.globl _errno
LABEL(cerror)
- REG_TO_EXTERN(%rax, _errno)
- mov %rsp,%rdx
+ /* cancelable syscall, for arg1 to _cthread_set_errno_self */
+ movq $0,%rsi
+ jmp 1f
+LABEL(cerror_nocancel)
+ /* non-cancelable, see above. */
+ movq $1,%rsi
+1: PICIFY(_errno) /* address -> %r11 */
+ movl %eax,(%r11)
+ mov %rsp,%rdx
andq $-16,%rsp
subq $16,%rsp
// Preserve the original stack
movq $-1,%rdx /* in case a 128-bit value is returned */
ret
-#elif defined(__arm__)
-
- .globl _errno
-
-MI_ENTRY_POINT(cerror)
- stmfd sp!, {r7, lr}
- mov r7, sp
- MI_GET_ADDRESS(r3,_errno)
- str r0, [r3]
- MI_CALL_EXTERNAL(_cthread_set_errno_self)
- mov r0, #-1
- mov r1, #-1
- ldmfd sp!, {r7, pc}
-
#else
#error Unsupported architecture
#endif