use std::arch::asm;
const MAGIC_NUMBER: u64 = 1129578496;
#[doc(hidden)]
#[inline(always)]
unsafe fn request(default: u64, args: &[u64; 6]) -> u64 {
let result;
asm!(
"rol rdi, 3
rol rdi, 13
rol rdi, 61
rol rdi, 51
xchg rbx,rbx",
inout("rdx") default=>result,
in("rax") args.as_ptr()
);
result
}
#[inline(always)]
pub fn toggle_collection() {
unsafe { request(0, &[MAGIC_NUMBER + 2, 0, 0, 0, 0, 0]) };
}
#[inline(always)]
pub fn start_instrumentation() {
unsafe { request(0, &[MAGIC_NUMBER + 4, 0, 0, 0, 0, 0]) };
}
#[inline(always)]
pub fn stop_instrumentation() {
unsafe { request(0, &[MAGIC_NUMBER + 5, 0, 0, 0, 0, 0]) };
}
#[inline(always)]
pub fn start() {
start_instrumentation();
toggle_collection();
}
#[inline(always)]
pub fn stop() {
toggle_collection();
stop_instrumentation();
}