diff --git a/src/crt0/src/lib.rs b/src/crt0/src/lib.rs
index c92a897c0cc1da8eeca22a4a72eb9b7ad800fb48..ee596cadc557d5b49104837781b0382f2658755f 100644
--- a/src/crt0/src/lib.rs
+++ b/src/crt0/src/lib.rs
@@ -8,10 +8,22 @@ use core::arch::global_asm;
 #[cfg(target_arch = "x86_64")]
 global_asm!("
     .globl _start
+    .type _start, @function
 _start:
     mov rdi, rsp
     and rsp, 0xFFFFFFFFFFFFFFF0
+
+    sub rsp, 8
+
+    mov DWORD PTR [rsp], 0x00001F80
+    ldmxcsr [rsp]
+    mov WORD PTR [rsp], 0x031F
+    fldcw [rsp]
+
+    add rsp, 8
+
     call relibc_start
+    .size _start, . - _start
 ");
 #[cfg(target_arch = "aarch64")]
 global_asm!("
diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs
index 398541bfe62ce83b8dbb461864210ff39bdae810..c409b6901cf0043e5545ece32fdf1353cffb52da 100644
--- a/src/platform/redox/clone.rs
+++ b/src/platform/redox/clone.rs
@@ -42,7 +42,7 @@ fn copy_str(cur_pid_fd: usize, new_pid_fd: usize, key: &str) -> Result<()> {
     Ok(())
 }
 #[cfg(target_arch = "x86_64")]
-fn copy_float_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> {
+fn copy_env_regs(cur_pid_fd: usize, new_pid_fd: usize) -> Result<()> {
     // Copy environment registers.
     {
         let cur_env_regs_fd = FdGuard::new(syscall::dup(cur_pid_fd, b"regs/env")?);
@@ -52,15 +52,6 @@ fn copy_float_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)?;
     }
-    // Copy float registers.
-    {
-        let cur_float_regs_fd = FdGuard::new(syscall::dup(cur_pid_fd, b"regs/float")?);
-        let new_float_regs_fd = FdGuard::new(syscall::dup(new_pid_fd, b"regs/float")?);
-
-        let mut float_regs = syscall::FloatRegisters::default();
-        let _ = syscall::read(*cur_float_regs_fd, &mut float_regs)?;
-        let _ = syscall::write(*new_float_regs_fd, &float_regs)?;
-    }
 
     Ok(())
 }
@@ -102,7 +93,7 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> {
         let _ = syscall::write(*new_filetable_sel_fd, &usize::to_ne_bytes(*cur_filetable_fd))?;
     }
 
-    copy_float_env_regs(*cur_pid_fd, *new_pid_fd)?;
+    copy_env_regs(*cur_pid_fd, *new_pid_fd)?;
 
     // Unblock context. 
     syscall::kill(new_pid, SIGCONT)?;
@@ -204,7 +195,7 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> {
             let buf = create_set_addr_space_buf(*new_addr_space_fd, fork_ret as usize, initial_rsp as usize);
             let _ = syscall::write(*new_addr_space_sel_fd, &buf)?;
         }
-        copy_float_env_regs(*cur_pid_fd, *new_pid_fd)?;
+        copy_env_regs(*cur_pid_fd, *new_pid_fd)?;
     }
     // Copy the file table. We do this last to ensure that all previously used file descriptors are
     // closed. The only exception -- the filetable selection fd and the current filetable fd --
@@ -248,7 +239,10 @@ fork_wrapper:
     push r14
     push r15
 
-    sub rsp, 16
+    sub rsp, 32
+
+    stmxcsr [rsp+16]
+    fnstcw [rsp+24]
 
     mov rdi, rsp
     call __relibc_internal_fork_impl
@@ -258,9 +252,13 @@ fork_ret:
     mov rdi, [rsp]
     mov rsi, [rsp + 8]
     call __relibc_internal_fork_hook
+
+    ldmxcsr [rsp+16]
+    fldcw [rsp+24]
+
     xor rax, rax
 2:
-    add rsp, 16
+    add rsp, 32
     pop r15
     pop r14
     pop r13
diff --git a/src/platform/redox/redox-exec/src/lib.rs b/src/platform/redox/redox-exec/src/lib.rs
index aecb2b1bcc79d7e42b314470eab19e95bc545d81..f40e5535bdda4fb957b11113186fc13c53331f02 100644
--- a/src/platform/redox/redox-exec/src/lib.rs
+++ b/src/platform/redox/redox-exec/src/lib.rs
@@ -45,9 +45,7 @@ where
     };
     let memory_fd = FdGuard::new(syscall::dup(*grants_fd, b"mem")?);
 
-    let instruction_ptr = usize::try_from(header.e_entry).map_err(|_| Error::new(ENOEXEC))?;
-
-    // Never allow more than 1 MiB of program headers. TODO: Capabilities again?
+    // Never allow more than 1 MiB of program headers.
     const MAX_PH_SIZE: usize = 1024 * 1024;
     let phentsize = u64::from(header.e_phentsize) as usize;
     let phnum = u64::from(header.e_phnum) as usize;