// 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);
}

