diff --git a/reverie-ptrace/src/task.rs b/reverie-ptrace/src/task.rs index 40e7c0d..acef72a 100644 --- a/reverie-ptrace/src/task.rs +++ b/reverie-ptrace/src/task.rs @@ -535,7 +535,7 @@ fn set_ret(task: &Stopped, ret: Reg) -> Result { let mut regs = task.getregs()?; let old = regs.ret(); *regs.ret_mut() = ret; - task.setregs(regs)?; + task.setregs(®s)?; Ok(old) } @@ -611,7 +611,7 @@ fn restore_context( // them, because the syscall is finished and they're supposed to change. // TL&DR: do not restore %rcx/%r11 here. - task.setregs(regs) + task.setregs(®s) } impl TracedTask { @@ -671,7 +671,7 @@ impl TracedTask { 0, )); - task.setregs(regs)?; + task.setregs(®s)?; // Execute the injected mmap call. let mut running = task.step(None)?; @@ -713,7 +713,7 @@ impl TracedTask { cp::populate_mmap_page(task.pid().into(), page_addr).map_err(|err| err)?; // Restore our saved registers, including our instruction pointer. - task.setregs(*saved_regs)?; + task.setregs(saved_regs)?; Ok(task) } @@ -767,7 +767,7 @@ impl TracedTask { // PTRACE_POKEDATA. let ip = AddrMut::from_raw(regs.ip() as usize).unwrap(); task.write_value(ip, &saved)?; - task.setregs(regs)?; + task.setregs(®s)?; Ok(()) } @@ -806,7 +806,7 @@ impl TracedTask { // Restore registers again after we've injected syscalls so that we // don't leave the return value register (%rax) in a dirty state. - task.setregs(regs)?; + task.setregs(®s)?; Ok(task) } @@ -973,12 +973,12 @@ impl TracedTask { Ok(match trap_info { Some(SegfaultTrapInfo::Cpuid) => { let regs = self.handle_cpuid(regs).await?; - task.setregs(regs)?; + task.setregs(®s)?; HandleSignalResult::SignalSuppressed(task.resume(None)?.next_state().await?) } Some(SegfaultTrapInfo::Rdtscs(req)) => { let regs = self.handle_rdtscs(regs, req).await?; - task.setregs(regs)?; + task.setregs(®s)?; HandleSignalResult::SignalSuppressed(task.resume(None)?.next_state().await?) } None => HandleSignalResult::SignalToDeliver(task, Signal::SIGSEGV), @@ -1519,7 +1519,7 @@ impl TracedTask { { let mut new_regs = regs; *new_regs.orig_syscall_mut() = -1i64 as u64; - task.setregs(new_regs)?; + task.setregs(&new_regs)?; } #[cfg(target_arch = "aarch64")] @@ -1534,7 +1534,7 @@ impl TracedTask { match running.next_state().await? { Wait::Stopped(task, Event::Signal(Signal::SIGTRAP)) => { #[cfg(target_arch = "x86_64")] - task.setregs(regs)?; + task.setregs(®s)?; break Ok(task); } Wait::Stopped(task, Event::Signal(sig)) => { @@ -1595,7 +1595,7 @@ impl TracedTask { // `populate_mmap_page` for details. *regs.ip_mut() = cp::PRIVATE_PAGE_OFFSET as Reg; - task.setregs(regs)?; + task.setregs(®s)?; // Step to run the syscall instruction. let wait = task.step(None)?.next_state().await?; @@ -1878,7 +1878,7 @@ impl TracedTask { task: Stopped, regs: libc::user_regs_struct, ) -> Result { - task.setregs(regs)?; + task.setregs(®s)?; // Task could be hitting a breakpoint, after previously suspended by // a different task, need to notify this task is fully stopped. @@ -2093,8 +2093,8 @@ impl TracedTask { fn write_registers(&self, core_regs: CoreRegs) -> Result<(), TraceError> { let task = self.assume_stopped(); let (regs, fpregs) = core_regs.into_parts(); - task.setregs(regs)?; - task.setfpregs(fpregs)?; + task.setregs(®s)?; + task.setfpregs(&fpregs)?; Ok(()) } } diff --git a/safeptrace/src/lib.rs b/safeptrace/src/lib.rs index 2cea566..ba26804 100644 --- a/safeptrace/src/lib.rs +++ b/safeptrace/src/lib.rs @@ -538,10 +538,10 @@ impl Stopped { Ok(unsafe { regs.assume_init() }) } - fn setregset(&self, which: i32, regs: T) -> Result<(), Error> { + fn setregset(&self, which: i32, regs: &T) -> Result<(), Error> { let iov = libc::iovec { - iov_base: ®s as *const _ as *mut _, - iov_len: core::mem::size_of_val(®s), + iov_base: regs as *const _ as *mut _, + iov_len: core::mem::size_of::(), }; unsafe { @@ -566,7 +566,7 @@ impl Stopped { } /// Sets the general purpose registers. - pub fn setregs(&self, regs: Regs) -> Result<(), Error> { + pub fn setregs(&self, regs: &Regs) -> Result<(), Error> { self.setregset(libc::NT_PRSTATUS, regs) } @@ -576,7 +576,7 @@ impl Stopped { } /// Sets the floating point registers. - pub fn setfpregs(&self, regs: FpRegs) -> Result<(), Error> { + pub fn setfpregs(&self, regs: &FpRegs) -> Result<(), Error> { self.setregset(libc::NT_PRFPREG, regs) } @@ -614,7 +614,7 @@ impl Stopped { #[cfg(target_arch = "aarch64")] pub fn set_syscall(&self, nr: i32) -> Result<(), Error> { const NT_ARM_SYSTEM_CALL: i32 = 0x404; - self.setregset(NT_ARM_SYSTEM_CALL, nr) + self.setregset(NT_ARM_SYSTEM_CALL, &nr) } /// Gets info about the signal that caused the process to be stopped.