1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include "IPacketBuffer.hpp" 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ISendTimelinePacket.hpp> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ICounterDirectory.hpp> 13*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Packet.hpp> 14*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp> 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker #include <algorithm> 17*89c4ff92SAndroid Build Coastguard Worker #include <cstring> 18*89c4ff92SAndroid Build Coastguard Worker #include <memory> 19*89c4ff92SAndroid Build Coastguard Worker #include <string> 20*89c4ff92SAndroid Build Coastguard Worker #include <thread> 21*89c4ff92SAndroid Build Coastguard Worker #include <vector> 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker namespace arm 24*89c4ff92SAndroid Build Coastguard Worker { 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker namespace pipe 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent 30*89c4ff92SAndroid Build Coastguard Worker 31*89c4ff92SAndroid Build Coastguard Worker void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize); 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId); 34*89c4ff92SAndroid Build Coastguard Worker 35*89c4ff92SAndroid Build Coastguard Worker uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType); 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard Worker void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value); 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value); 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Worker void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value); 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker void WriteUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint8_t value); 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize); 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value); 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value); 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value); 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value); 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]); 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset); 58*89c4ff92SAndroid Build Coastguard Worker 59*89c4ff92SAndroid Build Coastguard Worker uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset); 60*89c4ff92SAndroid Build Coastguard Worker 61*89c4ff92SAndroid Build Coastguard Worker uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset); 62*89c4ff92SAndroid Build Coastguard Worker 63*89c4ff92SAndroid Build Coastguard Worker uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset); 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]); 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset); 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Worker uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset); 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset); 72*89c4ff92SAndroid Build Coastguard Worker 73*89c4ff92SAndroid Build Coastguard Worker uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset); 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker std::pair<uint32_t, uint32_t> CreateTimelinePacketHeader(uint32_t packetFamily, 76*89c4ff92SAndroid Build Coastguard Worker uint32_t packetClass, 77*89c4ff92SAndroid Build Coastguard Worker uint32_t packetType, 78*89c4ff92SAndroid Build Coastguard Worker uint32_t streamId, 79*89c4ff92SAndroid Build Coastguard Worker uint32_t sequenceNumbered, 80*89c4ff92SAndroid Build Coastguard Worker uint32_t dataLength); 81*89c4ff92SAndroid Build Coastguard Worker 82*89c4ff92SAndroid Build Coastguard Worker std::string GetProcessName(); 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker enum class TimelinePacketStatus 85*89c4ff92SAndroid Build Coastguard Worker { 86*89c4ff92SAndroid Build Coastguard Worker Ok, 87*89c4ff92SAndroid Build Coastguard Worker Error, 88*89c4ff92SAndroid Build Coastguard Worker BufferExhaustion 89*89c4ff92SAndroid Build Coastguard Worker }; 90*89c4ff92SAndroid Build Coastguard Worker 91*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid, 92*89c4ff92SAndroid Build Coastguard Worker const std::string& label, 93*89c4ff92SAndroid Build Coastguard Worker unsigned char* buffer, 94*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 95*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid, 98*89c4ff92SAndroid Build Coastguard Worker unsigned char* buffer, 99*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 100*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType, 103*89c4ff92SAndroid Build Coastguard Worker uint64_t relationshipGuid, 104*89c4ff92SAndroid Build Coastguard Worker uint64_t headGuid, 105*89c4ff92SAndroid Build Coastguard Worker uint64_t tailGuid, 106*89c4ff92SAndroid Build Coastguard Worker uint64_t attributeGuid, 107*89c4ff92SAndroid Build Coastguard Worker unsigned char* buffer, 108*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 109*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 110*89c4ff92SAndroid Build Coastguard Worker 111*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer, 112*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 113*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 114*89c4ff92SAndroid Build Coastguard Worker 115*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid, 116*89c4ff92SAndroid Build Coastguard Worker uint64_t nameGuid, 117*89c4ff92SAndroid Build Coastguard Worker unsigned char* buffer, 118*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 119*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 120*89c4ff92SAndroid Build Coastguard Worker 121*89c4ff92SAndroid Build Coastguard Worker TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp, 122*89c4ff92SAndroid Build Coastguard Worker int threadId, 123*89c4ff92SAndroid Build Coastguard Worker uint64_t profilingGuid, 124*89c4ff92SAndroid Build Coastguard Worker unsigned char* buffer, 125*89c4ff92SAndroid Build Coastguard Worker unsigned int bufferSize, 126*89c4ff92SAndroid Build Coastguard Worker unsigned int& numberOfBytesWritten); 127*89c4ff92SAndroid Build Coastguard Worker 128*89c4ff92SAndroid Build Coastguard Worker std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth); 129*89c4ff92SAndroid Build Coastguard Worker 130*89c4ff92SAndroid Build Coastguard Worker uint64_t GetTimestamp(); 131*89c4ff92SAndroid Build Coastguard Worker 132*89c4ff92SAndroid Build Coastguard Worker arm::pipe::Packet ReceivePacket(const unsigned char* buffer, uint32_t length); 133*89c4ff92SAndroid Build Coastguard Worker 134*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 135*89c4ff92SAndroid Build Coastguard Worker 136*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 137*89c4ff92SAndroid Build Coastguard Worker 138*89c4ff92SAndroid Build Coastguard Worker namespace std 139*89c4ff92SAndroid Build Coastguard Worker { 140*89c4ff92SAndroid Build Coastguard Worker 141*89c4ff92SAndroid Build Coastguard Worker bool operator==(const std::vector<uint8_t>& left, int right); 142*89c4ff92SAndroid Build Coastguard Worker 143*89c4ff92SAndroid Build Coastguard Worker } // namespace std 144