xref: /netbsd/lib/libc/arch/hppa/sys/__vfork14.S (revision 10ce020d)
1/*	$NetBSD: __vfork14.S,v 1.10 2020/05/09 08:25:33 skrll Exp $	*/
2
3/*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matt Fredette.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <sys/errno.h>
33#include "SYS.h"
34
35ENTRY(__vfork14, 0)
36	/*
37	 * NB: __vfork14 is a tricky syscall.  We can't save
38	 * any values on the stack, because the stack will be
39	 * trashed by the child, leaving garbage for when the
40	 * parent returns.
41	 *
42	 * So we must save values in registers, specifically,
43	 * registers that the kernel is willing to preserve
44	 * across the syscall.  Normally, this would be callee-
45	 * saved registers, with the kernel being the callee,
46	 * but the problem is that we, too, are a callee, and
47	 * would have to save that very same register somewhere,
48	 * because *our* caller is counting on us to do so.
49	 *
50	 * What we need is a normally caller-saved register,
51	 * that the kernel is willing to save for us.  The
52	 * syscall entry code in locore.S has been modified
53	 * to do just this for the t4 register.
54	 */
55	copy	%rp, %t4
56	ldil	L%SYSCALLGATE, %r1
57	ble	4(%sr2, %r1)
58	 ldi	SYS___vfork14, %t1
59	comb,=,n %r0, %t1, 1f
60	b	__cerror
611:
62	 copy	%t4, %rp		// delay slot of branch to __cerror
63	addi	-1, %ret1, %ret1
64	bv	%r0(%rp)
65	 and	%ret0, %ret1, %ret0
66EXIT(__vfork14)
67