From adbdf1d73daa6f807aee359a6a63c2cef44a5791 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 24 Aug 2022 15:45:36 -0600 Subject: [PATCH] Fixes for redox-exec on aarch64 --- .../redox/redox-exec/src/arch/aarch64.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/platform/redox/redox-exec/src/arch/aarch64.rs b/src/platform/redox/redox-exec/src/arch/aarch64.rs index a986bf1f73..9a37882441 100644 --- a/src/platform/redox/redox-exec/src/arch/aarch64.rs +++ b/src/platform/redox/redox-exec/src/arch/aarch64.rs @@ -9,13 +9,18 @@ pub(crate) const STACK_SIZE: usize = 1024 * 1024; /// Deactive TLS, used before exec() on Redox to not trick target executable into thinking TLS /// is already initialized as if it was a thread. pub unsafe fn deactivate_tcb(open_via_dup: usize) -> Result<()> { - //TODO: aarch64 - Err(Error::new(ENOSYS)) + let mut env = syscall::EnvRegisters::default(); + + let file = FdGuard::new(syscall::dup(open_via_dup, b"regs/env")?); + + env.tpidr_el0 = 0; + + let _ = syscall::write(*file, &mut env)?; + Ok(()) } pub fn copy_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> { // Copy environment registers. - /*TODO { let cur_env_regs_fd = FdGuard::new(syscall::dup(cur_pid_fd, b"regs/env")?); let new_env_regs_fd = FdGuard::new(syscall::dup(new_pid_fd, b"regs/env")?); @@ -24,7 +29,6 @@ pub fn copy_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> { let _ = syscall::read(*cur_env_regs_fd, &mut env_regs)?; let _ = syscall::write(*new_env_regs_fd, &env_regs)?; } - */ Ok(()) } @@ -58,6 +62,8 @@ __relibc_internal_fork_wrapper: str x29, [sp, #-8]! str x30, [sp, #-8]! + sub sp, sp, #32 + //TODO: store floating point regs mov x0, sp @@ -71,7 +77,7 @@ __relibc_internal_fork_wrapper: .type __relibc_internal_fork_ret, @function __relibc_internal_fork_ret: ldr x0, [sp] - ldr x1, [sp], #8 + ldr x1, [sp, #8] bl __relibc_internal_fork_hook //TODO: load floating point regs @@ -80,6 +86,7 @@ __relibc_internal_fork_ret: .p2align 4 2: + add sp, sp, #32 ldr x30, [sp], #8 ldr x29, [sp], #8 ldr x28, [sp], #8