"util",
]
+[[package]]
+name = "probe"
+version = "0.5.2"
+
[[package]]
name = "proc-macro-error"
version = "1.0.4"
"migration",
"qom",
"system",
+ "trace",
"util",
]
version = "0.1.0"
dependencies = [
"libc",
+ "probe",
]
[[package]]
[dependencies]
libc = { workspace = true }
+probe = "0.5"
[lints]
workspace = true
'trace', # Library name,
lib_rs,
trace_rs_targets, # List of generated `.rs` custom targets
- dependencies: [libc_rs],
+ dependencies: [libc_rs, probe_rs],
)
trace_rs = declare_dependency(link_with: _trace_rs)
#[doc(hidden)]
/// Re-exported item to avoid adding libc as a dependency everywhere.
pub use libc::{syslog, LOG_INFO};
+#[doc(hidden)]
+/// Re-exported item to avoid adding probe as a dependency everywhere.
+pub use probe::probe;
#[macro_export]
/// Define the trace-points from the named directory (which should have slashes
#[allow(
clippy::ptr_as_ptr,
clippy::cast_lossless,
+ clippy::nonminimal_bool,
clippy::used_underscore_binding
)]
mod trace {
QEMU_TRACE = "trace_%(name)s"
QEMU_TRACE_TCG = QEMU_TRACE + "_tcg"
+ QEMU_RUST_DSTATE = "trace_%(name)s_enabled"
QEMU_DSTATE = "_TRACE_%(NAME)s_DSTATE"
QEMU_BACKEND_DSTATE = "TRACE_%(NAME)s_BACKEND_DSTATE"
QEMU_EVENT = "_TRACE_%(NAME)s_EVENT"
def generate_h_backend_dstate(event, group):
out(' QEMU_%(uppername)s_ENABLED() || \\',
uppername=event.name.upper())
+
+
+def generate_rs_begin(events, group):
+ out('use std::cell::UnsafeCell;',
+ '',
+ 'extern "C" {')
+ # These are the Rust declarations of the .probes section semaphores
+ # generated by dtrace(1) in its .o file output.
+ for e in events:
+ if 'disable' in e.properties:
+ continue
+ out(' #[allow(dead_code)]',
+ f' static qemu_{e.name}_semaphore: UnsafeCell<u16>;')
+ out('}',
+ '')
+
+
+def generate_rs(event, group):
+ args = event.args.rust_call_extern()
+ if args:
+ args = ', ' + args
+
+ out(f' ::trace::probe!(qemu, {event.name}{args});')
+
+
+def generate_rs_backend_dstate(event, group):
+ # Rust does not have access to the <provider>_<name>_ENABLED() macro from
+ # the dtrace(1) generated .h file. Use the matching semaphore declarations
+ # generated by generate_rs_begin() instead.
+ out(' (unsafe {qemu_%(n)s_semaphore.get().read_volatile()}) != 0 ||',
+ n=event.name)
'#[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;',
'}',)
out('extern "C" {')
for e in events:
- out(' static mut %s: u16;' % e.api(e.QEMU_DSTATE))
- out('}')
+ out(' #[allow(dead_code)]',
+ ' static mut %s: u16;' % e.api(e.QEMU_DSTATE))
+ out('}',
+ '')
backend.generate_begin(events, group)
for e in events:
- out('',
+ out('#[inline(always)]',
+ '#[allow(dead_code)]',
+ 'pub fn %(api)s() -> bool',
+ '{',
+ api=e.api(e.QEMU_RUST_DSTATE))
+
+ if "disable" not in e.properties:
+ backend.generate_backend_dstate(e, group)
+ if backend.check_trace_event_get_state:
+ out(' trace_event_state_is_enabled(unsafe { _%(event_id)s_DSTATE}) ||',
+ event_id = 'TRACE_' + e.name.upper())
+
+ out(' false',
+ '}',
+ '',
'#[inline(always)]',
'#[allow(dead_code)]',
'pub fn %(api)s(%(args)s)',
api=e.api())
backend.generate(e, group, check_trace_event_get_state=True)
out(' }')
- out('}')
+ out('}',
+ '')
backend.generate_end(events, group)
--- /dev/null
+// 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;
+}
+
+use std::cell::UnsafeCell;
+
+extern "C" {
+ #[allow(dead_code)]
+ static qemu_test_blah_semaphore: UnsafeCell<u16>;
+ #[allow(dead_code)]
+ static qemu_test_wibble_semaphore: UnsafeCell<u16>;
+}
+
+#[inline(always)]
+#[allow(dead_code)]
+pub fn trace_test_blah_enabled() -> bool
+{
+ (unsafe {qemu_test_blah_semaphore.get().read_volatile()}) != 0 ||
+ false
+}
+
+#[inline(always)]
+#[allow(dead_code)]
+pub fn trace_test_blah(_context: *mut (), _filename: &std::ffi::CStr)
+{
+ ::trace::probe!(qemu, test_blah, _context, _filename.as_ptr());
+}
+
+#[inline(always)]
+#[allow(dead_code)]
+pub fn trace_test_wibble_enabled() -> bool
+{
+ (unsafe {qemu_test_wibble_semaphore.get().read_volatile()}) != 0 ||
+ false
+}
+
+#[inline(always)]
+#[allow(dead_code)]
+pub fn trace_test_wibble(_context: *mut (), _value: std::ffi::c_int)
+{
+ ::trace::probe!(qemu, test_wibble, _context, _value);
+}
+
#[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)
}
}
+#[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)
unsafe {bindings::ftrace_write(format_string.as_ptr() as *const c_char, _context /* as *mut () */, _value /* as std::ffi::c_int */);}
}
}
+
#[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)
}
}
+#[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)
}
}
}
+
#[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)
}
}
+#[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)
unsafe { _simple_trace_test_wibble(_context, _value); }
}
}
+
#[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)
}
}
+#[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)
unsafe {::trace::syslog(::trace::LOG_INFO, format_string.as_ptr() as *const c_char, _context /* as *mut () */, _value /* as std::ffi::c_int */);}
}
}
+
"c",
"h",
]
- if backend in {"ftrace", "log", "simple", "syslog"}:
+ if backend in {"dtrace", "ftrace", "log", "simple", "syslog"}:
formats += ["rs"]
if backend == "dtrace":
formats += [