| 402 | } |
| 403 | |
| 404 | fn write_ihex_bytes( |
| 405 | vm: &mut icicle_vm::Vm, |
| 406 | region: &config::Memory, |
| 407 | data: &[u8], |
| 408 | ) -> anyhow::Result<()> { |
| 409 | let input = |
| 410 | std::str::from_utf8(&data).map_err(|e| anyhow::format_err!("invalid ihex file: {e}"))?; |
| 411 | |
| 412 | let reader = ihex::Reader::new(input); |
| 413 | let mut base_addr = region.base_addr; |
| 414 | for entry in reader { |
| 415 | match entry.map_err(|e| anyhow::format_err!("invalid ihex file: {e}"))? { |
| 416 | ihex::Record::Data { offset, value } => { |
| 417 | let addr = base_addr + offset as u64; |
| 418 | vm.cpu.mem.write_bytes(addr, &value, perm::NONE).map_err(|e| { |
| 419 | anyhow::format_err!("failed to write to memory at {addr:#0x}: {e}") |
| 420 | })?; |
| 421 | let perm = region.permissions.0; |
| 422 | vm.cpu.mem.update_perm(addr, value.len() as u64, perm).map_err(|e| { |
| 423 | anyhow::format_err!("failed to update permissions at {addr:#0x}: {e}") |
| 424 | })?; |
| 425 | } |
| 426 | ihex::Record::StartLinearAddress(addr) => base_addr = addr as u64, |
| 427 | ihex::Record::ExtendedLinearAddress(upper_addr) => { |
| 428 | base_addr = (base_addr & 0xffff) | ((upper_addr as u64) << 16); |
| 429 | } |
| 430 | ihex::Record::EndOfFile => break, |
| 431 | other => anyhow::bail!("Unsupported ihex record: {other:x?}"), |
| 432 | } |
| 433 | } |
| 434 | |
| 435 | Ok(()) |
| 436 | } |
| 437 | |
| 438 | impl<T> icicle_fuzzing::Runnable for CortexmTarget<T> { |
| 439 | fn set_input(&mut self, _vm: &mut icicle_vm::Vm, _input: &[u8]) -> anyhow::Result<()> { |