[PATCH] getpid/vfork/raise fix
Andreas Schwab
schwab@suse.de
Wed Mar 10 14:33:00 GMT 2004
Jakub Jelinek <jakub@redhat.com> writes:
> Can you use a local register for saving oldval accross the syscall though?
> Registers in the register window can be saved to the backing store, if that
> happens, vfork child restores it from the backing store, calls some routine
> and something else is stored into that location in backing store, vfork
> parent will afterwards restore a different value.
I think you are right.
> IMHO only a call clobbered register preserved accross system call can be
> used, and is it is not available, vfork has to choose a slower way:
>
> int oldval = self->pid;
> int newval = oldval ? -oldval : 0x80000000;
> self->pid = newval;
> vfork syscall
> newval = self->pid;
> oldval = (newval & 0x7fffffff) ? -newval : 0;
> self->pid = oldval;
That doesn't seem to work, though. I'm getting p3 != p4 in the posix
vfork tests. Or do you see any error in my implementation?
ENTRY(__vfork)
alloc r2=ar.pfs,0,0,2,0
adds r14=PID,r13
;;
ld4 r16=[r14]
;;
sub r15=0,r16
cmp.eq p0,p6=0,r16
;;
(p6) movl r15=0x80000000
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
mov out1=0 /* Standard sp value. */
;;
st4 [r14]=r15
DO_CALL_VIA_BREAK (SYS_ify (clone))
cmp.eq p6,p0=0,r8
adds r14=PID,r13
(p6) br.cond.dptk 1f
;;
ld4 r15=[r14]
;;
extr.u r16=r15,0,31
;;
cmp.eq p0,p6=0,r16
;;
(p6) sub r16=0,r15
;;
st4 [r14]=r16
1:
cmp.eq p6,p0=-1,r10
(p6) br.cond.spnt.few __syscall_error
ret
PSEUDO_END(__vfork)
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, MaxfeldstraÃe 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
More information about the Libc-hacker
mailing list