__clone.S revision 1.2 1 1.2 marcus /* $NetBSD: __clone.S,v 1.2 2003/07/01 14:35:45 marcus 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.2 marcus #ifdef PIC
62 1.2 marcus bsrf r1
63 1.2 marcus #else
64 1.1 tsubai jsr @r1
65 1.2 marcus #endif
66 1.1 tsubai mov r0, r4
67 1.2 marcus 2:
68 1.1 tsubai inval:
69 1.1 tsubai mov #EINVAL, r0
70 1.1 tsubai err:
71 1.1 tsubai mov.l Lcerror, r1
72 1.2 marcus #ifdef PIC
73 1.2 marcus braf r1
74 1.2 marcus #else
75 1.1 tsubai jmp @r1
76 1.2 marcus #endif
77 1.1 tsubai nop
78 1.1 tsubai 1:
79 1.1 tsubai rts
80 1.1 tsubai nop
81 1.1 tsubai
82 1.1 tsubai .align 2
83 1.1 tsubai LSYS___clone:
84 1.1 tsubai .long SYS___clone
85 1.2 marcus #ifdef PIC
86 1.2 marcus L__exit:
87 1.2 marcus .long _C_LABEL(_exit)-2b
88 1.2 marcus Lcerror:
89 1.2 marcus .long cerror-1b
90 1.2 marcus #else
91 1.1 tsubai L__exit:
92 1.1 tsubai .long _C_LABEL(_exit)
93 1.1 tsubai Lcerror:
94 1.1 tsubai .long cerror
95 1.2 marcus #endif
96