X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..4d15aeb193b2c68f1d38666c317f8d3734f5f083:/libsyscall/custom/custom.s diff --git a/libsyscall/custom/custom.s b/libsyscall/custom/custom.s index c18fabc0e..56a95cf5b 100644 --- a/libsyscall/custom/custom.s +++ b/libsyscall/custom/custom.s @@ -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@ * @@ -30,104 +30,77 @@ #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 - - .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 @@ -136,8 +109,21 @@ _i386_get_ldt: _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