blob: 6a757c2c0be3e4d4f39716ec68853faa408d77fd [file] [log] [blame]
Jim Flynn01d02812020-04-29 21:12:13 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Jim Flynn01d02812020-04-29 21:12:13 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "RequestCountersPacketHandler.hpp"
7
Jim Flynn75c14f42022-03-10 22:05:42 +00008#include <common/include/NumericCast.hpp>
Matthew Sloyan371b70e2020-09-11 10:14:57 +01009#include <common/include/PacketVersionResolver.hpp>
Jim Flynn01d02812020-04-29 21:12:13 +010010#include <common/include/ProfilingException.hpp>
11
Jim Flynnc454ac92022-03-16 18:43:18 +000012#include <server/include/timelineDecoder/DirectoryCaptureCommandHandler.hpp>
13
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000014namespace arm
Jim Flynn01d02812020-04-29 21:12:13 +010015{
16
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000017namespace pipe
Jim Flynn01d02812020-04-29 21:12:13 +010018{
19
20std::vector<uint32_t> RequestCountersPacketHandler::GetHeadersAccepted()
21{
22 std::vector<uint32_t> headers;
23 headers.push_back(m_CounterDirectoryMessageHeader); // counter directory
24 return headers;
25}
26
Jim Flynnbbfe6032020-07-20 16:57:44 +010027void RequestCountersPacketHandler::HandlePacket(const arm::pipe::Packet& packet)
Jim Flynn01d02812020-04-29 21:12:13 +010028{
29 if (packet.GetHeader() != m_CounterDirectoryMessageHeader)
30 {
31 return;
32 }
Jim Flynnbbfe6032020-07-20 16:57:44 +010033 arm::pipe::PacketVersionResolver packetVersionResolver;
Jim Flynn01d02812020-04-29 21:12:13 +010034 DirectoryCaptureCommandHandler directoryCaptureCommandHandler(
Jim Flynn4a962112022-03-13 20:18:58 +000035 "ARMNN", 0, 2, packetVersionResolver.ResolvePacketVersion(0, 2).GetEncodedValue());
Jim Flynn01d02812020-04-29 21:12:13 +010036 directoryCaptureCommandHandler.operator()(packet);
37 const ICounterDirectory& counterDirectory = directoryCaptureCommandHandler.GetCounterDirectory();
38 for (auto& category : counterDirectory.GetCategories())
39 {
40 // Remember we need to translate the Uid's from our CounterDirectory instance to the parent one.
41 std::vector<uint16_t> translatedCounters;
42 for (auto const& copyUid : category->m_Counters)
43 {
44 translatedCounters.emplace_back(directoryCaptureCommandHandler.TranslateUIDCopyToOriginal(copyUid));
45 }
46 m_IdList.insert(std::end(m_IdList), std::begin(translatedCounters), std::end(translatedCounters));
47 }
48 SendCounterSelectionPacket();
49}
50
51void RequestCountersPacketHandler::SendCounterSelectionPacket()
52{
53 uint32_t uint16_t_size = sizeof(uint16_t);
54 uint32_t uint32_t_size = sizeof(uint32_t);
55
56 uint32_t offset = 0;
Jim Flynn75c14f42022-03-10 22:05:42 +000057 uint32_t bodySize = uint32_t_size + arm::pipe::numeric_cast<uint32_t>(m_IdList.size()) * uint16_t_size;
Jim Flynn01d02812020-04-29 21:12:13 +010058
59 auto uniqueData = std::make_unique<unsigned char[]>(bodySize);
60 auto data = reinterpret_cast<unsigned char*>(uniqueData.get());
61
62 // Copy capturePeriod
63 WriteUint32(data, offset, m_CapturePeriod);
64
65 // Copy m_IdList
66 offset += uint32_t_size;
67 for (const uint16_t& id : m_IdList)
68 {
69 WriteUint16(data, offset, id);
70 offset += uint16_t_size;
71 }
72
Jim Flynnbbfe6032020-07-20 16:57:44 +010073 arm::pipe::Packet packet(0x40000, bodySize, uniqueData);
Jim Flynn01d02812020-04-29 21:12:13 +010074 m_Connection->ReturnPacket(packet);
75}
76
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000077} // namespace pipe
Jim Flynn01d02812020-04-29 21:12:13 +010078
Jim Flynn75c14f42022-03-10 22:05:42 +000079} // namespace arm