1 /* 2 * Copyright (c) 1983 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #if defined(LIBC_SCCS) && !defined(lint) 19 .asciz "@(#)Ovfork.c 5.1 (Berkeley) 04/12/91" 20 #endif /* LIBC_SCCS and not lint */ 21 22 /* 23 * @(#)vfork.s 4.1 (Berkeley) 12/21/80 24 * C library -- vfork 25 */ 26 27 /* 28 * pid = vfork(); 29 * 30 * r1 == 0 in parent process, r1 == 1 in child process. 31 * r0 == pid of child in parent, r0 == pid of parent in child. 32 * 33 * trickery here, due to keith sklower, uses ret to clear the stack, 34 * and then returns with a jump indirect, since only one person can return 35 * with a ret off this stack... we do the ret before we vfork! 36 */ 37 38 .set vfork,66 39 .globl _vfork 40 .globl mypid, myppid 41 42 _vfork: 43 .word 0x0000 44 movl 16(fp),r2 45 movab here,16(fp) 46 ret 47 here: 48 chmk $vfork 49 bcc vforkok 50 jmp verror 51 vforkok: 52 tstl r1 # child process ? 53 bneq child # yes 54 bcc parent # if c-bit not set, fork ok 55 .globl _errno 56 verror: 57 movl r0,_errno 58 mnegl $1,r0 59 jmp (r2) 60 child: 61 movl r0,myppid 62 clrl r0 63 clrl mypid 64 parent: 65 jmp (r2) 66