Annotation of embedaddon/nginx/src/os/unix/rfork_thread.S, revision 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>