From ec235202fb82d1f1214be79bebcdcb2620a32d55 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 1 Apr 2025 20:53:33 +0200 Subject: [PATCH] Prepare instruction hook injection --- src/icicle/src/icicle.rs | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/icicle/src/icicle.rs b/src/icicle/src/icicle.rs index 85ec2f64..b1b3d9c4 100644 --- a/src/icicle/src/icicle.rs +++ b/src/icicle/src/icicle.rs @@ -96,6 +96,39 @@ impl HookContainer { } } +struct InstructionHookInjector { + hook: pcode::HookId, +} + +impl icicle_vm::CodeInjector for InstructionHookInjector { + fn inject( + &mut self, + _cpu: &mut icicle_vm::cpu::Cpu, + group: &icicle_vm::cpu::BlockGroup, + code: &mut icicle_vm::BlockTable, + ) { + for id in group.range() { + let block = &mut code.blocks[id]; + + let mut tmp_block = pcode::Block::new(); + tmp_block.next_tmp = block.pcode.next_tmp; + + for stmt in block.pcode.instructions.drain(..) { + tmp_block.push(stmt); + if let pcode::Op::InstructionMarker = stmt.op { + tmp_block.push(pcode::Op::Hook(self.hook)); + code.modified.insert(id); + } + } + + std::mem::swap( + &mut tmp_block.instructions, + &mut block.pcode.instructions, + ); + } + } +} + pub struct IcicleEmulator { vm: icicle_vm::Vm, reg: registers::X64RegisterNodes, @@ -133,7 +166,14 @@ impl icicle_cpu::mem::IoMemory for MmioHandler { impl IcicleEmulator { pub fn new() -> Self { - let virtual_machine = create_x64_vm(); + let mut virtual_machine = create_x64_vm(); + let hook = icicle_cpu::InstHook::new(move |_: &mut icicle_cpu::Cpu, addr: u64| { + println!("TEST hook: {:#x}", addr); + }); + + let hook = virtual_machine.cpu.add_hook(hook); + virtual_machine.add_injector(InstructionHookInjector { hook }); + Self { reg: registers::X64RegisterNodes::new(&virtual_machine.cpu.arch), vm: virtual_machine,