annotate src/os/unix/rfork_thread.S @ 267:83205e0b5522

nginx-0.0.2-2004-02-24-20:31:46 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 24 Feb 2004 17:31:46 +0000
parents
children da8c5707af39
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
267
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 #include <sys/syscall.h>
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 #include <machine/asm.h>
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 /*
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 * rfork_thread(3) - rfork_thread(flags, stack, func, arg);
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 */
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #define KERNCALL int $0x80
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 ENTRY(rfork_thread)
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 push %ebp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 mov %esp, %ebp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 push %esi
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 mov 12(%ebp), %esi # the stack address
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 sub $4, %esi
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 mov 20(%ebp), %eax # the thread argument
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 mov %eax, (%esi)
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 sub $4, %esi
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 mov 16(%ebp), %eax # the start thread address
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 mov %eax, (%esi)
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 push 8(%ebp) # rfork(2) flags
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 push $0
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 mov $SYS_rfork, %eax
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 KERNCALL
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 jc error
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 cmp $0, %edx
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 jne child
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 parent:
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 add $8, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 pop %esi
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 mov %ebp, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 pop %ebp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ret
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 child:
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 mov %esi, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 pop %eax
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 call *%eax # call a thread start address ...
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 add $4, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 push %eax
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 push $0
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 mov $SYS_exit, %eax # ... and exit(2) after a thread would return
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 KERNCALL
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 error:
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 add $8, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 pop %esi
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 mov %ebp, %esp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 pop %ebp
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 PIC_PROLOGUE
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 /* libc's cerror: jmp PIC_PLT(HIDENAME(cerror)) */
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 push %eax
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 call PIC_PLT(CNAME(__error))
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 pop %ecx
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 PIC_EPILOGUE
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 mov %ecx, (%eax)
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 mov $-1, %eax
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 mov $-1, %edx
83205e0b5522 nginx-0.0.2-2004-02-24-20:31:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 ret