zsim_hooks/
lib.rs

1// Ported from zsim/misc/zsim_hooks.h
2use std::arch::asm;
3use std::sync::atomic::{compiler_fence, Ordering};
4
5enum ZSimMagic {
6    RoiBegin = 1025,
7    RoiEnd = 1026,
8    RegisterThread = 1027,
9    HeartBeat = 1028,
10    WorkBegin = 1029,
11    WorkEnd = 1030,
12}
13
14#[cfg(target_arch = "x86_64")]
15#[inline]
16fn zsim_magic_op(op: u64) {
17    compiler_fence(Ordering::SeqCst);
18    unsafe {
19        asm!("xchg rcx, rcx", in("rcx") op);
20    }
21    compiler_fence(Ordering::SeqCst);
22}
23
24#[cfg(not(target_arch = "x86_64"))]
25#[inline]
26fn zsim_magic_op(_op: u64) {}
27
28#[inline]
29pub fn zsim_roi_begin() {
30    zsim_magic_op(ZSimMagic::RoiBegin as u64);
31}
32
33#[inline]
34pub fn zsim_roi_end() {
35    zsim_magic_op(ZSimMagic::RoiEnd as u64);
36}
37
38#[inline]
39pub fn zsim_register_thread() {
40    zsim_magic_op(ZSimMagic::RegisterThread as u64);
41}
42
43#[inline]
44pub fn zsim_heartbeat() {
45    zsim_magic_op(ZSimMagic::HeartBeat as u64);
46}
47
48#[inline]
49pub fn zsim_work_begin() {
50    zsim_magic_op(ZSimMagic::WorkBegin as u64);
51}
52
53#[inline]
54pub fn zsim_work_end() {
55    zsim_magic_op(ZSimMagic::WorkEnd as u64);
56}