vm: fix a null dereference on out-of-memory
[minix.git] / lib / libc / arch / hppa / sys / __vfork14.S
blob770ccf96ad7b8b563f2bf5e2c7066fe220d94b75
1 /*      $NetBSD: __vfork14.S,v 1.5 2008/04/28 20:22:56 martin Exp $     */
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  */
32 #include <sys/errno.h>
33 #include "SYS.h"
35 ENTRY(__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         .import __cerror, code
57         copy    %rp, %t4
58         ldil    L%SYSCALLGATE, %r1
59         ble     4(%sr7, %r1)
60         ldi     SYS___vfork14, %t1
61         comb,<> %r0, %t1, __cerror
62         copy    %t4, %rp
63         addi    -1, %ret1, %ret1
64         bv      %r0(%rp)
65         and     %ret0, %ret1, %ret0
66 EXIT(__vfork14)