1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2020 Marvell International Ltd.
8 #include <rte_byteorder.h>
9 #include <rte_common.h>
11 #include <rte_trace.h>
12 #include <rte_version.h>
14 #include "eal_trace.h"
16 __rte_format_printf(2, 0)
18 metadata_printf(char **str, const char *fmt, ...)
25 rc = vasprintf(str, fmt, ap);
32 meta_copy(char **meta, int *offset, char *str, int rc)
40 ptr = realloc(ptr, count + rc);
44 memcpy(RTE_PTR_ADD(ptr, count), str, rc);
60 meta_data_type_emit(char **meta, int *offset)
65 rc = metadata_printf(&str,
67 "typealias integer {size = 8; base = x;}:= uint8_t;\n"
68 "typealias integer {size = 16; base = x;} := uint16_t;\n"
69 "typealias integer {size = 32; base = x;} := uint32_t;\n"
70 "typealias integer {size = 64; base = x;} := uint64_t;\n"
71 "typealias integer {size = 8; signed = true;} := int8_t;\n"
72 "typealias integer {size = 16; signed = true;} := int16_t;\n"
73 "typealias integer {size = 32; signed = true;} := int32_t;\n"
74 "typealias integer {size = 64; signed = true;} := int64_t;\n"
76 "typealias integer {size = 64; base = x;} := uintptr_t;\n"
78 "typealias integer {size = 32; base = x;} := uintptr_t;\n"
81 "typealias integer {size = 64; base = x;} := long;\n"
83 "typealias integer {size = 32; base = x;} := long;\n"
85 "typealias integer {size = 8; signed = false; encoding = ASCII; } := string_bounded_t;\n\n"
86 "typealias floating_point {\n"
90 "typealias floating_point {\n"
95 return meta_copy(meta, offset, str, rc);
101 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
109 meta_header_emit(char **meta, int *offset)
111 struct trace *trace = trace_obj_get();
112 char uustr[RTE_UUID_STRLEN];
116 rte_uuid_unparse(trace->uuid, uustr, RTE_UUID_STRLEN);
117 rc = metadata_printf(&str,
122 " byte_order = %s;\n"
123 " packet.header := struct {\n"
125 " uint8_t uuid[16];\n"
127 "};\n\n", uustr, is_be() ? "be" : "le");
128 return meta_copy(meta, offset, str, rc);
132 meta_env_emit(char **meta, int *offset)
137 rc = metadata_printf(&str,
139 " dpdk_version = \"%s\";\n"
140 " tracer_name = \"dpdk\";\n"
141 "};\n\n", rte_version());
142 return meta_copy(meta, offset, str, rc);
146 meta_clock_pass1_emit(char **meta, int *offset)
151 rc = metadata_printf(&str,
153 " name = \"dpdk\";\n"
155 return meta_copy(meta, offset, str, rc);
159 meta_clock_pass2_emit(char **meta, int *offset)
164 rc = metadata_printf(&str,
167 return meta_copy(meta, offset, str, rc);
171 meta_clock_pass3_emit(char **meta, int *offset)
176 rc = metadata_printf(&str,
179 return meta_copy(meta, offset, str, rc);
183 meta_clock_pass4_emit(char **meta, int *offset)
188 rc = metadata_printf(&str,
189 "%20"PRIu64";\n};\n\n"
190 "typealias integer {\n"
191 " size = 48; align = 1; signed = false;\n"
192 " map = clock.dpdk.value;\n"
193 "} := uint48_clock_dpdk_t;\n\n", 0);
195 return meta_copy(meta, offset, str, rc);
199 meta_stream_emit(char **meta, int *offset)
204 rc = metadata_printf(&str,
206 " packet.context := struct {\n"
207 " uint32_t cpu_id;\n"
208 " string_bounded_t name[32];\n"
210 " event.header := struct {\n"
211 " uint48_clock_dpdk_t timestamp;\n"
215 return meta_copy(meta, offset, str, rc);
219 meta_event_emit(char **meta, int *offset, struct trace_point *tp)
224 rc = metadata_printf(&str,
228 " fields := struct {\n"
231 "};\n\n", trace_id_get(tp->handle), tp->name, tp->ctf_field);
232 return meta_copy(meta, offset, str, rc);
236 trace_metadata_create(void)
238 struct trace_point_head *tp_list = trace_list_head_get();
239 struct trace *trace = trace_obj_get();
240 struct trace_point *tp;
244 rc = meta_data_type_emit(&meta, &offset);
248 rc = meta_header_emit(&meta, &offset);
252 rc = meta_env_emit(&meta, &offset);
256 rc = meta_clock_pass1_emit(&meta, &offset);
259 trace->ctf_meta_offset_freq = offset;
261 rc = meta_clock_pass2_emit(&meta, &offset);
264 trace->ctf_meta_offset_freq_off_s = offset;
266 rc = meta_clock_pass3_emit(&meta, &offset);
269 trace->ctf_meta_offset_freq_off = offset;
271 rc = meta_clock_pass4_emit(&meta, &offset);
275 rc = meta_stream_emit(&meta, &offset);
279 STAILQ_FOREACH(tp, tp_list, next)
280 if (meta_event_emit(&meta, &offset, tp) < 0)
283 trace->ctf_meta = meta;
293 trace_metadata_destroy(void)
295 struct trace *trace = trace_obj_get();
297 if (trace->ctf_meta) {
298 free(trace->ctf_meta);
299 trace->ctf_meta = NULL;