X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/36401178fd6817c043cc00b0c00c7f723e58efae..7ee9d059c4eecf68ae4f8b0fb99ae2471eda79af:/libsyscall/custom/__vfork.s diff --git a/libsyscall/custom/__vfork.s b/libsyscall/custom/__vfork.s index dc201e852..91408f9c3 100644 --- a/libsyscall/custom/__vfork.s +++ b/libsyscall/custom/__vfork.s @@ -37,56 +37,7 @@ #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 - -/* In vfork(), the child runs in parent's address space. */ - - -MI_ENTRY_POINT(___vfork) - MI_GET_ADDRESS(r5,__current_pid) // get address of __current_pid in r5 -2: - lwarx r6,0,r5 // don't cache pid across vfork - cmpwi r6,0 - ble-- 3f // is another vfork in progress - li r6,0 // if not, erase the stored pid -3: - addi r6,r6,-1 // count the parallel vforks in - stwcx. r6,0,r5 // negative cached pid values - bne-- 2b - - li r0,SYS_vfork - sc - b Lbotch // error return - - cmpwi r4,0 - beq Lparent // parent, since a1 == 0 in parent, - - li r3,0 // child - blr - -Lparent: // r3 == child's pid - lwarx r6,0,r5 // we're back, decrement vfork count - addi r6,r6,1 - stwcx. r6,0,r5 - bne-- Lparent - blr // return pid - -Lbotch: - lwarx r6,0,r5 // never went, decrement vfork count - addi r6,r6,1 - stwcx. r6,0,r5 - bne-- Lbotch - - MI_BRANCH_EXTERNAL(cerror) - -#elif defined(__i386__) +#if defined(__i386__) #if defined(__DYNAMIC__) #define GET_CURRENT_PID PICIFY(__current_pid) @@ -158,6 +109,7 @@ LEAF(___vfork, 0) movq $ SYSCALL_CONSTRUCT_UNIX(SYS_vfork), %rax // code for vfork -> rax UNIX_SYSCALL_TRAP // do the system call jnb L1 // jump if CF==0 + pushq %rdi // put return address back on stack for cerror movq __current_pid@GOTPCREL(%rip), %rcx lock addq $1, (%rcx)