Fix vfork. Add comments.

This commit is contained in:
Konstantin Belousov 2011-06-18 12:13:28 +00:00
parent a2f43b6155
commit 1c23d0f727
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=223254

View File

@ -79,8 +79,20 @@ ia32_osigcode:
jmp 1b
/*
* The lcall $7,$0 emulator cannot use the call gate that does an
* inter-privilege transition. The reason is that the call gate
* does not disable interrupts, and, before the swapgs is
* executed, we would have a window where the ring 0 code is
* executed with the wrong gsbase.
*
* Instead, reflect the lcall $7,$0 back to ring 3 trampoline
* which sets up the frame for int $0x80.
*/
ALIGN_TEXT
lcall_tramp:
cmpl $SYS_vfork,%eax
je 2f
pushl %ebp
movl %esp,%ebp
pushl 0x24(%ebp) /* arg 6 */
@ -91,8 +103,19 @@ lcall_tramp:
pushl 0x10(%ebp) /* arg 1 */
pushl 0xc(%ebp) /* gap */
int $0x80
leave
leavel
1:
lretl
2:
/*
* vfork handling is special and relies on the libc stub saving
* the return ip in %ecx. If vfork failed, then there is no
* child which can corrupt the frame created by call gate.
*/
int $0x80
jb 1b
addl $8,%esp
jmpl *%ecx
#endif
ALIGN_TEXT