1//===-- TraceIntelPTGDBRemotePackets.h --------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
10#define LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
11
12#include "lldb/Utility/TraceGDBRemotePackets.h"
13
14#include "llvm/Support/JSON.h"
15
16#include <chrono>
17#include <optional>
18
19/// See docs/lldb-gdb-remote.txt for more information.
20///
21/// Do not use system-dependent types, like size_t, because they might cause
22/// issues when compiling on arm.
23namespace lldb_private {
24
25// List of data kinds used by jLLDBGetState and jLLDBGetBinaryData.
26struct IntelPTDataKinds {
27 static const char *kProcFsCpuInfo;
28 static const char *kIptTrace;
29 static const char *kPerfContextSwitchTrace;
30};
31
32/// jLLDBTraceStart gdb-remote packet
33/// \{
34struct TraceIntelPTStartRequest : TraceStartRequest {
35 /// Size in bytes to use for each thread's trace buffer.
36 uint64_t ipt_trace_size;
37
38 /// Whether to enable TSC
39 bool enable_tsc;
40
41 /// PSB packet period
42 std::optional<uint64_t> psb_period;
43
44 /// Required when doing "process tracing".
45 ///
46 /// Limit in bytes on all the thread traces started by this "process trace"
47 /// instance. When a thread is about to be traced and the limit would be hit,
48 /// then a "tracing" stop event is triggered.
49 std::optional<uint64_t> process_buffer_size_limit;
50
51 /// Whether to have a trace buffer per thread or per cpu cpu.
52 std::optional<bool> per_cpu_tracing;
53
54 /// Disable the cgroup filtering that is automatically applied in per cpu
55 /// mode.
56 std::optional<bool> disable_cgroup_filtering;
57
58 bool IsPerCpuTracing() const;
59};
60
61bool fromJSON(const llvm::json::Value &value, TraceIntelPTStartRequest &packet,
62 llvm::json::Path path);
63
64llvm::json::Value toJSON(const TraceIntelPTStartRequest &packet);
65/// \}
66
67/// Helper structure to help parse long numbers that can't
68/// be easily represented by a JSON number that is compatible with
69/// Javascript (52 bits) or that can also be represented as hex.
70///
71/// \{
72struct JSONUINT64 {
73 uint64_t value;
74};
75
76llvm::json::Value toJSON(const JSONUINT64 &uint64, bool hex);
77
78bool fromJSON(const llvm::json::Value &value, JSONUINT64 &uint64,
79 llvm::json::Path path);
80/// \}
81
82/// jLLDBTraceGetState gdb-remote packet
83/// \{
84
85/// TSC to wall time conversion values defined in the Linux perf_event_open API
86/// when the capibilities cap_user_time and cap_user_time_zero are set. See the
87/// See the documentation of `time_zero` in
88/// https://man7.org/linux/man-pages/man2/perf_event_open.2.html for more
89/// information.
90struct LinuxPerfZeroTscConversion {
91 /// Convert TSC value to nanosecond wall time. The beginning of time (0
92 /// nanoseconds) is defined by the kernel at boot time and has no particularly
93 /// useful meaning. On the other hand, this value is constant for an entire
94 /// trace session.
95 /// See 'time_zero' section of
96 /// https://man7.org/linux/man-pages/man2/perf_event_open.2.html
97 ///
98 /// \param[in] tsc
99 /// The TSC value to be converted.
100 ///
101 /// \return
102 /// Nanosecond wall time.
103 uint64_t ToNanos(uint64_t tsc) const;
104
105 uint64_t ToTSC(uint64_t nanos) const;
106
107 uint32_t time_mult;
108 uint16_t time_shift;
109 JSONUINT64 time_zero;
110};
111
112struct TraceIntelPTGetStateResponse : TraceGetStateResponse {
113 /// The TSC to wall time conversion if it exists, otherwise \b nullptr.
114 std::optional<LinuxPerfZeroTscConversion> tsc_perf_zero_conversion;
115 bool using_cgroup_filtering = false;
116};
117
118bool fromJSON(const llvm::json::Value &value,
119 LinuxPerfZeroTscConversion &packet, llvm::json::Path path);
120
121llvm::json::Value toJSON(const LinuxPerfZeroTscConversion &packet);
122
123bool fromJSON(const llvm::json::Value &value,
124 TraceIntelPTGetStateResponse &packet, llvm::json::Path path);
125
126llvm::json::Value toJSON(const TraceIntelPTGetStateResponse &packet);
127/// \}
128
129} // namespace lldb_private
130
131#endif // LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
132

source code of lldb/include/lldb/Utility/TraceIntelPTGDBRemotePackets.h