From 9e2cbcc40705cd35578fb0a1c020d7e02016c867 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Fri, 29 Jul 2022 10:06:54 -0600
Subject: [PATCH] redox-exec: Add aarch64 stubs

---
 src/platform/redox/clone.rs                   | 19 ++++++-
 .../redox/redox-exec/src/arch/aarch64.rs      | 54 +++++++++++++++++++
 src/platform/redox/redox-exec/src/arch/mod.rs |  5 ++
 src/platform/redox/redox-exec/src/arch/x86.rs |  2 +-
 4 files changed, 78 insertions(+), 2 deletions(-)
 create mode 100644 src/platform/redox/redox-exec/src/arch/aarch64.rs

diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs
index 43d8dcadf..da8619f27 100644
--- a/src/platform/redox/clone.rs
+++ b/src/platform/redox/clone.rs
@@ -68,7 +68,24 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> {
     Ok(0)
 }
 
-//TODO
+//TODO: aarch64
+#[cfg(target_arch = "aarch64")]
+core::arch::global_asm!("
+    .globl __relibc_internal_pte_clone_ret
+    .type __relibc_internal_pte_clone_ret, @function
+    .p2align 6
+__relibc_internal_pte_clone_ret:
+    b __relibc_internal_pte_clone_ret
+
+    .size __relibc_internal_pte_clone_ret, . - __relibc_internal_pte_clone_ret
+");
+
+#[cfg(target_arch = "aarch64")]
+extern "C" {
+    fn __relibc_internal_pte_clone_ret();
+}
+
+//TODO: x86
 #[cfg(target_arch = "x86")]
 core::arch::global_asm!("
     .globl __relibc_internal_pte_clone_ret
diff --git a/src/platform/redox/redox-exec/src/arch/aarch64.rs b/src/platform/redox/redox-exec/src/arch/aarch64.rs
new file mode 100644
index 000000000..2bfe63273
--- /dev/null
+++ b/src/platform/redox/redox-exec/src/arch/aarch64.rs
@@ -0,0 +1,54 @@
+use syscall::error::*;
+
+use crate::{FdGuard, fork_inner};
+
+// Setup a stack starting from the very end of the address space, and then growing downwards.
+pub(crate) const STACK_TOP: usize = 1 << 47;
+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))
+}
+
+pub fn copy_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> {
+    //TODO: aarch64
+    Err(Error::new(ENOSYS))
+}
+
+#[no_mangle]
+unsafe extern "C" fn __relibc_internal_fork_impl(initial_rsp: *mut usize) -> usize {
+    Error::mux(fork_inner(initial_rsp))
+}
+
+#[no_mangle]
+unsafe extern "C" fn __relibc_internal_fork_hook(cur_filetable_fd: usize, new_pid_fd: usize) {
+    let _ = syscall::close(cur_filetable_fd);
+    let _ = syscall::close(new_pid_fd);
+}
+
+//TODO: aarch64
+core::arch::global_asm!("
+    .p2align 6
+    .globl __relibc_internal_fork_wrapper
+    .type __relibc_internal_fork_wrapper, @function
+__relibc_internal_fork_wrapper:
+        b __relibc_internal_fork_wrapper
+
+    .size __relibc_internal_fork_wrapper, . - __relibc_internal_fork_wrapper
+
+    .p2align 6
+    .globl __relibc_internal_fork_ret
+    .type __relibc_internal_fork_ret, @function
+__relibc_internal_fork_ret:
+        b __relibc_internal_fork_ret
+
+    .size __relibc_internal_fork_ret, . - __relibc_internal_fork_ret"
+);
+
+extern "C" {
+    pub(crate) fn __relibc_internal_fork_wrapper() -> usize;
+    pub(crate) fn __relibc_internal_fork_ret();
+}
diff --git a/src/platform/redox/redox-exec/src/arch/mod.rs b/src/platform/redox/redox-exec/src/arch/mod.rs
index 5a2e73255..372b7802b 100644
--- a/src/platform/redox/redox-exec/src/arch/mod.rs
+++ b/src/platform/redox/redox-exec/src/arch/mod.rs
@@ -1,3 +1,8 @@
+#[cfg(target_arch = "aarch64")]
+pub use self::aarch64::*;
+#[cfg(target_arch = "aarch64")]
+pub mod aarch64;
+
 #[cfg(target_arch = "x86")]
 pub use self::x86::*;
 #[cfg(target_arch = "x86")]
diff --git a/src/platform/redox/redox-exec/src/arch/x86.rs b/src/platform/redox/redox-exec/src/arch/x86.rs
index e1700a85d..a0c9279db 100644
--- a/src/platform/redox/redox-exec/src/arch/x86.rs
+++ b/src/platform/redox/redox-exec/src/arch/x86.rs
@@ -45,7 +45,7 @@ unsafe extern "cdecl" fn __relibc_internal_fork_hook(cur_filetable_fd: usize, ne
     let _ = syscall::close(new_pid_fd);
 }
 
-//TODO
+//TODO: x86
 core::arch::global_asm!("
     .p2align 6
     .globl __relibc_internal_fork_wrapper
-- 
GitLab