blob: 247c9519e04be782d720c1770145fadd90e5658f [file] [log] [blame]
Finn Williamse63a0262019-10-22 10:30:49 +01001//
Jim Flynnaa2eb742020-06-26 13:52:38 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Finn Williamse63a0262019-10-22 10:30:49 +01003// SPDX-License-Identifier: MIT
4//
5
Jim Flynnbbfe6032020-07-20 16:57:44 +01006#include <common/include/CommonProfilingUtils.hpp>
7#include <common/include/Logging.hpp>
8#include <server/include/timelineDecoder/TimelineCaptureCommandHandler.hpp>
Finn Williamse63a0262019-10-22 10:30:49 +01009
Finn Williamse63a0262019-10-22 10:30:49 +010010#include <string>
Jim Flynnbbfe6032020-07-20 16:57:44 +010011
12namespace arm
Finn Williamse63a0262019-10-22 10:30:49 +010013{
14
Jim Flynnbbfe6032020-07-20 16:57:44 +010015namespace pipe
Finn Williamse63a0262019-10-22 10:30:49 +010016{
17
18//Array of member functions, the array index matches the decl_id
Finn Williams8a2b4682020-02-26 10:25:26 +000019const TimelineCaptureCommandHandler::ReadFunction TimelineCaptureCommandHandler::m_ReadFunctions[]
Finn Williamse63a0262019-10-22 10:30:49 +010020{
21 &TimelineCaptureCommandHandler::ReadLabel, // Label decl_id = 0
22 &TimelineCaptureCommandHandler::ReadEntity, // Entity decl_id = 1
23 &TimelineCaptureCommandHandler::ReadEventClass, // EventClass decl_id = 2
24 &TimelineCaptureCommandHandler::ReadRelationship, // Relationship decl_id = 3
25 &TimelineCaptureCommandHandler::ReadEvent // Event decl_id = 4
26};
27
Jim Flynnaa2eb742020-06-26 13:52:38 +010028void TimelineCaptureCommandHandler::SetThreadIdSize(uint32_t size)
29{
30 m_ThreadIdSize = size;
31}
32
Jim Flynnbbfe6032020-07-20 16:57:44 +010033void TimelineCaptureCommandHandler::operator()(const arm::pipe::Packet& packet)
Jim Flynnaa2eb742020-06-26 13:52:38 +010034{
35 ParseData(packet);
36}
37
Jim Flynnbbfe6032020-07-20 16:57:44 +010038void TimelineCaptureCommandHandler::ParseData(const arm::pipe::Packet& packet)
Finn Williamse63a0262019-10-22 10:30:49 +010039{
40 uint32_t offset = 0;
Keith Davis5238aff2020-03-11 12:17:05 +000041 m_PacketLength = packet.GetLength();
Finn Williamse63a0262019-10-22 10:30:49 +010042
Finn Williamse6a2ccd2020-02-27 16:21:41 +000043 // We are expecting TimelineDirectoryCaptureCommandHandler to set the thread id size
44 // if it not set in the constructor
45 if (m_ThreadIdSize == 0)
46 {
Jim Flynnbbfe6032020-07-20 16:57:44 +010047 ARM_PIPE_LOG(error) << "TimelineCaptureCommandHandler: m_ThreadIdSize has not been set";
Finn Williamse6a2ccd2020-02-27 16:21:41 +000048 return;
49 }
50
51 if (packet.GetLength() < 8)
Finn Williamse63a0262019-10-22 10:30:49 +010052 {
53 return;
54 }
55
56 const unsigned char* data = reinterpret_cast<const unsigned char*>(packet.GetData());
57
58 uint32_t declId = 0;
59
Keith Davis5238aff2020-03-11 12:17:05 +000060 while ( offset < m_PacketLength )
61 {
Jim Flynnbbfe6032020-07-20 16:57:44 +010062 declId = arm::pipe::ReadUint32(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +000063 offset += uint32_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +010064
Jim Flynnaa2eb742020-06-26 13:52:38 +010065 ITimelineDecoder::TimelineStatus status = (this->*m_ReadFunctions[declId])(data, offset);
66 if (status == ITimelineDecoder::TimelineStatus::TimelineStatus_Fail)
67 {
Jim Flynnbbfe6032020-07-20 16:57:44 +010068 ARM_PIPE_LOG(error) << "Decode of timeline message type [" << declId <<
Jim Flynnaa2eb742020-06-26 13:52:38 +010069 "] at offset [" << offset << "] failed";
70 break;
71 }
Keith Davis5238aff2020-03-11 12:17:05 +000072 }
Finn Williamse63a0262019-10-22 10:30:49 +010073}
74
Jim Flynnaa2eb742020-06-26 13:52:38 +010075ITimelineDecoder::TimelineStatus TimelineCaptureCommandHandler::ReadLabel(const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010076{
Finn Williams510f6182020-02-21 11:14:08 +000077 ITimelineDecoder::Label label;
Jim Flynnbbfe6032020-07-20 16:57:44 +010078 label.m_Guid = arm::pipe::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +010079 offset += uint64_t_size;
80
Jim Flynnbbfe6032020-07-20 16:57:44 +010081 uint32_t nameLength = arm::pipe::ReadUint32(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +010082 offset += uint32_t_size;
83
Keith Davis5238aff2020-03-11 12:17:05 +000084 uint32_t i = 0;
85 // nameLength - 1 to account for null operator \0
86 for ( i = 0; i < nameLength - 1; ++i )
Finn Williamse63a0262019-10-22 10:30:49 +010087 {
Jim Flynnbbfe6032020-07-20 16:57:44 +010088 label.m_Name += static_cast<char>(arm::pipe::ReadUint8(data, offset + i));
Finn Williamse63a0262019-10-22 10:30:49 +010089 }
Keith Davis5238aff2020-03-11 12:17:05 +000090 // Shift offset past nameLength
91 uint32_t uint32WordAmount = (nameLength / uint32_t_size) + (nameLength % uint32_t_size != 0 ? 1 : 0);
92 offset += uint32WordAmount * uint32_t_size;
93
Jim Flynnaa2eb742020-06-26 13:52:38 +010094 return m_TimelineDecoder.CreateLabel(label);
Finn Williamse63a0262019-10-22 10:30:49 +010095}
96
Jim Flynnaa2eb742020-06-26 13:52:38 +010097ITimelineDecoder::TimelineStatus TimelineCaptureCommandHandler::ReadEntity(
98 const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +010099{
Finn Williams510f6182020-02-21 11:14:08 +0000100 ITimelineDecoder::Entity entity;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100101 entity.m_Guid = arm::pipe::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000102 offset += uint64_t_size;
Jim Flynnaa2eb742020-06-26 13:52:38 +0100103 return m_TimelineDecoder.CreateEntity(entity);
Finn Williamse63a0262019-10-22 10:30:49 +0100104}
105
Jim Flynnaa2eb742020-06-26 13:52:38 +0100106ITimelineDecoder::TimelineStatus TimelineCaptureCommandHandler::ReadEventClass(
107 const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +0100108{
Finn Williams510f6182020-02-21 11:14:08 +0000109 ITimelineDecoder::EventClass eventClass;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100110 eventClass.m_Guid = arm::pipe::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000111 offset += uint64_t_size;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100112 eventClass.m_NameGuid = arm::pipe::ReadUint64(data, offset);
Jim Flynn1892d212020-05-26 21:10:49 +0100113 offset += uint64_t_size;
Jim Flynnaa2eb742020-06-26 13:52:38 +0100114 return m_TimelineDecoder.CreateEventClass(eventClass);
Finn Williamse63a0262019-10-22 10:30:49 +0100115}
116
Jim Flynnaa2eb742020-06-26 13:52:38 +0100117ITimelineDecoder::TimelineStatus TimelineCaptureCommandHandler::ReadRelationship(
118 const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +0100119{
Finn Williams510f6182020-02-21 11:14:08 +0000120 ITimelineDecoder::Relationship relationship;
121 relationship.m_RelationshipType =
Jim Flynnbbfe6032020-07-20 16:57:44 +0100122 static_cast<ITimelineDecoder::RelationshipType>(arm::pipe::ReadUint32(data, offset));
Finn Williamse63a0262019-10-22 10:30:49 +0100123 offset += uint32_t_size;
124
Jim Flynnbbfe6032020-07-20 16:57:44 +0100125 relationship.m_Guid = arm::pipe::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +0100126 offset += uint64_t_size;
127
Jim Flynnbbfe6032020-07-20 16:57:44 +0100128 relationship.m_HeadGuid = arm::pipe::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +0100129 offset += uint64_t_size;
130
Jim Flynnbbfe6032020-07-20 16:57:44 +0100131 relationship.m_TailGuid = arm::pipe::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000132 offset += uint64_t_size;
Finn Williams0a336dc2020-05-11 15:39:58 +0100133
Jim Flynnbbfe6032020-07-20 16:57:44 +0100134 relationship.m_AttributeGuid = arm::pipe::ReadUint64(data, offset);
Finn Williams0a336dc2020-05-11 15:39:58 +0100135 offset += uint64_t_size;
136
Jim Flynnaa2eb742020-06-26 13:52:38 +0100137 return m_TimelineDecoder.CreateRelationship(relationship);
Finn Williamse63a0262019-10-22 10:30:49 +0100138}
139
Jim Flynnaa2eb742020-06-26 13:52:38 +0100140ITimelineDecoder::TimelineStatus TimelineCaptureCommandHandler::ReadEvent(
141 const unsigned char* data, uint32_t& offset)
Finn Williamse63a0262019-10-22 10:30:49 +0100142{
Finn Williams510f6182020-02-21 11:14:08 +0000143 ITimelineDecoder::Event event;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100144 event.m_TimeStamp = arm::pipe::ReadUint64(data, offset);
Finn Williamse63a0262019-10-22 10:30:49 +0100145 offset += uint64_t_size;
146
Keith Davis5238aff2020-03-11 12:17:05 +0000147 if ( m_ThreadIdSize == 4 )
Finn Williams510f6182020-02-21 11:14:08 +0000148 {
Jim Flynnbbfe6032020-07-20 16:57:44 +0100149 event.m_ThreadId = arm::pipe::ReadUint32(data, offset);
Finn Williams510f6182020-02-21 11:14:08 +0000150 }
Keith Davis5238aff2020-03-11 12:17:05 +0000151 else if ( m_ThreadIdSize == 8 )
Finn Williams510f6182020-02-21 11:14:08 +0000152 {
Jim Flynnbbfe6032020-07-20 16:57:44 +0100153 event.m_ThreadId = arm::pipe::ReadUint64(data, offset);
Finn Williams510f6182020-02-21 11:14:08 +0000154 }
155
156 offset += m_ThreadIdSize;
Finn Williamse63a0262019-10-22 10:30:49 +0100157
Jim Flynnbbfe6032020-07-20 16:57:44 +0100158 event.m_Guid = arm::pipe::ReadUint64(data, offset);
Keith Davis5238aff2020-03-11 12:17:05 +0000159 offset += uint64_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +0100160
Jim Flynnaa2eb742020-06-26 13:52:38 +0100161 return m_TimelineDecoder.CreateEvent(event);
Finn Williamse63a0262019-10-22 10:30:49 +0100162}
163
Jim Flynnbbfe6032020-07-20 16:57:44 +0100164} //namespace pipe
Finn Williamse63a0262019-10-22 10:30:49 +0100165
Jim Flynnbbfe6032020-07-20 16:57:44 +0100166} //namespace arm