24 void DirectoryCaptureCommandHandler::ParseData(
const arm::pipe::Packet& packet)
26 uint16_t categoryRecordCount;
27 uint16_t counterSetRecordCount;
28 uint16_t deviceRecordCount;
32 if (packet.GetLength() < 8)
34 std::cout <<
"Counter directory packet received." << std::endl;
38 const unsigned char* data = packet.GetData();
76 std::vector<uint32_t> deviceRecordOffsets(deviceRecordCount);
77 std::vector<uint32_t> counterSetOffsets(counterSetRecordCount);
78 std::vector<uint32_t> categoryOffsets(categoryRecordCount);
80 offset = deviceRecordsPointerTableOffset;
81 for (uint32_t i = 0; i < deviceRecordCount; ++i)
87 offset = counterPointerTableSetOffset;
88 for (uint32_t i = 0; i < counterSetRecordCount; ++i)
94 offset = categoriesPointerTableOffset;
95 for (uint32_t i = 0; i < categoryRecordCount; ++i)
101 offset = deviceRecordsPointerTableOffset;
102 for (uint32_t deviceIndex = 0; deviceIndex < deviceRecordCount; ++deviceIndex)
104 uint32_t deviceRecordOffset = offset + deviceRecordOffsets[deviceIndex];
117 deviceRecordOffset = deviceRecordsPointerTableOffset + nameOffset;
119 const std::string& deviceName = GetStringNameFromBuffer(data, deviceRecordOffset);
121 m_UidTranslation[registeredDevice->
m_Uid] = deviceUid;
124 offset = counterPointerTableSetOffset;
125 for (uint32_t counterSetIndex = 0; counterSetIndex < counterSetRecordCount; ++counterSetIndex)
127 uint32_t counterSetOffset = offset + counterSetOffsets[counterSetIndex];
145 m_CounterDirectory.
RegisterCounterSet(GetStringNameFromBuffer(data, counterSetOffset), counterSetCount);
146 m_UidTranslation[counterSet->m_Uid] = counterSetUid;
148 ReadCategoryRecords(data, categoriesPointerTableOffset, categoryOffsets);
151 void DirectoryCaptureCommandHandler::ReadCategoryRecords(
const unsigned char*
const data,
153 std::vector<uint32_t> categoryOffsets)
155 uint32_t categoryRecordCount =
static_cast<uint32_t
>(categoryOffsets.size());
157 for (uint32_t categoryIndex = 0; categoryIndex < categoryRecordCount; ++categoryIndex)
159 uint32_t categoryRecordOffset = offset + categoryOffsets[categoryIndex];
178 std::vector<uint32_t> eventRecordsOffsets(eventCount);
180 eventPointerTableOffset += offset + categoryOffsets[categoryIndex];
182 for (uint32_t eventIndex = 0; eventIndex < eventCount; ++eventIndex)
184 eventRecordsOffsets[eventIndex] =
188 const std::vector<CounterDirectoryEventRecord>& eventRecords =
189 ReadEventRecords(data, eventPointerTableOffset, eventRecordsOffsets);
192 GetStringNameFromBuffer(data, offset + categoryOffsets[categoryIndex] + nameOffset + uint32_t_size));
193 for (
auto& counter : eventRecords)
196 counter.m_CounterUid,
198 counter.m_CounterClass,
199 counter.m_CounterInterpolation,
200 counter.m_CounterMultiplier,
201 counter.m_CounterName,
202 counter.m_CounterDescription,
203 counter.m_CounterUnits);
204 m_UidTranslation[registeredCounter->
m_Uid] = counter.m_CounterUid;
209 std::vector<CounterDirectoryEventRecord> DirectoryCaptureCommandHandler::ReadEventRecords(
210 const unsigned char* data, uint32_t offset, std::vector<uint32_t> eventRecordsOffsets)
212 uint32_t eventCount =
static_cast<uint32_t
>(eventRecordsOffsets.size());
214 std::vector<CounterDirectoryEventRecord> eventRecords(eventCount);
215 for (
unsigned long i = 0; i < eventCount; ++i)
217 uint32_t eventRecordOffset = eventRecordsOffsets[i] + offset;
254 uint32_t multiplier[2] = { 0u, 0u };
261 std::memcpy(&eventRecords[i].m_CounterMultiplier, &multiplier,
sizeof(multiplier));
283 eventRecords[i].m_CounterName = GetStringNameFromBuffer(data, offset +
284 eventRecordsOffsets[i] +
288 eventRecords[i].m_CounterDescription = GetStringNameFromBuffer(data, offset +
289 eventRecordsOffsets[i] +
294 GetStringNameFromBuffer(data, eventRecordsOffsets[i] + offset + unitsOffset + uint32_t_size);
302 if (!m_QuietOperation)
304 std::cout <<
"Counter directory packet received." << std::endl;
311 m_AlreadyParsed =
true;
314 if (!m_QuietOperation)
322 return m_CounterDirectory;
325 std::string DirectoryCaptureCommandHandler::GetStringNameFromBuffer(
const unsigned char*
const data, uint32_t offset)
327 std::string deviceName;
330 while (isprint(nextChar))
332 deviceName +=
static_cast<char>(nextChar);
const Category * RegisterCategory(const std::string &categoryName) override
const Counter * RegisterCounter(const BackendId &backendId, const uint16_t uid, const std::string &parentCategoryName, uint16_t counterClass, uint16_t interpolation, double multiplier, const std::string &name, const std::string &description, const Optional< std::string > &units=EmptyOptional(), const Optional< uint16_t > &numberOfCores=EmptyOptional(), const Optional< uint16_t > &deviceUid=EmptyOptional(), const Optional< uint16_t > &counterSetUid=EmptyOptional()) override
uint16_t ReadUint16(const IPacketBufferPtr &packetBuffer, unsigned int offset)
uint8_t ReadUint8(const IPacketBufferPtr &packetBuffer, unsigned int offset)
Copyright (c) 2021 ARM Limited and Contributors.
bool ParsedCounterDirectory()
void operator()(const arm::pipe::Packet &packet) override
uint32_t ReadUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset)
const Device * RegisterDevice(const std::string &deviceName, uint16_t cores=0, const Optional< std::string > &parentCategoryName=EmptyOptional()) override
const CounterSet * RegisterCounterSet(const std::string &counterSetName, uint16_t count=0, const Optional< std::string > &parentCategoryName=EmptyOptional()) override
const ICounterDirectory & GetCounterDirectory() const
void PrintCounterDirectory(ICounterDirectory &counterDirectory)