Blob


1 #include "FreeBSD-386-asm.s"
3 /*
4 * Copyright (c) 2000 Peter Wemm <peter@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
29 #include <sys/syscall.h>
30 #include <machine/asm.h>
32 ENTRY(rfork_thread)
33 pushl %ebp
34 movl %esp, %ebp
35 pushl %esi
37 /*
38 * Push thread info onto the new thread's stack
39 */
40 movl 12(%ebp), %esi # get stack addr
42 subl $4, %esi
43 movl 20(%ebp), %eax # get start argument
44 movl %eax, (%esi)
46 subl $4, %esi
47 movl 16(%ebp), %eax # get start thread address
48 movl %eax, (%esi)
50 /*
51 * Prepare and execute the thread creation syscall
52 */
53 pushl 8(%ebp)
54 pushl $0
55 movl $SYS_rfork, %eax
56 int $0x80
57 jb 2f
59 /*
60 * Check to see if we are in the parent or child
61 */
62 cmpl $0, %edx
63 jnz 1f
64 addl $8, %esp
65 popl %esi
66 movl %ebp, %esp
67 popl %ebp
68 ret
69 .p2align 2
71 /*
72 * If we are in the child (new thread), then
73 * set-up the call to the internal subroutine. If it
74 * returns, then call __exit.
75 */
76 1:
77 movl %esi,%esp
78 popl %eax
79 call *%eax
80 addl $4, %esp
82 /*
83 * Exit system call
84 */
85 pushl %eax
86 pushl $0
87 movl $SYS_exit, %eax
88 int $0x80
90 /*
91 * Branch here if the thread creation fails:
92 */
93 2:
94 addl $8, %esp
95 popl %esi
96 movl %ebp, %esp
97 popl %ebp
98 PIC_PROLOGUE
99 jmp PIC_PLT(_C_LABEL(__cerror))