blob: cd5167c0942e7ecf8ab4ce7a10ba1362d7571e9f [file] [log] [blame]
Ferran Balaguer73882172019-09-02 16:39:42 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Ferran Balaguer73882172019-09-02 16:39:42 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Narumol Prangnawarat404b2752019-09-24 17:23:16 +01008#include "IPacketBuffer.hpp"
Finn Williams0c8cb992020-05-07 10:38:15 +01009
Jim Flynn27761832022-03-20 21:52:17 +000010#include <client/include/ISendTimelinePacket.hpp>
11
12#include <common/include/ICounterDirectory.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010013#include <common/include/Packet.hpp>
Jim Flynn27761832022-03-20 21:52:17 +000014#include <common/include/ProfilingException.hpp>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010015
Matteo Martincigh6db5f202019-09-05 12:02:04 +010016#include <algorithm>
17#include <cstring>
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010018#include <memory>
19#include <string>
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000020#include <thread>
Colm Donelan5ccb33d2020-01-24 16:27:02 +000021#include <vector>
Ferran Balaguer73882172019-09-02 16:39:42 +010022
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000023namespace arm
Ferran Balaguer73882172019-09-02 16:39:42 +010024{
25
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000026namespace pipe
Ferran Balaguer73882172019-09-02 16:39:42 +010027{
28
Jim Flynn1fdeb992020-07-09 07:28:37 +010029constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent
Colm Donelan5bb3d8a2020-05-12 16:36:46 +010030
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000031void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize);
32
Keith Davis3201eea2019-10-24 17:30:41 +010033uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId);
34
Jim Flynn83d08a92020-07-09 13:48:16 +010035uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType);
36
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000037void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010038
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000039void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010040
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000041void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010042
Matteo Martincigh34a407d2019-11-06 15:30:54 +000043void WriteUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint8_t value);
44
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000045void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize);
46
Francis Murtagh3a161982019-09-04 15:25:02 +010047void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);
48
Ferran Balaguer73882172019-09-02 16:39:42 +010049void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value);
50
51void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value);
52
Matteo Martincigh34a407d2019-11-06 15:30:54 +000053void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value);
54
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000055void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
56
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000057uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Francis Murtagh3a161982019-09-04 15:25:02 +010058
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000059uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +010060
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000061uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Ferran Balaguer73882172019-09-02 16:39:42 +010062
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000063uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset);
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010064
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000065void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
66
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010067uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset);
68
69uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset);
70
71uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset);
72
73uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset);
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +010074
Keith Davis97da5e22020-03-05 16:25:28 +000075std::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
Ferran Balaguer47d0fe92019-09-04 16:47:34 +010082std::string GetProcessName();
83
Matteo Martincigh0aed4f92019-10-01 14:25:34 +010084enum class TimelinePacketStatus
85{
86 Ok,
87 Error,
88 BufferExhaustion
89};
90
91TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid,
92 const std::string& label,
93 unsigned char* buffer,
94 unsigned int bufferSize,
95 unsigned int& numberOfBytesWritten);
96
Keith Davis97da5e22020-03-05 16:25:28 +000097TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid,
98 unsigned char* buffer,
99 unsigned int bufferSize,
100 unsigned int& numberOfBytesWritten);
101
102TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType,
103 uint64_t relationshipGuid,
104 uint64_t headGuid,
105 uint64_t tailGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100106 uint64_t attributeGuid,
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100107 unsigned char* buffer,
108 unsigned int bufferSize,
109 unsigned int& numberOfBytesWritten);
David Monahanf21f6062019-10-07 15:11:15 +0100110
Sadik Armagan784db772019-10-08 15:05:38 +0100111TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer,
112 unsigned int bufferSize,
113 unsigned int& numberOfBytesWritten);
114
Keith Davis97da5e22020-03-05 16:25:28 +0000115TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid,
Jim Flynn1892d212020-05-26 21:10:49 +0100116 uint64_t nameGuid,
Keith Davis97da5e22020-03-05 16:25:28 +0000117 unsigned char* buffer,
118 unsigned int bufferSize,
119 unsigned int& numberOfBytesWritten);
Jan Eilers92fa15b2019-10-15 15:23:25 +0100120
Keith Davis97da5e22020-03-05 16:25:28 +0000121TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp,
Jim Flynn1fdeb992020-07-09 07:28:37 +0100122 int threadId,
Keith Davis97da5e22020-03-05 16:25:28 +0000123 uint64_t profilingGuid,
124 unsigned char* buffer,
125 unsigned int bufferSize,
126 unsigned int& numberOfBytesWritten);
Matteo Martincigh8844c2f2019-10-16 10:29:17 +0100127
Keith Davis3201eea2019-10-24 17:30:41 +0100128std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth);
129
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000130uint64_t GetTimestamp();
Ferran Balaguer73882172019-09-02 16:39:42 +0100131
Jim Flynnbbfe6032020-07-20 16:57:44 +0100132arm::pipe::Packet ReceivePacket(const unsigned char* buffer, uint32_t length);
Jim Flynn4e755a52020-03-29 17:48:26 +0100133
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000134} // namespace pipe
Matteo Martincigh5dc816e2019-11-04 14:05:28 +0000135
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000136} // namespace arm
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000137
138namespace std
139{
140
Jim Flynn1fdeb992020-07-09 07:28:37 +0100141bool operator==(const std::vector<uint8_t>& left, int right);
Matteo Martincigh378bbfc2019-11-04 14:05:28 +0000142
143} // namespace std