xref: /csrg-svn/lib/libc/vax/sys/Ovfork.s (revision 34830)
1/*
2 * Copyright (c) 1983 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 */
17
18#if defined(SYSLIBC_SCCS) && !defined(lint)
19	.asciz "@(#)Ovfork.s	5.5 (Berkeley) 06/27/88"
20#endif /* SYSLIBC_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
41_vfork:
42	.word	0x0000
43	movl	16(fp),r2
44	movab	here,16(fp)
45	ret
46here:
47	chmk	$vfork
48	bcc	vforkok
49	jmp	verror
50vforkok:
51	tstl	r1		# child process ?
52	bneq	child	# yes
53	bcc 	parent		# if c-bit not set, fork ok
54.globl	_errno
55verror:
56	movl	r0,_errno
57	mnegl	$1,r0
58	jmp	(r2)
59child:
60	clrl	r0
61parent:
62	jmp	(r2)
63