diff --git a/redox-rt/src/arch/aarch64.rs b/redox-rt/src/arch/aarch64.rs index 28096ebde9..60ec437c88 100644 --- a/redox-rt/src/arch/aarch64.rs +++ b/redox-rt/src/arch/aarch64.rs @@ -254,9 +254,9 @@ asmfunction!(__relibc_internal_sigentry: [" add x1, x5, #{tcb_sa_off} + {sa_tmp_rt_inf} str x2, [x1] mov x2, #{RTINF_SIZE} - adrp x3, {proc_call} - add x3, x3, :lo12:{proc_call} - mov x4, #1 + adrp x4, {proc_call} + add x4, x4, :lo12:{proc_call} + mov x3, #1 svc 0 mov x0, x5 // restore TCB pointer cbnz x0, 1b @@ -479,4 +479,4 @@ pub unsafe fn arch_pre(stack: &mut SigStack, os: &mut SigArea) -> PosixStackt { } } pub(crate) static PROC_FD: SyncUnsafeCell = SyncUnsafeCell::new(usize::MAX); -static PROC_CALL: &[usize] = &[ProcCall::Sigdeq as usize]; +static PROC_CALL: [usize; 1] = [ProcCall::Sigdeq as usize]; diff --git a/redox-rt/src/arch/i686.rs b/redox-rt/src/arch/i686.rs index 71319f50d5..2e2db3ab07 100644 --- a/redox-rt/src/arch/i686.rs +++ b/redox-rt/src/arch/i686.rs @@ -1,9 +1,10 @@ -use core::{mem::offset_of, ptr::NonNull, sync::atomic::Ordering}; +use core::{cell::SyncUnsafeCell, mem::offset_of, ptr::NonNull, sync::atomic::Ordering}; use syscall::*; use crate::{ - proc::{fork_inner, FdGuard}, + proc::{fork_inner, FdGuard, ForkArgs}, + protocol::{ProcCall, RtSigInfo}, signal::{inner_fastcall, PosixStackt, RtSigarea, SigStack, PROC_CONTROL_STRUCT}, RtTcb, }; @@ -20,8 +21,11 @@ pub struct SigArea { pub tmp_eip: usize, pub tmp_esp: usize, pub tmp_eax: usize, + pub tmp_ebx: usize, pub tmp_ecx: usize, pub tmp_edx: usize, + pub tmp_edi: usize, + pub tmp_esi: usize, pub tmp_rt_inf: RtSigInfo, pub tmp_id_inf: u64, pub tmp_mm0: u64, @@ -79,16 +83,30 @@ pub fn copy_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> { Ok(()) } -unsafe extern "cdecl" fn fork_impl(initial_rsp: *mut usize) -> usize { - Error::mux(fork_inner(initial_rsp)) +unsafe extern "fastcall" fn fork_impl(args: &ForkArgs, initial_rsp: *mut usize) -> usize { + Error::mux(fork_inner(initial_rsp, args)) } -unsafe extern "cdecl" fn child_hook(cur_filetable_fd: usize, new_pid_fd: usize) { +// TODO: duplicate code with x86_64 +unsafe extern "cdecl" fn child_hook( + cur_filetable_fd: usize, + new_proc_fd: usize, + new_thr_fd: usize, +) { let _ = syscall::close(cur_filetable_fd); - crate::child_hook_common(FdGuard::new(new_pid_fd)); + crate::child_hook_common(crate::ChildHookCommonArgs { + new_thr_fd: FdGuard::new(new_thr_fd), + new_proc_fd: if new_proc_fd == usize::MAX { + None + } else { + Some(FdGuard::new(new_proc_fd)) + }, + }); } -asmfunction!(__relibc_internal_fork_wrapper -> usize: [" +asmfunction!(__relibc_internal_fork_wrapper (usize) -> usize: [" + mov ecx, [esp+4] + push ebp mov ebp, esp @@ -103,9 +121,9 @@ asmfunction!(__relibc_internal_fork_wrapper -> usize: [" //TODO stmxcsr [esp+16] fnstcw [esp+24] - push esp + mov edx, esp call {fork_impl} - pop esp + jmp 2f "] <= [fork_impl = sym fork_impl]); @@ -137,6 +155,9 @@ asmfunction!(__relibc_internal_sigentry: [" mov gs:[{tcb_sa_off} + {sa_tmp_eax}], eax mov gs:[{tcb_sa_off} + {sa_tmp_edx}], edx mov gs:[{tcb_sa_off} + {sa_tmp_ecx}], ecx + mov gs:[{tcb_sa_off} + {sa_tmp_ebx}], ebx + mov gs:[{tcb_sa_off} + {sa_tmp_edi}], edi + mov gs:[{tcb_sa_off} + {sa_tmp_esi}], esi 1: // Read standard signal word - first for this thread mov edx, gs:[{tcb_sc_off} + {sc_word} + 4] @@ -176,13 +197,18 @@ asmfunction!(__relibc_internal_sigentry: [" bt edx, eax jc 8f - mov edx, ebx - lea ecx, [eax+32] - mov eax, {SYS_SIGDEQUEUE} - mov edx, gs:[0] - add edx, {tcb_sa_off} + {sa_tmp_rt_inf} + // SYS_CALL(fd, payload_base, payload_len, metadata_len, metadata_base) + // eax ebx ecx edx esi edi + + mov ebx, [{proc_fd}] + mov ecx, gs:[0] + add ecx, {tcb_sa_off} + {sa_tmp_rt_inf} + lea edx, [eax+32] + mov [ecx], edx + mov esi, 1 + mov edi, {proc_call} + mov eax, {SYS_CALL} int 0x80 - mov ebx, edx test eax, eax jnz 1b @@ -228,9 +254,9 @@ asmfunction!(__relibc_internal_sigentry: [" push dword ptr gs:[{tcb_sa_off} + {sa_tmp_edx}] push dword ptr gs:[{tcb_sa_off} + {sa_tmp_ecx}] push dword ptr gs:[{tcb_sa_off} + {sa_tmp_eax}] - push ebx - push edi - push esi + push dword ptr gs:[{tcb_sa_off} + {sa_tmp_ebx}] + push dword ptr gs:[{tcb_sa_off} + {sa_tmp_edi}] + push dword ptr gs:[{tcb_sa_off} + {sa_tmp_esi}] push ebp sub esp, 2 * 4 + 29 * 16 @@ -286,8 +312,11 @@ __relibc_internal_sigentry_crit_third: sa_tmp_eip = const offset_of!(SigArea, tmp_eip), sa_tmp_esp = const offset_of!(SigArea, tmp_esp), sa_tmp_eax = const offset_of!(SigArea, tmp_eax), + sa_tmp_ebx = const offset_of!(SigArea, tmp_ebx), sa_tmp_ecx = const offset_of!(SigArea, tmp_ecx), sa_tmp_edx = const offset_of!(SigArea, tmp_edx), + sa_tmp_edi = const offset_of!(SigArea, tmp_edi), + sa_tmp_esi = const offset_of!(SigArea, tmp_esi), sa_tmp_mm0 = const offset_of!(SigArea, tmp_mm0), sa_tmp_rt_inf = const offset_of!(SigArea, tmp_rt_inf), sa_tmp_id_inf = const offset_of!(SigArea, tmp_id_inf), @@ -305,8 +334,10 @@ __relibc_internal_sigentry_crit_third: pctl_sender_infos = const offset_of!(SigProcControl, sender_infos), pctl_pending = const offset_of!(SigProcControl, pending), pctl = sym PROC_CONTROL_STRUCT, + proc_fd = sym PROC_FD, + proc_call = sym PROC_CALL, STACK_ALIGN = const 16, - SYS_SIGDEQUEUE = const syscall::SYS_SIGDEQUEUE, + SYS_CALL = const syscall::SYS_CALL, ]); asmfunction!(__relibc_internal_rlct_clone_ret -> usize: [" @@ -377,3 +408,6 @@ pub fn current_sp() -> usize { } sp } + +pub static PROC_FD: SyncUnsafeCell = SyncUnsafeCell::new(usize::MAX); +static PROC_CALL: [usize; 1] = [ProcCall::Sigdeq as usize]; diff --git a/redox-rt/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs index 8a85bcfaf9..3a9f1b0166 100644 --- a/redox-rt/src/arch/x86_64.rs +++ b/redox-rt/src/arch/x86_64.rs @@ -233,8 +233,8 @@ asmfunction!(__relibc_internal_sigentry: [" // otherwise, try (competitively) dequeueing realtime signal - // SYS_CALL(fd, payload_base, payload_len, metadata_len, metadata_base | (flags << 8)) - // rax rdi rsi rdx r10 r8 + // SYS_CALL(fd, payload_base, payload_len, metadata_len | (flags << 8), metadata_base) + // rax rdi rsi rdx r10 r8 mov r12d, eax mov rsi, fs:[0] diff --git a/redox-rt/src/proc.rs b/redox-rt/src/proc.rs index 169d8113c7..561aacc703 100644 --- a/redox-rt/src/proc.rs +++ b/redox-rt/src/proc.rs @@ -121,7 +121,7 @@ where |o| core::mem::take(&mut o.tree), ); - pread_all(*image_file as usize, header.e_phoff.into(), phs).map_err(|_| Error::new(EIO))?; + pread_all(*image_file as usize, u64::from(header.e_phoff), phs).map_err(|_| Error::new(EIO))?; for ph_idx in 0..phnum { let ph_bytes = &phs[ph_idx * phentsize..(ph_idx + 1) * phentsize]; @@ -144,7 +144,11 @@ where // PT_INTERP must come before any PT_LOAD, so we don't have to iterate twice. PT_INTERP => { let mut interp = vec![0_u8; segment.p_filesz as usize]; - pread_all(*image_file as usize, segment.p_offset.into(), &mut interp)?; + pread_all( + *image_file as usize, + u64::from(segment.p_offset), + &mut interp, + )?; return Ok(FexecResult::Interp { path: interp.into_boxed_slice(), @@ -193,7 +197,7 @@ where }; pread_all( *image_file, - segment.p_offset.into(), + u64::from(segment.p_offset), &mut dst_memory[voff..voff + filesz], )?; }