From 5fb1ec0250c540314aa60da49d5e345f06692a55 Mon Sep 17 00:00:00 2001 From: Nikita Baksalyar Date: Tue, 26 Apr 2022 00:33:58 +0100 Subject: [PATCH] PoC for SystemTap semaphores - using asm_sym --- examples/loop.rs | 19 ++++++++++++------- src/lib.rs | 1 + src/platform/systemtap.rs | 14 ++++++++------ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/examples/loop.rs b/examples/loop.rs index 0e2f456..3233b40 100644 --- a/examples/loop.rs +++ b/examples/loop.rs @@ -1,11 +1,16 @@ +#![feature(asm_sym)] + use probe::probe; + fn main() { - probe!(foo, begin); - let mut total = 0; - for i in 0..100 { - total += i; - probe!(foo, loop, i, total); + let mut iter = 0; + loop { + iter += 1; + probe!(foo, iter, { + std::thread::sleep(std::time::Duration::from_secs(1)); + iter + }); } - assert_eq!(total, 4950); - probe!(foo, end); } + +// bcc/tools/trace.py -p $(pidof loop) 'u::foo:iter "iter = %d", arg1' diff --git a/src/lib.rs b/src/lib.rs index 006e6c0..1945c5d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,6 +79,7 @@ //! ``` #![no_std] +#![feature(asm_sym)] mod platform; diff --git a/src/platform/systemtap.rs b/src/platform/systemtap.rs index e05ba6f..7efb7b9 100644 --- a/src/platform/systemtap.rs +++ b/src/platform/systemtap.rs @@ -101,7 +101,9 @@ macro_rules! sdt_asm( #[macro_export] macro_rules! _sdt_asm( ($size:literal, options ($($opt:ident),*), $provider:ident, $name:ident, $($argstr:literal, $arg:expr,)*) => ( - ::core::arch::asm!(concat!(r#" + static SEMAPHORE: u16 = 0; + if ::core::ptr::read_volatile(&SEMAPHORE) == 1 { + ::core::arch::asm!(concat!(r#" 990: nop .pushsection .note.stapsdt,"?","note" .balign 4 @@ -110,7 +112,7 @@ macro_rules! _sdt_asm( 992: .balign 4 993: ."#, $size, r#"byte 990b ."#, $size, r#"byte _.stapsdt.base - ."#, $size, r#"byte 0 // FIXME set semaphore address + ."#, $size, r#"byte {} .asciz ""#, stringify!($provider), r#"" .asciz ""#, stringify!($name), r#"" .asciz ""#, $($argstr,)* r#"" @@ -123,10 +125,10 @@ macro_rules! _sdt_asm( _.stapsdt.base: .space 1 .size _.stapsdt.base, 1 .popsection -.endif -"# - ), +.endif"#), + sym SEMAPHORE, $(in(reg) (($arg) as isize) ,)* options(readonly, nostack, preserves_flags, $($opt),*), - ) + ); + } ));