diff options
| author | 2011-09-22 23:32:10 +0000 | |
|---|---|---|
| committer | 2011-09-22 23:32:10 +0000 | |
| commit | 40ffe171a7951d3019b3c8b488be87bfad405509 (patch) | |
| tree | 7634bff211814a539a15e4e34db747e4d7b46006 /usr.sbin/nginx/src/os/unix/rfork_thread.S | |
| parent | Always install all manuals on all architectures. (diff) | |
| download | wireguard-openbsd-40ffe171a7951d3019b3c8b488be87bfad405509.tar.xz wireguard-openbsd-40ffe171a7951d3019b3c8b488be87bfad405509.zip | |
import of nginx 1.0.6 with a bundled libpcre needed for pcre to work
properly.
this is not yet linked to the build but we would like to work on it
in tree to provide an apache replacement for base
Diffstat (limited to 'usr.sbin/nginx/src/os/unix/rfork_thread.S')
| -rw-r--r-- | usr.sbin/nginx/src/os/unix/rfork_thread.S | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/usr.sbin/nginx/src/os/unix/rfork_thread.S b/usr.sbin/nginx/src/os/unix/rfork_thread.S new file mode 100644 index 00000000000..161007d6be3 --- /dev/null +++ b/usr.sbin/nginx/src/os/unix/rfork_thread.S @@ -0,0 +1,72 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#include <sys/syscall.h> +#include <machine/asm.h> + +/* + * rfork_thread(3) - rfork_thread(flags, stack, func, arg); + */ + +#define KERNCALL int $0x80 + +ENTRY(rfork_thread) + push %ebp + mov %esp, %ebp + push %esi + + mov 12(%ebp), %esi # the thread stack address + + sub $4, %esi + mov 20(%ebp), %eax # the thread argument + mov %eax, (%esi) + + sub $4, %esi + mov 16(%ebp), %eax # the thread start address + mov %eax, (%esi) + + push 8(%ebp) # rfork(2) flags + push $0 + mov $SYS_rfork, %eax + KERNCALL + jc error + + cmp $0, %edx + jne child + +parent: + add $8, %esp + pop %esi + leave + ret + +child: + mov %esi, %esp + pop %eax + call *%eax # call a thread start address ... + add $4, %esp + + push %eax + push $0 + mov $SYS_exit, %eax # ... and exit(2) after a thread would return + KERNCALL + +error: + add $8, %esp + pop %esi + leave + PIC_PROLOGUE + + /* libc's cerror: jmp PIC_PLT(HIDENAME(cerror)) */ + + push %eax + call PIC_PLT(CNAME(__error)) + pop %ecx + PIC_EPILOGUE + mov %ecx, (%eax) + mov $-1, %eax + mov $-1, %edx + ret |
