1 1.3 martin /* $NetBSD: __clone.S,v 1.3 2008/04/28 20:22:55 martin Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /*- 4 1.1 thorpej * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 1.1 thorpej * All rights reserved. 6 1.1 thorpej * 7 1.1 thorpej * This code is derived from software contributed to The NetBSD Foundation 8 1.1 thorpej * by Jason R. Thorpe. 9 1.1 thorpej * 10 1.1 thorpej * Redistribution and use in source and binary forms, with or without 11 1.1 thorpej * modification, are permitted provided that the following conditions 12 1.1 thorpej * are met: 13 1.1 thorpej * 1. Redistributions of source code must retain the above copyright 14 1.1 thorpej * notice, this list of conditions and the following disclaimer. 15 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 thorpej * notice, this list of conditions and the following disclaimer in the 17 1.1 thorpej * documentation and/or other materials provided with the distribution. 18 1.1 thorpej * 19 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 thorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 thorpej * POSSIBILITY OF SUCH DAMAGE. 30 1.1 thorpej */ 31 1.1 thorpej 32 1.1 thorpej #include <sys/errno.h> 33 1.1 thorpej 34 1.1 thorpej #include "SYS.h" 35 1.1 thorpej 36 1.1 thorpej #ifdef WEAK_ALIAS 37 1.1 thorpej WEAK_ALIAS(clone, __clone) 38 1.1 thorpej #endif 39 1.1 thorpej 40 1.1 thorpej /* 41 1.1 thorpej * int __clone(int (*fn)(void *), void *stack, int flags, void *arg); 42 1.1 thorpej */ 43 1.1 thorpej LEAF(__clone, 4) 44 1.1 thorpej br pv, 1f 45 1.1 thorpej 1: LDGP(pv) 46 1.1 thorpej 47 1.1 thorpej /* 48 1.1 thorpej * Sanity checks: func and stack may not be NULL. 49 1.1 thorpej */ 50 1.1 thorpej beq a0, 9f 51 1.1 thorpej beq a1, 9f 52 1.1 thorpej 53 1.1 thorpej /* 54 1.2 msaitoh * We need to be able to get at the func and arg arguments 55 1.1 thorpej * in the child. Luckily, we have a convenient place to 56 1.1 thorpej * do this; the child's stack. 57 1.1 thorpej */ 58 1.1 thorpej subq a1, 16, a1 59 1.1 thorpej stq a0, 0(a1) 60 1.1 thorpej stq a3, 8(a1) 61 1.1 thorpej 62 1.1 thorpej /* 63 1.1 thorpej * The system call expects (flags, stack). 64 1.1 thorpej */ 65 1.1 thorpej mov a2, a0 66 1.1 thorpej CALLSYS_ERROR(__clone) 67 1.1 thorpej 68 1.1 thorpej beq a4, 8f /* a4 (rv[1]) == 0, parent, child pid in v0 */ 69 1.1 thorpej 70 1.1 thorpej /* 71 1.1 thorpej * Fetch the function and argument from the new stack, and 72 1.1 thorpej * pop it back. 73 1.1 thorpej */ 74 1.1 thorpej ldq pv, 0(sp) 75 1.1 thorpej ldq a0, 8(sp) 76 1.1 thorpej addq sp, 16, sp 77 1.1 thorpej 78 1.1 thorpej /* Call the clone's entry point. */ 79 1.1 thorpej CALL((pv)) 80 1.1 thorpej 81 1.1 thorpej /* Pass return value to _exit(). */ 82 1.1 thorpej mov v0, a0 83 1.1 thorpej CALL(_exit) 84 1.1 thorpej 85 1.1 thorpej /* NOTREACHED */ 86 1.1 thorpej 87 1.1 thorpej 8: RET 88 1.1 thorpej 89 1.1 thorpej 9: ldiq v0, EINVAL 90 1.1 thorpej jmp zero, __cerror 91 1.1 thorpej END(__clone) 92