Skip to main content

dobby_hook_core/
options.rs

1use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
2
3static NEAR_TRAMPOLINE: AtomicBool = AtomicBool::new(false);
4static ALLOC_NEAR_CODE_CB: AtomicUsize = AtomicUsize::new(0);
5
6pub type AllocNearCodeCallback = unsafe fn(size: u32, pos: usize, range: usize) -> usize;
7
8pub(crate) fn near_trampoline_enabled() -> bool {
9    NEAR_TRAMPOLINE.load(Ordering::Relaxed)
10}
11
12pub(crate) fn alloc_near_code_callback() -> Option<AllocNearCodeCallback> {
13    let p = ALLOC_NEAR_CODE_CB.load(Ordering::Relaxed);
14    if p == 0 {
15        None
16    } else {
17        Some(unsafe { core::mem::transmute::<usize, AllocNearCodeCallback>(p) })
18    }
19}
20
21pub fn set_near_trampoline(enable: bool) {
22    NEAR_TRAMPOLINE.store(enable, Ordering::Relaxed);
23}
24
25pub fn register_alloc_near_code_callback(handler: Option<AllocNearCodeCallback>) {
26    ALLOC_NEAR_CODE_CB.store(handler.map_or(0, |f| f as usize), Ordering::Relaxed);
27}
28
29pub fn set_options(
30    enable_near_trampoline: bool,
31    alloc_near_code_callback: Option<AllocNearCodeCallback>,
32) {
33    set_near_trampoline(enable_near_trampoline);
34    register_alloc_near_code_callback(alloc_near_code_callback);
35}