(mut config: Config, mode: SaveMode)
| 38 | } |
| 39 | |
| 40 | pub fn save_block_coverage(mut config: Config, mode: SaveMode) -> anyhow::Result<()> { |
| 41 | let mut testcases: Vec<InputMetadata> = load_json(&config.workdir.join("testcases.json"))?; |
| 42 | testcases.sort_by_key(|x| x.found_at); |
| 43 | |
| 44 | let features = config::EnabledFeatures::from_env()?; |
| 45 | let (mut target, mut vm) = setup_vm(&mut config, &features)?; |
| 46 | target.initialize_vm(&config.fuzzer, &mut vm)?; |
| 47 | |
| 48 | let mut coverage = |
| 49 | crate::coverage::BlockCoverage::init(&mut vm, crate::coverage::BucketStrategy::Any, true); |
| 50 | |
| 51 | let snapshot = vm.snapshot(); |
| 52 | |
| 53 | let mut all_blocks = vec![]; |
| 54 | let mut block_map = HashMap::new(); |
| 55 | let mut output = vec![]; |
| 56 | for case in testcases { |
| 57 | vm.restore(&snapshot); |
| 58 | coverage.reset(&mut vm); |
| 59 | |
| 60 | let input = MultiStream::from_path(&config.workdir.join(format!("queue/{}.bin", case.id)))?; |
| 61 | target.get_mmio_handler(&mut vm).unwrap().clone_from(&input); |
| 62 | |
| 63 | target.run(&mut vm)?; |
| 64 | |
| 65 | let blocks = coverage.get_blocks(&mut vm); |
| 66 | let hits = blocks |
| 67 | .into_iter() |
| 68 | .map(|addr| { |
| 69 | *block_map.entry(addr).or_insert_with(|| { |
| 70 | let id = all_blocks.len(); |
| 71 | all_blocks.push((addr, case.found_at, case.id)); |
| 72 | id |
| 73 | }) |
| 74 | }) |
| 75 | .collect::<Vec<_>>(); |
| 76 | |
| 77 | output.push(serde_json::json!({ |
| 78 | "id": case.id, |
| 79 | "time_ms": case.found_at, |
| 80 | "hits": hits, |
| 81 | })); |
| 82 | } |
| 83 | |
| 84 | let out = match mode { |
| 85 | SaveMode::Full => serde_json::json!({ "blocks": all_blocks, "inputs": output }), |
| 86 | SaveMode::BlocksOnly => serde_json::json!(all_blocks), |
| 87 | }; |
| 88 | write!(std::io::stdout(), "{out}")?; |
| 89 | |
| 90 | Ok(()) |
| 91 | } |
| 92 | |
| 93 | pub fn replay(mut config: Config, path: &str) -> anyhow::Result<()> { |
| 94 | let features = config::EnabledFeatures::from_env()?; |
no test coverage detected