xref: /openbmc/qemu/scripts/tracetool/format/rs.py (revision 1abdde1ad42d0ebccc5e8bc574ebe805cd650102)
1# SPDX-License-Identifier: GPL-2.0-or-later
2
3"""
4trace-DIR.rs
5"""
6
7__author__     = "Tanish Desai <tanishdesai37@gmail.com>"
8__copyright__  = "Copyright 2025, Tanish Desai <tanishdesai37@gmail.com>"
9__license__    = "GPL version 2 or (at your option) any later version"
10
11__maintainer__ = "Stefan Hajnoczi"
12__email__      = "stefanha@redhat.com"
13
14
15from tracetool import out
16
17
18def generate(events, backend, group):
19    out('// SPDX-License-Identifier: GPL-2.0-or-later',
20        '// This file is @generated by tracetool, do not edit.',
21        '',
22        '#[allow(unused_imports)]',
23        'use std::ffi::c_char;',
24        '#[allow(unused_imports)]',
25        'use util::bindings;',
26        '',
27        '#[inline(always)]',
28        'fn trace_event_state_is_enabled(dstate: u16) -> bool {',
29        '    (unsafe { trace_events_enabled_count }) != 0 && dstate != 0',
30        '}',
31        '',
32        'extern "C" {',
33        '    static mut trace_events_enabled_count: u32;',
34        '}',)
35
36    out('extern "C" {')
37
38    for e in events:
39        out('    static mut %s: u16;' % e.api(e.QEMU_DSTATE))
40    out('}')
41
42    backend.generate_begin(events, group)
43
44    for e in events:
45        out('',
46            '#[inline(always)]',
47            '#[allow(dead_code)]',
48            'pub fn %(api)s(%(args)s)',
49            '{',
50            api=e.api(e.QEMU_TRACE),
51            args=e.args.rust_decl())
52
53        if "disable" not in e.properties:
54            backend.generate(e, group, check_trace_event_get_state=False)
55            if backend.check_trace_event_get_state:
56                event_id = 'TRACE_' + e.name.upper()
57                out('    if trace_event_state_is_enabled(unsafe { _%(event_id)s_DSTATE}) {',
58                    event_id = event_id,
59                    api=e.api())
60                backend.generate(e, group, check_trace_event_get_state=True)
61                out('    }')
62        out('}')
63
64    backend.generate_end(events, group)
65