| 23 | } |
| 24 | |
| 25 | fn build_models(models: &config::MmioModels) -> (Vec<Model>, Vec<u32>) { |
| 26 | let bitextract = models.bitextract.values().map(|x| Model { |
| 27 | pc: x.pc, |
| 28 | addr: x.addr as u32, |
| 29 | kind: ModelKind::Bitextract { size: x.size, left_shift: x.left_shift, mask: x.mask }, |
| 30 | }); |
| 31 | let constant = models.constant.values().map(|x| Model { |
| 32 | pc: x.pc, |
| 33 | addr: x.addr as u32, |
| 34 | kind: ModelKind::Constant { val: x.val }, |
| 35 | }); |
| 36 | let mut passthrough_id = 0; |
| 37 | let passthrough = models.passthrough.values().map(|x| { |
| 38 | let id = passthrough_id; |
| 39 | passthrough_id += 1; |
| 40 | Model { pc: x.pc, addr: x.addr as u32, kind: ModelKind::Passthrough { id } } |
| 41 | }); |
| 42 | let passthrough_data = models.passthrough.values().map(|x| x.init_val).collect(); |
| 43 | |
| 44 | let set = models.set.values().map(|x| Model { |
| 45 | pc: x.pc, |
| 46 | addr: x.addr as u32, |
| 47 | kind: ModelKind::Set { values: x.vals.clone() }, |
| 48 | }); |
| 49 | (bitextract.chain(constant).chain(passthrough).chain(set).collect(), passthrough_data) |
| 50 | } |
| 51 | |
| 52 | /// A re-implemented fuzzware MMIO handler |
| 53 | pub struct FuzzwareMmioHandler<I> { |