Browse Source

Update redox_syscall to use bitflags

jD91mZM2 5 years ago
parent
commit
72c2f59f17

+ 12 - 3
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"

+ 1 - 1
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]

+ 3 - 3
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()
                 };

+ 1 - 1
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();

+ 16 - 9
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) {

+ 8 - 7
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 => {

+ 3 - 2
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
     }