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 }