mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:10 +00:00
Implement DTrace/SystemTap SDT by emitting the following: - The probe crate's probe!() macro is used to emit a DTrace/SystemTap SDT probe. - Every trace event gets a corresponding trace_<name>_enabled() -> bool generated function that Rust code can use to avoid expensive computation when a trace event is disabled. This API works for other trace backends too. `#[allow(dead_code)]` additions are necessary for QEMU's dstate in generated trace-<dir>.rs files since they are unused by the dtrace backend. `./configure --enable-trace-backends=` can enable multiple backends, so keep it simple and just silence the warning instead of trying to detect the condition when generating the dstate code can be skipped. The tracetool tests are updated. Take a look at tests/tracetool/dtrace.rs to see what the new generated code looks like. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Link: https://lore.kernel.org/r/20251119205200.173170-5-stefanha@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
62 lines
1.6 KiB
Rust
62 lines
1.6 KiB
Rust
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
// This file is @generated by tracetool, do not edit.
|
|
|
|
#[allow(unused_imports)]
|
|
use std::ffi::c_char;
|
|
#[allow(unused_imports)]
|
|
use util::bindings;
|
|
|
|
#[allow(dead_code)]
|
|
#[inline(always)]
|
|
fn trace_event_state_is_enabled(dstate: u16) -> bool {
|
|
(unsafe { trace_events_enabled_count }) != 0 && dstate != 0
|
|
}
|
|
|
|
extern "C" {
|
|
#[allow(dead_code)]
|
|
static mut trace_events_enabled_count: u32;
|
|
}
|
|
extern "C" {
|
|
#[allow(dead_code)]
|
|
static mut _TRACE_TEST_BLAH_DSTATE: u16;
|
|
#[allow(dead_code)]
|
|
static mut _TRACE_TEST_WIBBLE_DSTATE: u16;
|
|
}
|
|
|
|
#[inline(always)]
|
|
#[allow(dead_code)]
|
|
pub fn trace_test_blah_enabled() -> bool
|
|
{
|
|
trace_event_state_is_enabled(unsafe { _TRACE_TEST_BLAH_DSTATE}) ||
|
|
false
|
|
}
|
|
|
|
#[inline(always)]
|
|
#[allow(dead_code)]
|
|
pub fn trace_test_blah(_context: *mut (), _filename: &std::ffi::CStr)
|
|
{
|
|
if trace_event_state_is_enabled(unsafe { _TRACE_TEST_BLAH_DSTATE}) {
|
|
extern "C" { fn _simple_trace_test_blah(_context: *mut (), _filename: *const std::ffi::c_char); }
|
|
unsafe { _simple_trace_test_blah(_context, _filename.as_ptr()); }
|
|
}
|
|
}
|
|
|
|
#[inline(always)]
|
|
#[allow(dead_code)]
|
|
pub fn trace_test_wibble_enabled() -> bool
|
|
{
|
|
trace_event_state_is_enabled(unsafe { _TRACE_TEST_WIBBLE_DSTATE}) ||
|
|
false
|
|
}
|
|
|
|
#[inline(always)]
|
|
#[allow(dead_code)]
|
|
pub fn trace_test_wibble(_context: *mut (), _value: std::ffi::c_int)
|
|
{
|
|
if trace_event_state_is_enabled(unsafe { _TRACE_TEST_WIBBLE_DSTATE}) {
|
|
extern "C" { fn _simple_trace_test_wibble(_context: *mut (), _value: std::ffi::c_int); }
|
|
unsafe { _simple_trace_test_wibble(_context, _value); }
|
|
}
|
|
}
|
|
|