diff --git a/Cargo.lock b/Cargo.lock
index c3930bbe31fbf770d6b60f12e230e77d086a3022..3b779406032ee7ae5c3b076400618cd006f787a1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,6 +5,11 @@ name = "autocfg"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "bitflags"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "cbitset"
 version = "0.1.0"
@@ -158,7 +163,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 [[package]]
 name = "redox_syscall"
 version = "0.1.56"
-source = "git+https://gitlab.redox-os.org/redox-os/syscall#9e9f47d2a570c55dd96cd80c83bc818d63cab8af"
+source = "git+https://gitlab.redox-os.org/jD91mZM2/syscall?branch=ptrace-6#a0581db1fa26da148ad6bb35975be084d1504f58"
+dependencies = [
+ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
 
 [[package]]
 name = "redox_syscall"
@@ -179,7 +187,7 @@ dependencies = [
  "posix-regex 0.1.0",
  "ralloc 1.0.0",
  "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/redox-os/syscall)",
+ "redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/jD91mZM2/syscall?branch=ptrace-6)",
  "sc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -269,6 +277,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [metadata]
 "checksum autocfg 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "22130e92352b948e7e82a49cdb0aa94f2211761117f29e052dd397c1ac33542b"
+"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
 "checksum cbitset 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3a9afa72f63942dd7e7f01c67b863ce9df35c523ae10e3dddd3eec8f1e07eac"
 "checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46"
 "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
@@ -284,7 +293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9"
 "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
 "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
-"checksum redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/redox-os/syscall)" = "<none>"
+"checksum redox_syscall 0.1.56 (git+https://gitlab.redox-os.org/jD91mZM2/syscall?branch=ptrace-6)" = "<none>"
 "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
 "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
 "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
diff --git a/Cargo.toml b/Cargo.toml
index 3d9804d91b14459ed134b0c2fcff7e9cdb717221..729f1cca7f2d9d908fa49253ef67e8399b1f1702 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,7 +37,7 @@ optional = true
 sc = "0.2.2"
 
 [target.'cfg(target_os = "redox")'.dependencies]
-redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall" }
+redox_syscall = { git = "https://gitlab.redox-os.org/jD91mZM2/syscall", branch = "ptrace-6" }
 spin = "0.4.10"
 
 [features]
diff --git a/src/platform/redox/epoll.rs b/src/platform/redox/epoll.rs
index 397dbd0f79e0b61e01ba98a5f93dfbb816062721..88ba6c5dee3c348c63562fd5ea1f049f9ca35efa 100644
--- a/src/platform/redox/epoll.rs
+++ b/src/platform/redox/epoll.rs
@@ -25,7 +25,7 @@ impl PalEpoll for Sys {
                     epfd,
                     &Event {
                         id: fd as usize,
-                        flags: unsafe { (*event).events as usize },
+                        flags: syscall::EventFlags::from_bits(unsafe { (*event).events as usize }).expect("epoll: invalid bit pattern"),
                         // NOTE: Danger when using non 64-bit systems. If this is
                         // needed, use a box or something
                         data: unsafe { mem::transmute((*event).data) },
@@ -37,7 +37,7 @@ impl PalEpoll for Sys {
                     epfd,
                     &Event {
                         id: fd as usize,
-                        flags: 0,
+                        flags: syscall::EventFlags::empty(),
                         //TODO: Is data required?
                         data: 0,
                     },
@@ -113,7 +113,7 @@ impl PalEpoll for Sys {
                     }
                 }
                 *event_ptr = epoll_event {
-                    events: event.flags as _,
+                    events: event.flags.bits() as _,
                     data: mem::transmute(event.data),
                     ..Default::default()
                 };
diff --git a/src/platform/redox/extra.rs b/src/platform/redox/extra.rs
index f28bc7036bed60a98e139792acd923e310667c68..b451e0a4f3bd04489215b5e615db6e759d851683 100644
--- a/src/platform/redox/extra.rs
+++ b/src/platform/redox/extra.rs
@@ -35,7 +35,7 @@ pub unsafe extern "C" fn redox_physmap(
     let res = e(syscall::physmap(
         physical_address as usize,
         size,
-        flags as usize,
+        syscall::PhysmapFlags::from_bits(flags as usize).expect("physmap: invalid bit pattern"),
     ));
     if res == !0 {
         return ptr::null_mut();
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 984890cc1b9b083e4a27e41fc7ce89ebeaa6e775..76e272f4c2a016ea2f473fb7157f1bfad6871bb8 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -310,7 +310,7 @@ impl Pal for Sys {
     }
 
     fn fork() -> pid_t {
-        e(unsafe { syscall::clone(0) }) as pid_t
+        e(unsafe { syscall::clone(syscall::CloneFlags::empty()) }) as pid_t
     }
 
     fn fstat(fildes: c_int, buf: *mut stat) -> c_int {
@@ -631,7 +631,7 @@ impl Pal for Sys {
         let map = Map {
             offset: off as usize,
             size: len,
-            flags: ((prot as usize) << 16) | ((flags as usize) & 0xFFFF),
+            flags: syscall::MapFlags::from_bits_truncate(((prot as usize) << 16) | ((flags as usize) & 0xFFFF)),
         };
 
         if flags & MAP_ANON == MAP_ANON {
@@ -654,7 +654,11 @@ impl Pal for Sys {
     }
 
     unsafe fn mprotect(addr: *mut c_void, len: usize, prot: c_int) -> c_int {
-        e(syscall::mprotect(addr as usize, len, (prot as usize) << 16)) as c_int
+        e(syscall::mprotect(
+            addr as usize,
+            len,
+            syscall::MapFlags::from_bits((prot as usize) << 16).expect("mprotect: invalid bit pattern")
+        )) as c_int
     }
 
     unsafe fn munmap(addr: *mut c_void, _len: usize) -> c_int {
@@ -924,17 +928,20 @@ impl Pal for Sys {
         let mut res = None;
         let mut status = 0;
 
+        let inner = |status: &mut usize, flags| syscall::waitpid(
+            pid as usize,
+            status,
+            syscall::WaitFlags::from_bits(flags as usize).expect("waitpid: invalid bit pattern")
+        );
+
         // First, allow ptrace to handle waitpid
         // TODO: Handle special PIDs here (such as -1)
         let state = ptrace::init_state();
         let mut sessions = state.sessions.lock();
         if let Ok(session) = ptrace::get_session(&mut sessions, pid) {
             if options & sys_wait::WNOHANG != sys_wait::WNOHANG {
-                let _ = (&mut &session.tracer).write(&[syscall::PTRACE_WAIT]);
-                res = Some(e(syscall::waitpid(
-                    pid as usize, &mut status,
-                    (options | sys_wait::WNOHANG | sys_wait::WUNTRACED) as usize
-                )));
+                let _ = (&mut &session.tracer).write(&syscall::PTRACE_FLAG_WAIT.bits().to_ne_bytes());
+                res = Some(e(inner(&mut status, options | sys_wait::WNOHANG | sys_wait::WUNTRACED)));
                 if res == Some(0) {
                     // WNOHANG, just pretend ptrace SIGSTOP:ped this
                     status = (syscall::SIGSTOP << 8) | 0x7f;
@@ -950,7 +957,7 @@ impl Pal for Sys {
         // it if (and only if) a ptrace traceme was activated during
         // the wait.
         let res = res.unwrap_or_else(|| loop {
-            let res = e(syscall::waitpid(pid as usize, &mut status, (options | sys_wait::WUNTRACED) as usize));
+            let res = e(inner(&mut status, options | sys_wait::WUNTRACED));
 
             // TODO: Also handle special PIDs here
             if !syscall::wifstopped(res) || ptrace::is_traceme(pid) {
diff --git a/src/platform/redox/ptrace.rs b/src/platform/redox/ptrace.rs
index e80a00bce879aa3bdd4a7b35539327bcd332ff1e..07b8b93c0983d6b05c5a4e7a4d13b7e9b5f6ce7f 100644
--- a/src/platform/redox/ptrace.rs
+++ b/src/platform/redox/ptrace.rs
@@ -84,14 +84,15 @@ fn inner_ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void
             Sys::kill(pid, signal::SIGCONT as _);
 
             // TODO: Translate errors
-            (&mut &session.tracer).write(&[match request {
-                sys_ptrace::PTRACE_CONT => syscall::PTRACE_CONT,
-                sys_ptrace::PTRACE_SINGLESTEP => syscall::PTRACE_SINGLESTEP,
-                sys_ptrace::PTRACE_SYSCALL => syscall::PTRACE_SYSCALL,
-                sys_ptrace::PTRACE_SYSEMU => syscall::PTRACE_SYSEMU | syscall::PTRACE_SYSCALL,
-                sys_ptrace::PTRACE_SYSEMU_SINGLESTEP => syscall::PTRACE_SYSEMU | syscall::PTRACE_SINGLESTEP,
+            let syscall = syscall::PTRACE_STOP_PRE_SYSCALL.bits() | syscall::PTRACE_STOP_POST_SYSCALL.bits();
+            (&mut &session.tracer).write(&match request {
+                sys_ptrace::PTRACE_CONT => 0,
+                sys_ptrace::PTRACE_SINGLESTEP => syscall::PTRACE_STOP_SINGLESTEP.bits(),
+                sys_ptrace::PTRACE_SYSCALL => syscall,
+                sys_ptrace::PTRACE_SYSEMU => syscall::PTRACE_FLAG_SYSEMU.bits() | syscall,
+                sys_ptrace::PTRACE_SYSEMU_SINGLESTEP => syscall::PTRACE_FLAG_SYSEMU.bits() | syscall::PTRACE_STOP_SINGLESTEP.bits(),
                 _ => unreachable!("unhandled ptrace request type {}", request)
-            }])?;
+            }.to_ne_bytes())?;
             Ok(0)
         },
         sys_ptrace::PTRACE_GETREGS => {
diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs
index c3d28604d3ae1a81101ba5437a32a5c24ee39213..c22f53d5b5c16d2de53fd3cf48f3f71787410403 100644
--- a/src/platform/redox/signal.rs
+++ b/src/platform/redox/signal.rs
@@ -108,7 +108,8 @@ impl PalSignal for Sys {
             Some(syscall::SigAction {
                 sa_handler: mem::transmute((*act).sa_handler),
                 sa_mask: [m as u64, 0],
-                sa_flags: (*act).sa_flags as usize,
+                sa_flags: syscall::SigActionFlags::from_bits((*act).sa_flags as usize)
+                    .expect("sigaction: invalid bit pattern"),
             })
         };
         let mut old_opt = if oact.is_null() {
@@ -125,7 +126,7 @@ impl PalSignal for Sys {
             (*oact).sa_handler = mem::transmute(old.sa_handler);
             let m = old.sa_mask;
             (*oact).sa_mask = m[0] as c_ulong;
-            (*oact).sa_flags = old.sa_flags as c_ulong;
+            (*oact).sa_flags = old.sa_flags.bits() as c_ulong;
         }
         ret
     }