Annotation of embedaddon/nginx/src/os/unix/rfork_thread.S, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (C) Igor Sysoev
                      4:  * Copyright (C) Nginx, Inc.
                      5:  */
                      6: 
                      7: 
                      8: #include <sys/syscall.h>
                      9: #include <machine/asm.h>
                     10: 
                     11: /*
                     12:  * rfork_thread(3) - rfork_thread(flags, stack, func, arg);
                     13:  */
                     14: 
                     15: #define        KERNCALL        int $0x80
                     16: 
                     17: ENTRY(rfork_thread)
                     18:        push    %ebp
                     19:        mov     %esp, %ebp
                     20:        push    %esi
                     21: 
                     22:        mov     12(%ebp), %esi  # the thread stack address
                     23: 
                     24:        sub     $4, %esi
                     25:        mov     20(%ebp), %eax  # the thread argument
                     26:        mov     %eax, (%esi)
                     27: 
                     28:        sub     $4, %esi
                     29:        mov     16(%ebp), %eax  # the thread start address
                     30:        mov     %eax, (%esi)
                     31: 
                     32:        push    8(%ebp)         # rfork(2) flags
                     33:        push    $0
                     34:        mov     $SYS_rfork, %eax
                     35:        KERNCALL
                     36:        jc      error
                     37: 
                     38:        cmp     $0, %edx
                     39:        jne     child
                     40: 
                     41: parent:
                     42:        add     $8, %esp
                     43:        pop     %esi
                     44:        leave
                     45:        ret
                     46: 
                     47: child:
                     48:        mov     %esi, %esp
                     49:        pop     %eax
                     50:        call    *%eax           # call a thread start address ...
                     51:        add     $4, %esp
                     52: 
                     53:        push    %eax
                     54:        push    $0
                     55:        mov     $SYS_exit, %eax # ... and exit(2) after a thread would return
                     56:        KERNCALL
                     57: 
                     58: error:
                     59:        add     $8, %esp
                     60:        pop     %esi
                     61:        leave
                     62:        PIC_PROLOGUE
                     63: 
                     64:        /* libc's cerror: jmp  PIC_PLT(HIDENAME(cerror)) */
                     65: 
                     66:        push    %eax
                     67:        call    PIC_PLT(CNAME(__error))
                     68:        pop     %ecx
                     69:        PIC_EPILOGUE
                     70:        mov     %ecx, (%eax)
                     71:        mov     $-1, %eax
                     72:        mov     $-1, %edx
                     73:        ret

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>