]> git.saurik.com Git - apple/xnu.git/blobdiff - libsyscall/custom/custom.s
xnu-3789.70.16.tar.gz
[apple/xnu.git] / libsyscall / custom / custom.s
index c18fabc0e547488cc50acba27fd6b730ebef19ec..56a95cf5b9a2147ef7817b581037494087208728 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1999-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 1999-2015 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
 
 #include "SYS.h"
 
 
 #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
 
        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
 
        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
 
        .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
 
 
 2:     ret
 
 
@@ -136,8 +109,21 @@ _i386_get_ldt:
 _i386_set_ldt:
        movl    $5,%eax
        MACHDEP_SYSCALL_TRAP
 _i386_set_ldt:
        movl    $5,%eax
        MACHDEP_SYSCALL_TRAP
-       jnb     2f
-       jmp     cerror
+       jnb             2f
+       movq    %rax, %rdi
+       jmp             _cerror
 2:     ret
 
 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
 #endif
+
+.subsections_via_symbols