|
| 1 | +use std::ops::Range; |
| 2 | + |
1 | 3 | use ipc_channel::ipc;
|
2 | 4 | use nix::sys::{ptrace, signal, wait};
|
3 | 5 | use nix::unistd;
|
| 6 | +use rustc_const_eval::interpret::ForeignAccessKind; |
4 | 7 |
|
5 | 8 | use crate::discrete_alloc;
|
6 | 9 | use crate::helpers::ToU64;
|
@@ -186,45 +189,28 @@ pub enum TraceRequest {
|
186 | 189 |
|
187 | 190 | #[derive(serde::Serialize, serde::Deserialize, Debug)]
|
188 | 191 | pub struct MemEvents {
|
189 |
| - pub accesses: Vec<(u64, u64, MemAccessType)>, |
190 |
| - pub mappings: Vec<(u64, u64)>, |
| 192 | + pub accesses: Vec<(Range<u64>, i32)>, |
| 193 | + pub mappings: Vec<Range<u64>>, |
191 | 194 | }
|
192 | 195 |
|
193 |
| -#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] |
194 |
| -pub enum MemAccessType { |
195 |
| - Read, |
196 |
| - Write, |
197 |
| - ReadWrite, |
| 196 | +trait UpdateAcc { |
| 197 | + fn update(&mut self, other: ForeignAccessKind); |
198 | 198 | }
|
199 | 199 |
|
200 |
| -impl MemAccessType { |
201 |
| - fn update(&mut self, other: MemAccessType) { |
| 200 | +impl UpdateAcc for ForeignAccessKind { |
| 201 | + fn update(&mut self, other: ForeignAccessKind) { |
202 | 202 | match self {
|
203 |
| - MemAccessType::Read => |
| 203 | + ForeignAccessKind::Read => |
204 | 204 | match other {
|
205 |
| - MemAccessType::Read => (), |
206 |
| - _ => *self = MemAccessType::ReadWrite, |
| 205 | + ForeignAccessKind::Read => (), |
| 206 | + _ => *self = ForeignAccessKind::ReadWrite, |
207 | 207 | },
|
208 |
| - MemAccessType::Write => |
| 208 | + ForeignAccessKind::Write => |
209 | 209 | match other {
|
210 |
| - MemAccessType::Write => (), |
211 |
| - _ => *self = MemAccessType::ReadWrite, |
| 210 | + ForeignAccessKind::Write => (), |
| 211 | + _ => *self = ForeignAccessKind::ReadWrite, |
212 | 212 | },
|
213 |
| - MemAccessType::ReadWrite => (), |
214 |
| - } |
215 |
| - } |
216 |
| - |
217 |
| - pub fn did_read(&self) -> bool { |
218 |
| - match self { |
219 |
| - MemAccessType::Write => false, |
220 |
| - _ => true, |
221 |
| - } |
222 |
| - } |
223 |
| - |
224 |
| - pub fn did_write(&self) -> bool { |
225 |
| - match self { |
226 |
| - MemAccessType::Read => false, |
227 |
| - _ => true, |
| 213 | + ForeignAccessKind::ReadWrite => (), |
228 | 214 | }
|
229 | 215 | }
|
230 | 216 | }
|
@@ -284,7 +270,7 @@ impl Iterator for ChildListener {
|
284 | 270 | /// created before the fork are the same).
|
285 | 271 | fn sv_loop(listener: ChildListener, t_event: ipc::IpcSender<MemEvents>) -> ! {
|
286 | 272 | // Things that we return to the child process
|
287 |
| - let mut accesses: Vec<(u64, u64, MemAccessType)> = vec![]; |
| 273 | + let mut accesses: Vec<(u64, u64, ForeignAccessKind)> = vec![]; |
288 | 274 | let mut mappings: Vec<(u64, u64)> = vec![];
|
289 | 275 |
|
290 | 276 | // Memory allocated on the MiriMachine
|
@@ -422,7 +408,12 @@ fn sv_loop(listener: ChildListener, t_event: ipc::IpcSender<MemEvents>) -> ! {
|
422 | 408 |
|
423 | 409 | TraceRequest::EndFfi => {
|
424 | 410 | signal::kill(main_pid, signal::SIGSTOP).unwrap();
|
425 |
| - t_event.send(MemEvents { accesses, mappings }).unwrap(); |
| 411 | + t_event.send(MemEvents { |
| 412 | + accesses: accesses.into_iter().map(|(addr, len, kind)| { |
| 413 | + (addr..addr+len, kind as i32) |
| 414 | + }).collect(), |
| 415 | + mappings: mappings.into_iter().map(|(addr, len)| (addr..addr+len)).collect(), |
| 416 | + }).unwrap(); |
426 | 417 | accesses = vec![];
|
427 | 418 | mappings = vec![];
|
428 | 419 | if let Err(ret) = wait_for_signal(main_pid, signal::SIGSTOP, false) {
|
@@ -572,7 +563,7 @@ fn handle_munmap(
|
572 | 563 | fn handle_segfault(
|
573 | 564 | pid: unistd::Pid,
|
574 | 565 | ch_pages: &[u64],
|
575 |
| - accesses: &mut Vec<(u64, u64, MemAccessType)>, |
| 566 | + accesses: &mut Vec<(u64, u64, ForeignAccessKind)>, |
576 | 567 | ) -> Result<(), i32> {
|
577 | 568 | let siginfo = ptrace::getsiginfo(pid).unwrap();
|
578 | 569 | let addr = unsafe { siginfo.si_addr().addr().to_u64() };
|
@@ -627,14 +618,14 @@ fn handle_segfault(
|
627 | 618 | let instr = decoder.decode();
|
628 | 619 | let memsize = instr.op_code().memory_size().size().to_u64();
|
629 | 620 | let mem = fac.info(&instr).used_memory();
|
630 |
| - let acc = mem.iter().fold(None, |mut curr: Option<MemAccessType>, m| { |
| 621 | + let acc = mem.iter().fold(None, |mut curr: Option<ForeignAccessKind>, m| { |
631 | 622 | if let Some(m) = match m.access() {
|
632 |
| - iced_x86::OpAccess::Read => Some(MemAccessType::Read), |
633 |
| - iced_x86::OpAccess::CondRead => Some(MemAccessType::Read), |
634 |
| - iced_x86::OpAccess::Write => Some(MemAccessType::Write), |
635 |
| - iced_x86::OpAccess::CondWrite => Some(MemAccessType::Write), |
636 |
| - iced_x86::OpAccess::ReadWrite => Some(MemAccessType::ReadWrite), |
637 |
| - iced_x86::OpAccess::ReadCondWrite => Some(MemAccessType::ReadWrite), |
| 623 | + iced_x86::OpAccess::Read => Some(ForeignAccessKind::Read), |
| 624 | + iced_x86::OpAccess::CondRead => Some(ForeignAccessKind::Read), |
| 625 | + iced_x86::OpAccess::Write => Some(ForeignAccessKind::Write), |
| 626 | + iced_x86::OpAccess::CondWrite => Some(ForeignAccessKind::Write), |
| 627 | + iced_x86::OpAccess::ReadWrite => Some(ForeignAccessKind::ReadWrite), |
| 628 | + iced_x86::OpAccess::ReadCondWrite => Some(ForeignAccessKind::ReadWrite), |
638 | 629 | _ => None,
|
639 | 630 | } {
|
640 | 631 | if let Some(curr) = curr.as_mut() {
|
|
0 commit comments