1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2020 Marvell International Ltd.
3 */
4
5 #ifndef __EAL_TRACE_H
6 #define __EAL_TRACE_H
7
8 #include <rte_cycles.h>
9 #include <rte_log.h>
10 #include <rte_malloc.h>
11 #include <rte_spinlock.h>
12 #include <rte_trace.h>
13 #include <rte_trace_point.h>
14 #include <rte_uuid.h>
15
16 #include "eal_private.h"
17 #include "eal_thread.h"
18
19 #define trace_err(...) \
20 RTE_LOG_LINE_PREFIX(ERR, EAL, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
21
22 #define trace_crit(...) \
23 RTE_LOG_LINE_PREFIX(CRIT, EAL, "%s():%u ", __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
24
25 #define TRACE_CTF_MAGIC 0xC1FC1FC1
26 #define TRACE_MAX_ARGS 32
27
28 struct trace_point {
29 STAILQ_ENTRY(trace_point) next;
30 rte_trace_point_t *handle;
31 const char *name;
32 char *ctf_field;
33 };
34
35 enum trace_area_e {
36 TRACE_AREA_HEAP,
37 TRACE_AREA_HUGEPAGE,
38 };
39
40 struct thread_mem_meta {
41 void *mem;
42 enum trace_area_e area;
43 };
44
45 struct trace_arg {
46 STAILQ_ENTRY(trace_arg) next;
47 char *val;
48 };
49
50 struct trace {
51 char *dir;
52 int register_errno;
53 RTE_ATOMIC(uint32_t) status;
54 enum rte_trace_mode mode;
55 rte_uuid_t uuid;
56 uint32_t buff_len;
57 STAILQ_HEAD(, trace_arg) args;
58 uint32_t nb_trace_points;
59 uint32_t nb_trace_mem_list;
60 struct thread_mem_meta *lcore_meta;
61 uint64_t epoch_sec;
62 uint64_t epoch_nsec;
63 uint64_t uptime_ticks;
64 char *ctf_meta;
65 uint32_t ctf_meta_offset_freq;
66 uint32_t ctf_meta_offset_freq_off_s;
67 uint32_t ctf_meta_offset_freq_off;
68 RTE_ATOMIC(uint16_t) ctf_fixup_done;
69 rte_spinlock_t lock;
70 };
71
72 /* Helper functions */
73 static inline uint16_t
trace_id_get(rte_trace_point_t * trace)74 trace_id_get(rte_trace_point_t *trace)
75 {
76 return (*trace & __RTE_TRACE_FIELD_ID_MASK) >>
77 __RTE_TRACE_FIELD_ID_SHIFT;
78 }
79
80 static inline size_t
trace_mem_sz(uint32_t len)81 trace_mem_sz(uint32_t len)
82 {
83 return len + sizeof(struct __rte_trace_header);
84 }
85
86 /* Trace object functions */
87 struct trace *trace_obj_get(void);
88
89 /* Trace point list functions */
90 STAILQ_HEAD(trace_point_head, trace_point);
91 struct trace_point_head *trace_list_head_get(void);
92
93 /* Util functions */
94 const char *trace_mode_to_string(enum rte_trace_mode mode);
95 const char *trace_area_to_string(enum trace_area_e area);
96 int trace_args_apply(const char *arg);
97 void trace_bufsz_args_apply(void);
98 bool trace_has_duplicate_entry(void);
99 void trace_uuid_generate(void);
100 int trace_metadata_create(void);
101 void trace_metadata_destroy(void);
102 char *trace_metadata_fixup_field(const char *field);
103 int trace_epoch_time_save(void);
104 void trace_mem_free(void);
105 void trace_mem_per_thread_free(void);
106
107 /* EAL interface */
108 int eal_trace_init(void);
109 void eal_trace_fini(void);
110 int eal_trace_args_save(const char *val);
111 void eal_trace_args_free(void);
112 int eal_trace_dir_args_save(const char *val);
113 int eal_trace_mode_args_save(const char *val);
114 int eal_trace_bufsz_args_save(const char *val);
115
116 #endif /* __EAL_TRACE_H */
117