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
8// These helpers are currently only used by the x86_64 trampoline relocation path.
9// Keep them cfg-gated so non-x86_64 builds don't trip -D dead-code.
10#[cfg(target_arch = "x86_64")]
11pub(crate) fn near_trampoline_enabled() -> bool {
12    NEAR_TRAMPOLINE.load(Ordering::Relaxed)
13}
14
15#[cfg(target_arch = "x86_64")]
16pub(crate) fn alloc_near_code_callback() -> Option<AllocNearCodeCallback> {
17    let p = ALLOC_NEAR_CODE_CB.load(Ordering::Relaxed);
18    if p == 0 {
19        None
20    } else {
21        Some(unsafe { core::mem::transmute::<usize, AllocNearCodeCallback>(p) })
22    }
23}
24
25pub fn set_near_trampoline(enable: bool) {
26    NEAR_TRAMPOLINE.store(enable, Ordering::Relaxed);
27}
28
29pub fn register_alloc_near_code_callback(handler: Option<AllocNearCodeCallback>) {
30    ALLOC_NEAR_CODE_CB.store(handler.map_or(0, |f| f as usize), Ordering::Relaxed);
31}
32
33pub fn set_options(
34    enable_near_trampoline: bool,
35    alloc_near_code_callback: Option<AllocNearCodeCallback>,
36) {
37    set_near_trampoline(enable_near_trampoline);
38    register_alloc_near_code_callback(alloc_near_code_callback);
39}