ppp_callback_export/
ppp_callback_export.rs

1use panda::export_ppp_callback;
2use panda::prelude::*;
3
4export_ppp_callback! {
5    // disables all callbacks when true is returned
6    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
30// ===== test callbacks ======
31
32use std::sync::atomic::{AtomicUsize, Ordering};
33
34// using a global variable to keep track and disable after 3 odds
35static 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}