clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
132 lines
4.1 KiB
C++
132 lines
4.1 KiB
C++
//===-- TraceIntelPTGDBRemotePackets.h --------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
|
|
#define LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
|
|
|
|
#include "lldb/Utility/TraceGDBRemotePackets.h"
|
|
|
|
#include "llvm/Support/JSON.h"
|
|
|
|
#include <chrono>
|
|
#include <optional>
|
|
|
|
/// See docs/lldb-gdb-remote.txt for more information.
|
|
///
|
|
/// Do not use system-dependent types, like size_t, because they might cause
|
|
/// issues when compiling on arm.
|
|
namespace lldb_private {
|
|
|
|
// List of data kinds used by jLLDBGetState and jLLDBGetBinaryData.
|
|
struct IntelPTDataKinds {
|
|
static const char *kProcFsCpuInfo;
|
|
static const char *kIptTrace;
|
|
static const char *kPerfContextSwitchTrace;
|
|
};
|
|
|
|
/// jLLDBTraceStart gdb-remote packet
|
|
/// \{
|
|
struct TraceIntelPTStartRequest : TraceStartRequest {
|
|
/// Size in bytes to use for each thread's trace buffer.
|
|
uint64_t ipt_trace_size;
|
|
|
|
/// Whether to enable TSC
|
|
bool enable_tsc;
|
|
|
|
/// PSB packet period
|
|
std::optional<uint64_t> psb_period;
|
|
|
|
/// Required when doing "process tracing".
|
|
///
|
|
/// Limit in bytes on all the thread traces started by this "process trace"
|
|
/// instance. When a thread is about to be traced and the limit would be hit,
|
|
/// then a "tracing" stop event is triggered.
|
|
std::optional<uint64_t> process_buffer_size_limit;
|
|
|
|
/// Whether to have a trace buffer per thread or per cpu cpu.
|
|
std::optional<bool> per_cpu_tracing;
|
|
|
|
/// Disable the cgroup filtering that is automatically applied in per cpu
|
|
/// mode.
|
|
std::optional<bool> disable_cgroup_filtering;
|
|
|
|
bool IsPerCpuTracing() const;
|
|
};
|
|
|
|
bool fromJSON(const llvm::json::Value &value, TraceIntelPTStartRequest &packet,
|
|
llvm::json::Path path);
|
|
|
|
llvm::json::Value toJSON(const TraceIntelPTStartRequest &packet);
|
|
/// \}
|
|
|
|
/// Helper structure to help parse long numbers that can't
|
|
/// be easily represented by a JSON number that is compatible with
|
|
/// Javascript (52 bits) or that can also be represented as hex.
|
|
///
|
|
/// \{
|
|
struct JSONUINT64 {
|
|
uint64_t value;
|
|
};
|
|
|
|
llvm::json::Value toJSON(const JSONUINT64 &uint64, bool hex);
|
|
|
|
bool fromJSON(const llvm::json::Value &value, JSONUINT64 &uint64,
|
|
llvm::json::Path path);
|
|
/// \}
|
|
|
|
/// jLLDBTraceGetState gdb-remote packet
|
|
/// \{
|
|
|
|
/// TSC to wall time conversion values defined in the Linux perf_event_open API
|
|
/// when the capibilities cap_user_time and cap_user_time_zero are set. See the
|
|
/// See the documentation of `time_zero` in
|
|
/// https://man7.org/linux/man-pages/man2/perf_event_open.2.html for more
|
|
/// information.
|
|
struct LinuxPerfZeroTscConversion {
|
|
/// Convert TSC value to nanosecond wall time. The beginning of time (0
|
|
/// nanoseconds) is defined by the kernel at boot time and has no particularly
|
|
/// useful meaning. On the other hand, this value is constant for an entire
|
|
/// trace session.
|
|
/// See 'time_zero' section of
|
|
/// https://man7.org/linux/man-pages/man2/perf_event_open.2.html
|
|
///
|
|
/// \param[in] tsc
|
|
/// The TSC value to be converted.
|
|
///
|
|
/// \return
|
|
/// Nanosecond wall time.
|
|
uint64_t ToNanos(uint64_t tsc) const;
|
|
|
|
uint64_t ToTSC(uint64_t nanos) const;
|
|
|
|
uint32_t time_mult;
|
|
uint16_t time_shift;
|
|
JSONUINT64 time_zero;
|
|
};
|
|
|
|
struct TraceIntelPTGetStateResponse : TraceGetStateResponse {
|
|
/// The TSC to wall time conversion if it exists, otherwise \b nullptr.
|
|
std::optional<LinuxPerfZeroTscConversion> tsc_perf_zero_conversion;
|
|
bool using_cgroup_filtering = false;
|
|
};
|
|
|
|
bool fromJSON(const llvm::json::Value &value,
|
|
LinuxPerfZeroTscConversion &packet, llvm::json::Path path);
|
|
|
|
llvm::json::Value toJSON(const LinuxPerfZeroTscConversion &packet);
|
|
|
|
bool fromJSON(const llvm::json::Value &value,
|
|
TraceIntelPTGetStateResponse &packet, llvm::json::Path path);
|
|
|
|
llvm::json::Value toJSON(const TraceIntelPTGetStateResponse &packet);
|
|
/// \}
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_UTILITY_TRACEINTELPTGDBREMOTEPACKETS_H
|