ppp_callback_export/
ppp_callback_export.rs1use panda::export_ppp_callback;
2use panda::prelude::*;
3
4export_ppp_callback! {
5 pub(crate) fn on_every_odd_block(cpu: &mut CPUState) -> bool;
7 pub(crate) fn on_every_even_block(cpu: &mut CPUState);
8}
9
10fn main() {
11 let mut i = 0;
12 let callback = panda::Callback::new();
13 callback.before_block_exec(move |cpu, _| {
14 if i % 2 == 0 {
15 on_every_even_block::trigger(cpu);
16 } else {
17 if on_every_odd_block::trigger(cpu) {
18 callback.disable();
19 }
20 }
21 i += 1;
22 });
23
24 on_every_even_block::add_callback(on_even_test);
25 on_every_odd_block::add_callback(on_odd_test);
26
27 Panda::new().generic("x86_64").replay("test").run();
28}
29
30use std::sync::atomic::{AtomicUsize, Ordering};
33
34static TEST_COUNTER: AtomicUsize = AtomicUsize::new(0);
36
37extern "C" fn on_odd_test(_: &mut CPUState) -> bool {
38 println!("Odd!");
39
40 TEST_COUNTER.fetch_add(1, Ordering::SeqCst) >= 3
41}
42
43extern "C" fn on_even_test(_: &mut CPUState) {
44 println!("Even!");
45}