(mut vm: Vm, mut target: CortexmMultiStream)
| 215 | } |
| 216 | |
| 217 | fn replay_trace(mut vm: Vm, mut target: CortexmMultiStream) -> anyhow::Result<()> { |
| 218 | let path_tracer = trace::add_path_tracer(&mut vm, target.mmio_handler.unwrap())?; |
| 219 | |
| 220 | let mut cmplog = None; |
| 221 | if icicle_fuzzing::parse_bool_env("REPLAY_CMPLOG")?.unwrap_or(false) { |
| 222 | let cmplog_ref = |
| 223 | icicle_fuzzing::cmplog2::CmpLog2Builder::new().instrument_calls(true).finish(&mut vm); |
| 224 | cmplog_ref.set_enabled(&mut vm.cpu, true); |
| 225 | cmplog = Some(cmplog_ref); |
| 226 | } |
| 227 | |
| 228 | icicle_fuzzing::add_debug_instrumentation(&mut vm); |
| 229 | |
| 230 | let exit = target.run(&mut vm)?; |
| 231 | |
| 232 | let xpsr = vm.cpu.arch.sleigh.get_varnode("xpsr").unwrap(); |
| 233 | let active_irq = vm.cpu.read_reg(xpsr) & 0x1ff; |
| 234 | eprintln!( |
| 235 | "\n[icicle] exited with: {} (icount = {}), active_irq = {active_irq}", |
| 236 | target.exit_string(exit), |
| 237 | vm.cpu.icount() |
| 238 | ); |
| 239 | eprintln!("[icicle] callstack:\n{}", icicle_vm::debug::backtrace(&mut vm)); |
| 240 | |
| 241 | let print_count = match std::env::var("PRINT_LAST_BLOCKS").ok() { |
| 242 | Some(c) => c.parse().context("Failed to parse `PRINT_LAST_BLOCKS` environment variable")?, |
| 243 | None => 10, |
| 244 | }; |
| 245 | eprintln!("[icicle] last blocks:\n{}", path_tracer.print_last_blocks(&mut vm, print_count)); |
| 246 | |
| 247 | let reglist = icicle_vm::debug::get_debug_regs(&vm.cpu); |
| 248 | eprintln!("registers:\n{}", icicle_vm::debug::print_regs(&vm, ®list)); |
| 249 | |
| 250 | if let Some(cmplog) = cmplog { |
| 251 | log_cmplog_data(&mut vm, cmplog, "cmplog.txt".as_ref())?; |
| 252 | } |
| 253 | if icicle_fuzzing::parse_bool_env("SAVE_TRACE")?.unwrap_or(true) { |
| 254 | let symbolize = icicle_fuzzing::parse_bool_env("SYMBOLIZE_TRACE")?.unwrap_or(false); |
| 255 | path_tracer.save_trace(&mut vm, "trace.txt".as_ref(), symbolize); |
| 256 | } |
| 257 | if icicle_fuzzing::parse_bool_env("SAVE_MMIO_READS")?.unwrap_or(false) { |
| 258 | trace::save_mmio_reads("mmio_reads.txt".as_ref(), &path_tracer.get_mmio_reads(&mut vm)); |
| 259 | } |
| 260 | if icicle_fuzzing::parse_bool_env("DEBUG_IL")?.unwrap_or(false) { |
| 261 | std::fs::write("il.pcode", icicle_vm::debug::dump_semantics(&vm)?)?; |
| 262 | } |
| 263 | |
| 264 | Ok(()) |
| 265 | } |
| 266 | |
| 267 | pub fn analyze_crashes(mut config: Config, path: &str) -> anyhow::Result<()> { |
| 268 | let features = config::EnabledFeatures::from_env()?; |
no test coverage detected