/*
- * Copyright (c) 1999-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 1999-2015 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include "SYS.h"
-#if defined(__ppc__) || defined(__ppc64__)
+#if defined(__i386__)
-/* 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__.
+/*
+ * i386 needs custom assembly to transform the return from syscalls
+ * into a proper stack for a function call out to cerror{,_nocancel}.
*/
-#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__)
-
- .globl _errno
-
-LABEL(cerror)
- REG_TO_EXTERN(%eax, _errno)
- mov %esp,%edx
- andl $0xfffffff0,%esp
- subl $16,%esp
- movl %edx,4(%esp)
- movl %eax,(%esp)
- CALL_EXTERN(_cthread_set_errno_self)
- movl 4(%esp),%esp
- movl $-1,%eax
- movl $-1,%edx /* in case a 64-bit value is returned */
+
+LABEL(tramp_cerror)
+ mov %esp, %edx
+ andl $0xfffffff0, %esp
+ subl $16, %esp
+ movl %edx, 4(%esp)
+ movl %eax, (%esp)
+ CALL_EXTERN(_cerror)
+ movl 4(%esp), %esp
ret
- .private_extern __sysenter_trap
- ALIGN
-__sysenter_trap:
+LABEL(tramp_cerror_nocancel)
+ mov %esp, %edx
+ andl $0xfffffff0, %esp
+ subl $16, %esp
+ movl %edx, 4(%esp)
+ movl %eax, (%esp)
+ CALL_EXTERN(_cerror_nocancel)
+ movl 4(%esp), %esp
+ ret
+
+LABEL(__sysenter_trap)
popl %edx
movl %esp, %ecx
sysenter
-#elif defined(__x86_64__)
-
- .globl _errno
-
-LABEL(cerror)
- REG_TO_EXTERN(%rax, _errno)
- mov %rsp,%rdx
- andq $-16,%rsp
- subq $16,%rsp
- // Preserve the original stack
- movq %rdx,(%rsp)
- movq %rax,%rdi
- CALL_EXTERN(_cthread_set_errno_self)
- // Restore the original stack
- movq (%rsp),%rsp
- movq $-1,%rax
- movq $-1,%rdx /* in case a 128-bit value is returned */
- ret
-
-#elif defined(__arm__)
+ .globl _i386_get_ldt
+ ALIGN
+_i386_get_ldt:
+ movl $6,%eax
+ MACHDEP_SYSCALL_TRAP
+ jnb 2f
+ jmp tramp_cerror
+2: ret
- .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}
+ .globl _i386_set_ldt
+ ALIGN
+_i386_set_ldt:
+ movl $5,%eax
+ MACHDEP_SYSCALL_TRAP
+ jnb 2f
+ jmp tramp_cerror
+2: ret
-#else
-#error Unsupported architecture
-#endif
+ ALIGN
+ .globl __thread_set_tsd_base
+__thread_set_tsd_base:
+ pushl 4(%esp)
+ pushl $0
+ movl $3,%eax
+ MACHDEP_SYSCALL_TRAP
+ addl $8,%esp
+ ret
-#if defined(__i386__) || defined(__x86_64__)
+#elif defined(__x86_64__)
.globl _i386_get_ldt
ALIGN
_i386_get_ldt:
movl $6,%eax
MACHDEP_SYSCALL_TRAP
- jnb 2f
- jmp cerror
+ jnb 2f
+ movq %rax, %rdi
+ jmp _cerror
2: ret
_i386_set_ldt:
movl $5,%eax
MACHDEP_SYSCALL_TRAP
- jnb 2f
- jmp cerror
+ jnb 2f
+ movq %rax, %rdi
+ jmp _cerror
2: ret
+ ALIGN
+ .globl __thread_set_tsd_base
+__thread_set_tsd_base:
+ movl $0, %esi // 0 as the second argument
+ movl $ SYSCALL_CONSTRUCT_MDEP(3), %eax // Machine-dependent syscall number 3
+ MACHDEP_SYSCALL_TRAP
+ ret
+
+#else
+#error unknown architecture
#endif
+
+.subsections_via_symbols