__clone.S revision 1.1 1 1.1 tsubai /* $NetBSD: __clone.S,v 1.1 2001/07/22 17:18:25 tsubai Exp $ */
2 1.1 tsubai
3 1.1 tsubai /*-
4 1.1 tsubai * Copyright (c) 2001 Tsubai Masanari. All rights reserved.
5 1.1 tsubai *
6 1.1 tsubai * Redistribution and use in source and binary forms, with or without
7 1.1 tsubai * modification, are permitted provided that the following conditions
8 1.1 tsubai * are met:
9 1.1 tsubai * 1. Redistributions of source code must retain the above copyright
10 1.1 tsubai * notice, this list of conditions and the following disclaimer.
11 1.1 tsubai * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 tsubai * notice, this list of conditions and the following disclaimer in the
13 1.1 tsubai * documentation and/or other materials provided with the distribution.
14 1.1 tsubai * 3. The name of the author may not be used to endorse or promote products
15 1.1 tsubai * derived from this software without specific prior written permission.
16 1.1 tsubai *
17 1.1 tsubai * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.1 tsubai * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.1 tsubai * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.1 tsubai * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.1 tsubai * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.1 tsubai * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.1 tsubai * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.1 tsubai * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.1 tsubai * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 1.1 tsubai * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.1 tsubai */
28 1.1 tsubai
29 1.1 tsubai #include <sys/errno.h>
30 1.1 tsubai #include "SYS.h"
31 1.1 tsubai
32 1.1 tsubai #ifdef WEAK_ALIAS
33 1.1 tsubai WEAK_ALIAS(clone,__clone)
34 1.1 tsubai #endif
35 1.1 tsubai
36 1.1 tsubai /*
37 1.1 tsubai * int __clone(int (*fn)(void *), void *stack, int flags, void *arg);
38 1.1 tsubai */
39 1.1 tsubai ENTRY(__clone)
40 1.1 tsubai /*
41 1.1 tsubai * Sanity checks: func and stack may not be NULL.
42 1.1 tsubai */
43 1.1 tsubai tst r4, r4
44 1.1 tsubai bt inval
45 1.1 tsubai tst r5, r5
46 1.1 tsubai bt inval
47 1.1 tsubai
48 1.1 tsubai mov r4, r2
49 1.1 tsubai mov r6, r4
50 1.1 tsubai mov.l LSYS___clone, r0
51 1.1 tsubai trapa #0x80
52 1.1 tsubai bf err
53 1.1 tsubai
54 1.1 tsubai tst r0, r0
55 1.1 tsubai bf 1f /* We're the parent, just return. */
56 1.1 tsubai
57 1.1 tsubai jsr @r2 /* Call the clone's entry point. */
58 1.1 tsubai mov r7, r4 /* arg */
59 1.1 tsubai
60 1.1 tsubai mov.l L__exit, r1
61 1.1 tsubai jsr @r1
62 1.1 tsubai mov r0, r4
63 1.1 tsubai
64 1.1 tsubai inval:
65 1.1 tsubai mov #EINVAL, r0
66 1.1 tsubai err:
67 1.1 tsubai mov.l Lcerror, r1
68 1.1 tsubai jmp @r1
69 1.1 tsubai nop
70 1.1 tsubai 1:
71 1.1 tsubai rts
72 1.1 tsubai nop
73 1.1 tsubai
74 1.1 tsubai .align 2
75 1.1 tsubai LSYS___clone:
76 1.1 tsubai .long SYS___clone
77 1.1 tsubai L__exit:
78 1.1 tsubai .long _C_LABEL(_exit)
79 1.1 tsubai Lcerror:
80 1.1 tsubai .long cerror
81