X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..13f56ec4e58bf8687e2a68032c093c0213dd519b:/libsyscall/custom/__getpid.s?ds=sidebyside diff --git a/libsyscall/custom/__getpid.s b/libsyscall/custom/__getpid.s index a6cc5a5f4..48c85313c 100644 --- a/libsyscall/custom/__getpid.s +++ b/libsyscall/custom/__getpid.s @@ -28,45 +28,7 @@ #include "SYS.h" -#if defined(__ppc__) || defined(__ppc64__) - - .data - .globl __current_pid - .align 2 -__current_pid: - .long 0 - -MI_ENTRY_POINT(___getpid) -#if defined(__DYNAMIC__) - mflr r0 // note we cannot use MI_GET_ADDRESS... - bcl 20,31,1f // ...because we define __current_pid -1: - mflr r5 - mtlr r0 - addis r5, r5, ha16(__current_pid - 1b) - addi r5, r5, lo16(__current_pid - 1b) -#else - lis r5,hi16(__current_pid) - ori r5,r5,lo16(__current_pid) -#endif - lwz r3,0(r5) // get the cached pid - cmpwi r3,0 // if positive, - bgtlr++ // return it - - SYSCALL_NONAME(getpid, 0) - - lwarx r4,0,r5 // see if we can cache it - cmpwi r4,0 // we can't if there are any... - blt-- 1f // ...vforks in progress - - stwcx. r3,0,r5 // ignore cache conflicts - blr -1: - li r6,-4 // on 970, cancel the reservation using red zone... - stwcx. r3,r6,r1 // ...to avoid an errata - blr - -#elif defined(__i386__) +#if defined(__i386__) .data .private_extern __current_pid @@ -135,51 +97,6 @@ LEAF(___getpid, 0) movl %edx, %eax ret -#elif defined(__arm__) - -#include - - .data - .globl __current_pid - .align 2 -__current_pid: - /* Cached pid. Possible values: - * 0: no value cached - * > 0: cached PID of current process - * < 0: negative number of vforks in progress - * INT_MIN: for pre-ARMv6, "looking" value (0x80000000) - */ - .long 0 - -MI_ENTRY_POINT(_getpid) - ldr r3, L__current_pid -L1: add r3, pc, r3 // r3 = &__current_pid - ldr r0, [r3] // get the cached pid - cmp r0, #0 - bxgt lr // if positive, return it - - SYSCALL_NONAME(getpid, 0) - -#ifdef _ARM_ARCH_6 - ldrex r2, [r3] // see if we can cache it - cmp r2, #0 // we can't if there are any... - bxlt lr // ...vforks in progress - strex r2, r0, [r3] // ignore conflicts -#else - mov r1, #0x80000000 // load "looking" value - swp r2, r1, [r3] // look at the value, lock others out - cmp r2, r1 // anyone else trying to look? - bxeq lr // yes, so return immediately/ - cmp r2, #0 // see if we can cache it - streq r0, [r3] // if zero, we can - strne r2, [r3] // otherwise restore previous value -#endif - - bx lr - -L__current_pid: - .long __current_pid - (L1+8) - #else #error Unsupported architecture #endif