diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index f63870866c915fe49d3d26ebcd002218a245c975..f125166fa920eeb68a6696a13d6298f765519c96 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -138,27 +138,23 @@ pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int {
 }
 
 pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
-    unsafe {
-        let redox_rqtp = redox_timespec {
-            tv_sec: (*rqtp).tv_sec,
-            tv_nsec: (*rqtp).tv_nsec as i32,
-        };
-        let mut redox_rmtp: redox_timespec;
-        if rmtp.is_null() {
-            redox_rmtp = redox_timespec::default();
-        } else {
-            redox_rmtp = redox_timespec {
-                tv_sec: (*rmtp).tv_sec,
-                tv_nsec: (*rmtp).tv_nsec as i32,
-            };
-        }
-        match e(syscall::nanosleep(&redox_rqtp, &mut redox_rmtp)) as c_int {
-            -1 => -1,
-            _ => {
-                (*rmtp).tv_sec = redox_rmtp.tv_sec;
-                (*rmtp).tv_nsec = redox_rmtp.tv_nsec as i64;
-                0
+    let redox_rqtp = unsafe { redox_timespec::from(&*rqtp) };
+    let mut redox_rmtp: redox_timespec;
+    if rmtp.is_null() {
+        redox_rmtp = redox_timespec::default();
+    } else {
+        redox_rmtp = unsafe { redox_timespec::from(&*rmtp) };
+    }
+    match e(syscall::nanosleep(&redox_rqtp, &mut redox_rmtp)) as c_int {
+        -1 => -1,
+        _ => {
+            unsafe {
+                if !rmtp.is_null() {
+                    (*rmtp).tv_sec = redox_rmtp.tv_sec;
+                    (*rmtp).tv_nsec = redox_rmtp.tv_nsec as i64;
+                }
             }
+            0
         }
     }
 }
diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs
index 9268bf55c319265d6cd424479ae4394720993799..d6e19dbd580c8ad2b5bbbe1934cacabacc1bfc22 100644
--- a/src/platform/src/types.rs
+++ b/src/platform/src/types.rs
@@ -1,3 +1,5 @@
+#[cfg(target_os = "redox")]
+use syscall::data::TimeSpec as redox_timespec;
 // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable
 // more optimization opportunities around it recognizing things like
 // malloc/free.
@@ -70,3 +72,13 @@ pub struct timespec {
     pub tv_sec: time_t,
     pub tv_nsec: c_long,
 }
+
+#[cfg(target_os = "redox")]
+impl<'a> From<&'a timespec> for redox_timespec {
+    fn from(tp: &timespec) -> redox_timespec {
+        redox_timespec {
+            tv_sec: tp.tv_sec,
+            tv_nsec: tp.tv_nsec as i32,
+        }
+    }
+}