10b697561SWalter Erquinigo //===-- TraceIntelPTGDBRemotePackets.cpp ------------------------*- C++ -*-===//
20b697561SWalter Erquinigo //
30b697561SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b697561SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information.
50b697561SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b697561SWalter Erquinigo //
70b697561SWalter Erquinigo //===----------------------------------------------------------------------===//
80b697561SWalter Erquinigo
90b697561SWalter Erquinigo #include "lldb/Utility/TraceIntelPTGDBRemotePackets.h"
100b697561SWalter Erquinigo
110b697561SWalter Erquinigo using namespace llvm;
120b697561SWalter Erquinigo using namespace llvm::json;
130b697561SWalter Erquinigo
140b697561SWalter Erquinigo namespace lldb_private {
150b697561SWalter Erquinigo
165de0a3e9SWalter Erquinigo const char *IntelPTDataKinds::kProcFsCpuInfo = "procfsCpuInfo";
176a5355e8SWalter Erquinigo const char *IntelPTDataKinds::kIptTrace = "iptTrace";
18a7582059SWalter Erquinigo const char *IntelPTDataKinds::kPerfContextSwitchTrace =
19a7582059SWalter Erquinigo "perfContextSwitchTrace";
205de0a3e9SWalter Erquinigo
IsPerCpuTracing() const216a5355e8SWalter Erquinigo bool TraceIntelPTStartRequest::IsPerCpuTracing() const {
22aa88161bSKazu Hirata return per_cpu_tracing.value_or(false);
231f49714dSWalter Erquinigo }
241f49714dSWalter Erquinigo
toJSON(const JSONUINT64 & uint64,bool hex)259f45f23dSWalter Erquinigo json::Value toJSON(const JSONUINT64 &uint64, bool hex) {
269f45f23dSWalter Erquinigo if (hex)
279f45f23dSWalter Erquinigo return json::Value(formatv("{0:x+}", uint64.value));
289f45f23dSWalter Erquinigo else
299f45f23dSWalter Erquinigo return json::Value(formatv("{0}", uint64.value));
309f45f23dSWalter Erquinigo }
319f45f23dSWalter Erquinigo
fromJSON(const json::Value & value,JSONUINT64 & uint64,Path path)329f45f23dSWalter Erquinigo bool fromJSON(const json::Value &value, JSONUINT64 &uint64, Path path) {
339f45f23dSWalter Erquinigo if (Optional<uint64_t> val = value.getAsUINT64()) {
349f45f23dSWalter Erquinigo uint64.value = *val;
359f45f23dSWalter Erquinigo return true;
369f45f23dSWalter Erquinigo } else if (Optional<StringRef> val = value.getAsString()) {
379f45f23dSWalter Erquinigo if (!val->getAsInteger(/*radix=*/0, uint64.value))
389f45f23dSWalter Erquinigo return true;
399f45f23dSWalter Erquinigo path.report("invalid string number");
409f45f23dSWalter Erquinigo }
419f45f23dSWalter Erquinigo path.report("invalid number or string number");
429f45f23dSWalter Erquinigo return false;
439f45f23dSWalter Erquinigo }
449f45f23dSWalter Erquinigo
fromJSON(const json::Value & value,TraceIntelPTStartRequest & packet,Path path)450b697561SWalter Erquinigo bool fromJSON(const json::Value &value, TraceIntelPTStartRequest &packet,
460b697561SWalter Erquinigo Path path) {
470b697561SWalter Erquinigo ObjectMapper o(value, path);
489f45f23dSWalter Erquinigo if (!(o && fromJSON(value, (TraceStartRequest &)packet, path) &&
499f45f23dSWalter Erquinigo o.map("enableTsc", packet.enable_tsc) &&
509f45f23dSWalter Erquinigo o.map("psbPeriod", packet.psb_period) &&
519f45f23dSWalter Erquinigo o.map("iptTraceSize", packet.ipt_trace_size)))
520b697561SWalter Erquinigo return false;
53b8d1776fSWalter Erquinigo
54b8d1776fSWalter Erquinigo if (packet.IsProcessTracing()) {
55b8d1776fSWalter Erquinigo if (!o.map("processBufferSizeLimit", packet.process_buffer_size_limit) ||
56*d30fd5c3SGaurav Gaur !o.map("perCpuTracing", packet.per_cpu_tracing) ||
57*d30fd5c3SGaurav Gaur !o.map("disableCgroupTracing", packet.disable_cgroup_filtering))
580b697561SWalter Erquinigo return false;
590b697561SWalter Erquinigo }
600b697561SWalter Erquinigo return true;
610b697561SWalter Erquinigo }
620b697561SWalter Erquinigo
toJSON(const TraceIntelPTStartRequest & packet)630b697561SWalter Erquinigo json::Value toJSON(const TraceIntelPTStartRequest &packet) {
640b697561SWalter Erquinigo json::Value base = toJSON((const TraceStartRequest &)packet);
65b8d1776fSWalter Erquinigo json::Object &obj = *base.getAsObject();
666a5355e8SWalter Erquinigo obj.try_emplace("iptTraceSize", packet.ipt_trace_size);
67b8d1776fSWalter Erquinigo obj.try_emplace("processBufferSizeLimit", packet.process_buffer_size_limit);
68b8d1776fSWalter Erquinigo obj.try_emplace("psbPeriod", packet.psb_period);
69b8d1776fSWalter Erquinigo obj.try_emplace("enableTsc", packet.enable_tsc);
706a5355e8SWalter Erquinigo obj.try_emplace("perCpuTracing", packet.per_cpu_tracing);
71*d30fd5c3SGaurav Gaur obj.try_emplace("disableCgroupTracing", packet.disable_cgroup_filtering);
720b697561SWalter Erquinigo return base;
730b697561SWalter Erquinigo }
740b697561SWalter Erquinigo
ToNanos(uint64_t tsc) const75a19fcc2bSWalter Erquinigo uint64_t LinuxPerfZeroTscConversion::ToNanos(uint64_t tsc) const {
761f2d49a8SWalter Erquinigo uint64_t quot = tsc >> time_shift;
771f2d49a8SWalter Erquinigo uint64_t rem_flag = (((uint64_t)1 << time_shift) - 1);
781f2d49a8SWalter Erquinigo uint64_t rem = tsc & rem_flag;
799f45f23dSWalter Erquinigo return time_zero.value + quot * time_mult + ((rem * time_mult) >> time_shift);
809b79187cSJakob Johnson }
819b79187cSJakob Johnson
ToTSC(uint64_t nanos) const82a19fcc2bSWalter Erquinigo uint64_t LinuxPerfZeroTscConversion::ToTSC(uint64_t nanos) const {
839f45f23dSWalter Erquinigo uint64_t time = nanos - time_zero.value;
841a3f9969SWalter Erquinigo uint64_t quot = time / time_mult;
851a3f9969SWalter Erquinigo uint64_t rem = time % time_mult;
861a3f9969SWalter Erquinigo return (quot << time_shift) + (rem << time_shift) / time_mult;
871a3f9969SWalter Erquinigo }
881a3f9969SWalter Erquinigo
toJSON(const LinuxPerfZeroTscConversion & packet)891f2d49a8SWalter Erquinigo json::Value toJSON(const LinuxPerfZeroTscConversion &packet) {
909b79187cSJakob Johnson return json::Value(json::Object{
911f2d49a8SWalter Erquinigo {"timeMult", packet.time_mult},
921f2d49a8SWalter Erquinigo {"timeShift", packet.time_shift},
939f45f23dSWalter Erquinigo {"timeZero", toJSON(packet.time_zero, /*hex=*/false)},
949b79187cSJakob Johnson });
959b79187cSJakob Johnson }
969b79187cSJakob Johnson
fromJSON(const json::Value & value,LinuxPerfZeroTscConversion & packet,json::Path path)971f2d49a8SWalter Erquinigo bool fromJSON(const json::Value &value, LinuxPerfZeroTscConversion &packet,
989b79187cSJakob Johnson json::Path path) {
999b79187cSJakob Johnson ObjectMapper o(value, path);
1009f45f23dSWalter Erquinigo uint64_t time_mult, time_shift;
1019f45f23dSWalter Erquinigo if (!(o && o.map("timeMult", time_mult) && o.map("timeShift", time_shift) &&
1029f45f23dSWalter Erquinigo o.map("timeZero", packet.time_zero)))
1039b79187cSJakob Johnson return false;
1041f2d49a8SWalter Erquinigo packet.time_mult = time_mult;
1051f2d49a8SWalter Erquinigo packet.time_shift = time_shift;
1069b79187cSJakob Johnson return true;
1079b79187cSJakob Johnson }
1089b79187cSJakob Johnson
fromJSON(const json::Value & value,TraceIntelPTGetStateResponse & packet,json::Path path)1099b79187cSJakob Johnson bool fromJSON(const json::Value &value, TraceIntelPTGetStateResponse &packet,
1109b79187cSJakob Johnson json::Path path) {
1119b79187cSJakob Johnson ObjectMapper o(value, path);
1121f2d49a8SWalter Erquinigo return o && fromJSON(value, (TraceGetStateResponse &)packet, path) &&
113*d30fd5c3SGaurav Gaur o.map("tscPerfZeroConversion", packet.tsc_perf_zero_conversion) &&
114*d30fd5c3SGaurav Gaur o.map("usingCgroupFiltering", packet.using_cgroup_filtering);
1159b79187cSJakob Johnson }
1169b79187cSJakob Johnson
toJSON(const TraceIntelPTGetStateResponse & packet)1179b79187cSJakob Johnson json::Value toJSON(const TraceIntelPTGetStateResponse &packet) {
1189b79187cSJakob Johnson json::Value base = toJSON((const TraceGetStateResponse &)packet);
119*d30fd5c3SGaurav Gaur json::Object &obj = *base.getAsObject();
120*d30fd5c3SGaurav Gaur obj.insert({"tscPerfZeroConversion", packet.tsc_perf_zero_conversion});
121*d30fd5c3SGaurav Gaur obj.insert({"usingCgroupFiltering", packet.using_cgroup_filtering});
1229b79187cSJakob Johnson return base;
1239b79187cSJakob Johnson }
1249b79187cSJakob Johnson
1250b697561SWalter Erquinigo } // namespace lldb_private
126