master
py 107 lines 3.04 KB
Raw
1 # SPDX-License-Identifier: GPL-2.0-or-later
2
3 """
4 Simple built-in backend.
5 """
6
7 __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
8 __copyright__ = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
9 __license__ = "GPL version 2 or (at your option) any later version"
10
11 __maintainer__ = "Stefan Hajnoczi"
12 __email__ = "stefanha@redhat.com"
13
14
15 from tracetool import out
16
17
18 PUBLIC = True
19 CHECK_TRACE_EVENT_GET_STATE = True
20
21
22 def is_string(arg):
23 strtype = ('const char*', 'char*', 'const char *', 'char *')
24 arg_strip = arg.lstrip()
25 if arg_strip.startswith(strtype) and arg_strip.count('*') == 1:
26 return True
27 else:
28 return False
29
30
31 def generate_h_begin(events, group):
32 for event in events:
33 out('void _simple_%(api)s(%(args)s);',
34 api=event.api(),
35 args=event.args)
36 out('')
37
38
39 def generate_h(event, group):
40 out(' _simple_%(api)s(%(args)s);',
41 api=event.api(),
42 args=", ".join(event.args.names()))
43
44
45 def generate_h_backend_dstate(event, group):
46 out(' trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
47 event_id="TRACE_" + event.name.upper())
48
49
50 def generate_c_begin(events, group):
51 out('#include "qemu/osdep.h"',
52 '#include "trace/control.h"',
53 '#include "trace/simple.h"',
54 '')
55
56
57 def generate_c(event, group):
58 out('void _simple_%(api)s(%(args)s)',
59 '{',
60 ' TraceBufferRecord rec;',
61 api=event.api(),
62 args=event.args)
63 sizes = []
64 for type_, name in event.args:
65 if is_string(type_):
66 out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
67 name=name)
68 strsizeinfo = "4 + arg%s_len" % name
69 sizes.append(strsizeinfo)
70 else:
71 sizes.append("8")
72 sizestr = " + ".join(sizes)
73 if len(event.args) == 0:
74 sizestr = '0'
75
76 out('',
77 ' if (trace_record_start(&rec, %(event_obj)s.id, %(size_str)s)) {',
78 ' return; /* Trace Buffer Full, Event Dropped ! */',
79 ' }',
80 event_obj=event.api(event.QEMU_EVENT),
81 size_str=sizestr)
82
83 if len(event.args) > 0:
84 for type_, name in event.args:
85 # string
86 if is_string(type_):
87 out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
88 name=name)
89 # pointer var (not string)
90 elif type_.endswith('*'):
91 out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
92 name=name)
93 # primitive data type
94 else:
95 out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
96 name=name)
97
98 out(' trace_record_finish(&rec);',
99 '}',
100 '')
101
102 def generate_rs(event, group):
103 out(' extern "C" { fn _simple_%(api)s(%(rust_args)s); }',
104 ' unsafe { _simple_%(api)s(%(args)s); }',
105 api=event.api(),
106 rust_args=event.args.rust_decl_extern(),
107 args=event.args.rust_call_extern())