move POSIX spawn, exec and child tracking into posixsrv, keep process transactions alive across reconnects and preserve stable PIDs across image replacement, flesh out spawn with ordered file actions, process-group selection and signal inheritance, implement execve with bootstrap validation and rollback before retiring the old process, add vfork children that share the native process while keeping separate POSIX descriptor and signal state, replace local spawn bookkeeping with child reaping, nonblocking and process-group waits and orphan cleanup, add signal dispositions, per-thread masks, pending delivery, process/group signalling and alarms, translate native exceptions into POSIX signals and inherit masks when creating threads, make pipe waits interruptible and raise SIGPIPE for broken pipes, pass arguments and environment into main and add getenv/environ, add direct user APC notifications that can run without an alertable wait, add current-thread capabilities and resume-and-wait, let accepted IPC endpoints open restricted peer process capabilities and preserve caller security during spawn and exec, make process preparation reusable and improve DLL lookup across current, executable and fallback directories, move keyboard repeat into RSSRV so PS/2 and USB share one repeat policy, fix video presentation, report launch failure stages and status codes, mooaaar tests.
This commit is contained in:
1 parent
73abd6f90d
commit
899225f551
57 files changed
+8817
-1216
No files matched your search
@@ -0,0 +1,157 @@
|
||||
; x64 POSIX vfork continuation. The parent enters the resume/wait syscall without
|
||||
; a nested userspace return frame while the child owns the caller's stack.
|
||||
|
||||
INCLUDE syscall_nr.inc
|
||||
|
||||
VF_ReturnAddress EQU 0
|
||||
VF_ParentRsp EQU 8
|
||||
VF_Rbx EQU 16
|
||||
VF_Rbp EQU 24
|
||||
VF_Rsi EQU 32
|
||||
VF_Rdi EQU 40
|
||||
VF_R12 EQU 48
|
||||
VF_R13 EQU 56
|
||||
VF_R14 EQU 64
|
||||
VF_R15 EQU 72
|
||||
VF_Xmm6 EQU 80
|
||||
VF_Xmm7 EQU 96
|
||||
VF_Xmm8 EQU 112
|
||||
VF_Xmm9 EQU 128
|
||||
VF_Xmm10 EQU 144
|
||||
VF_Xmm11 EQU 160
|
||||
VF_Xmm12 EQU 176
|
||||
VF_Xmm13 EQU 192
|
||||
VF_Xmm14 EQU 208
|
||||
VF_Xmm15 EQU 224
|
||||
VF_Mxcsr EQU 240
|
||||
VF_X87Control EQU 244
|
||||
VF_ThreadHandle EQU 256
|
||||
VF_PreviousSuspendCount EQU 264
|
||||
VF_ContextSize EQU 280
|
||||
VF_LocalSize EQU 312
|
||||
|
||||
EXTERN PosixVforkPrepare:PROC
|
||||
EXTERN PosixVforkParentFinish:PROC
|
||||
|
||||
.CODE
|
||||
|
||||
PUBLIC vfork
|
||||
vfork PROC EXPORT
|
||||
sub rsp, VF_LocalSize
|
||||
lea r10, [rsp + 32]
|
||||
|
||||
mov rax, [rsp + VF_LocalSize]
|
||||
mov [r10 + VF_ReturnAddress], rax
|
||||
lea rax, [rsp + VF_LocalSize + 8]
|
||||
mov [r10 + VF_ParentRsp], rax
|
||||
mov [r10 + VF_Rbx], rbx
|
||||
mov [r10 + VF_Rbp], rbp
|
||||
mov [r10 + VF_Rsi], rsi
|
||||
mov [r10 + VF_Rdi], rdi
|
||||
mov [r10 + VF_R12], r12
|
||||
mov [r10 + VF_R13], r13
|
||||
mov [r10 + VF_R14], r14
|
||||
mov [r10 + VF_R15], r15
|
||||
movdqu xmmword ptr [r10 + VF_Xmm6], xmm6
|
||||
movdqu xmmword ptr [r10 + VF_Xmm7], xmm7
|
||||
movdqu xmmword ptr [r10 + VF_Xmm8], xmm8
|
||||
movdqu xmmword ptr [r10 + VF_Xmm9], xmm9
|
||||
movdqu xmmword ptr [r10 + VF_Xmm10], xmm10
|
||||
movdqu xmmword ptr [r10 + VF_Xmm11], xmm11
|
||||
movdqu xmmword ptr [r10 + VF_Xmm12], xmm12
|
||||
movdqu xmmword ptr [r10 + VF_Xmm13], xmm13
|
||||
movdqu xmmword ptr [r10 + VF_Xmm14], xmm14
|
||||
movdqu xmmword ptr [r10 + VF_Xmm15], xmm15
|
||||
stmxcsr dword ptr [r10 + VF_Mxcsr]
|
||||
fnstcw word ptr [r10 + VF_X87Control]
|
||||
|
||||
mov rcx, r10
|
||||
call PosixVforkPrepare
|
||||
test rax, rax
|
||||
jnz vfork_wait
|
||||
add rsp, VF_LocalSize
|
||||
mov eax, -1
|
||||
ret
|
||||
|
||||
vfork_wait:
|
||||
; R12 deliberately holds the heap context across the kernel wait. The child
|
||||
; restores the caller's original R12 in its independent native context.
|
||||
mov r12, rax
|
||||
mov ecx, dword ptr [r12 + VF_ThreadHandle]
|
||||
lea rdx, [r12 + VF_PreviousSuspendCount]
|
||||
mov eax, SYS_RESUME_THREAD_AND_WAIT
|
||||
int 40h
|
||||
mov r9d, eax
|
||||
|
||||
; The child may have overwritten every byte of the old vfork/helper frames.
|
||||
; Rebuild only a synthetic return frame from the heap continuation.
|
||||
mov r10, r12
|
||||
mov r11, [r10 + VF_ParentRsp]
|
||||
mov rax, [r10 + VF_ReturnAddress]
|
||||
mov rsp, r11
|
||||
sub rsp, 8
|
||||
mov [rsp], rax
|
||||
sub rsp, 40
|
||||
|
||||
ldmxcsr dword ptr [r10 + VF_Mxcsr]
|
||||
fldcw word ptr [r10 + VF_X87Control]
|
||||
movdqu xmm6, xmmword ptr [r10 + VF_Xmm6]
|
||||
movdqu xmm7, xmmword ptr [r10 + VF_Xmm7]
|
||||
movdqu xmm8, xmmword ptr [r10 + VF_Xmm8]
|
||||
movdqu xmm9, xmmword ptr [r10 + VF_Xmm9]
|
||||
movdqu xmm10, xmmword ptr [r10 + VF_Xmm10]
|
||||
movdqu xmm11, xmmword ptr [r10 + VF_Xmm11]
|
||||
movdqu xmm12, xmmword ptr [r10 + VF_Xmm12]
|
||||
movdqu xmm13, xmmword ptr [r10 + VF_Xmm13]
|
||||
movdqu xmm14, xmmword ptr [r10 + VF_Xmm14]
|
||||
movdqu xmm15, xmmword ptr [r10 + VF_Xmm15]
|
||||
mov rbx, [r10 + VF_Rbx]
|
||||
mov rbp, [r10 + VF_Rbp]
|
||||
mov rsi, [r10 + VF_Rsi]
|
||||
mov rdi, [r10 + VF_Rdi]
|
||||
mov r12, [r10 + VF_R12]
|
||||
mov r13, [r10 + VF_R13]
|
||||
mov r14, [r10 + VF_R14]
|
||||
mov r15, [r10 + VF_R15]
|
||||
|
||||
mov rcx, r10
|
||||
mov edx, r9d
|
||||
call PosixVforkParentFinish
|
||||
add rsp, 40
|
||||
ret
|
||||
vfork ENDP
|
||||
|
||||
PUBLIC PosixVforkEnterChild
|
||||
PosixVforkEnterChild PROC
|
||||
mov r10, rcx
|
||||
mov r11, [r10 + VF_ParentRsp]
|
||||
mov rax, [r10 + VF_ReturnAddress]
|
||||
mov rsp, r11
|
||||
sub rsp, 8
|
||||
mov [rsp], rax
|
||||
|
||||
ldmxcsr dword ptr [r10 + VF_Mxcsr]
|
||||
fldcw word ptr [r10 + VF_X87Control]
|
||||
movdqu xmm6, xmmword ptr [r10 + VF_Xmm6]
|
||||
movdqu xmm7, xmmword ptr [r10 + VF_Xmm7]
|
||||
movdqu xmm8, xmmword ptr [r10 + VF_Xmm8]
|
||||
movdqu xmm9, xmmword ptr [r10 + VF_Xmm9]
|
||||
movdqu xmm10, xmmword ptr [r10 + VF_Xmm10]
|
||||
movdqu xmm11, xmmword ptr [r10 + VF_Xmm11]
|
||||
movdqu xmm12, xmmword ptr [r10 + VF_Xmm12]
|
||||
movdqu xmm13, xmmword ptr [r10 + VF_Xmm13]
|
||||
movdqu xmm14, xmmword ptr [r10 + VF_Xmm14]
|
||||
movdqu xmm15, xmmword ptr [r10 + VF_Xmm15]
|
||||
mov rbx, [r10 + VF_Rbx]
|
||||
mov rbp, [r10 + VF_Rbp]
|
||||
mov rsi, [r10 + VF_Rsi]
|
||||
mov rdi, [r10 + VF_Rdi]
|
||||
mov r12, [r10 + VF_R12]
|
||||
mov r13, [r10 + VF_R13]
|
||||
mov r14, [r10 + VF_R14]
|
||||
mov r15, [r10 + VF_R15]
|
||||
xor eax, eax
|
||||
ret
|
||||
PosixVforkEnterChild ENDP
|
||||
|
||||
END
|
||||
Reference in new issue
Block a user