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