1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 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 "ProfilingException.hpp" 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #include <memory> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker namespace arm 13*89c4ff92SAndroid Build Coastguard Worker { 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker namespace pipe 16*89c4ff92SAndroid Build Coastguard Worker { 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker class Packet 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker public: Packet()21*89c4ff92SAndroid Build Coastguard Worker Packet() 22*89c4ff92SAndroid Build Coastguard Worker : m_Header(0) 23*89c4ff92SAndroid Build Coastguard Worker , m_PacketFamily(0) 24*89c4ff92SAndroid Build Coastguard Worker , m_PacketId(0) 25*89c4ff92SAndroid Build Coastguard Worker , m_Length(0) 26*89c4ff92SAndroid Build Coastguard Worker , m_Data(nullptr) 27*89c4ff92SAndroid Build Coastguard Worker {} 28*89c4ff92SAndroid Build Coastguard Worker Packet(uint32_t header)29*89c4ff92SAndroid Build Coastguard Worker Packet(uint32_t header) 30*89c4ff92SAndroid Build Coastguard Worker : m_Header(header) 31*89c4ff92SAndroid Build Coastguard Worker , m_Length(0) 32*89c4ff92SAndroid Build Coastguard Worker , m_Data(nullptr) 33*89c4ff92SAndroid Build Coastguard Worker { 34*89c4ff92SAndroid Build Coastguard Worker m_PacketId = ((header >> 16) & 1023); 35*89c4ff92SAndroid Build Coastguard Worker m_PacketFamily = (header >> 26); 36*89c4ff92SAndroid Build Coastguard Worker } 37*89c4ff92SAndroid Build Coastguard Worker Packet(uint32_t header,uint32_t length,std::unique_ptr<unsigned char[]> & data)38*89c4ff92SAndroid Build Coastguard Worker Packet(uint32_t header, uint32_t length, std::unique_ptr<unsigned char[]>& data) 39*89c4ff92SAndroid Build Coastguard Worker : m_Header(header) 40*89c4ff92SAndroid Build Coastguard Worker , m_Length(length) 41*89c4ff92SAndroid Build Coastguard Worker , m_Data(std::move(data)) 42*89c4ff92SAndroid Build Coastguard Worker { 43*89c4ff92SAndroid Build Coastguard Worker m_PacketId = ((header >> 16) & 1023); 44*89c4ff92SAndroid Build Coastguard Worker m_PacketFamily = (header >> 26); 45*89c4ff92SAndroid Build Coastguard Worker 46*89c4ff92SAndroid Build Coastguard Worker if (length == 0 && m_Data != nullptr) 47*89c4ff92SAndroid Build Coastguard Worker { 48*89c4ff92SAndroid Build Coastguard Worker throw arm::pipe::InvalidArgumentException("Data should be null when length is zero"); 49*89c4ff92SAndroid Build Coastguard Worker } 50*89c4ff92SAndroid Build Coastguard Worker } 51*89c4ff92SAndroid Build Coastguard Worker Packet(Packet && other)52*89c4ff92SAndroid Build Coastguard Worker Packet(Packet&& other) 53*89c4ff92SAndroid Build Coastguard Worker : m_Header(other.m_Header) 54*89c4ff92SAndroid Build Coastguard Worker , m_PacketFamily(other.m_PacketFamily) 55*89c4ff92SAndroid Build Coastguard Worker , m_PacketId(other.m_PacketId) 56*89c4ff92SAndroid Build Coastguard Worker , m_Length(other.m_Length) 57*89c4ff92SAndroid Build Coastguard Worker , m_Data(std::move(other.m_Data)) 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker other.m_Header = 0; 60*89c4ff92SAndroid Build Coastguard Worker other.m_PacketFamily = 0; 61*89c4ff92SAndroid Build Coastguard Worker other.m_PacketId = 0; 62*89c4ff92SAndroid Build Coastguard Worker other.m_Length = 0; 63*89c4ff92SAndroid Build Coastguard Worker } 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker ~Packet() = default; 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker Packet(const Packet& other) = delete; 68*89c4ff92SAndroid Build Coastguard Worker Packet& operator=(const Packet&) = delete; 69*89c4ff92SAndroid Build Coastguard Worker Packet& operator=(Packet&&) = default; 70*89c4ff92SAndroid Build Coastguard Worker GetHeader() const71*89c4ff92SAndroid Build Coastguard Worker uint32_t GetHeader() const { return m_Header; } GetPacketFamily() const72*89c4ff92SAndroid Build Coastguard Worker uint32_t GetPacketFamily() const { return m_PacketFamily; } GetPacketId() const73*89c4ff92SAndroid Build Coastguard Worker uint32_t GetPacketId() const { return m_PacketId; } GetPacketClass() const74*89c4ff92SAndroid Build Coastguard Worker uint32_t GetPacketClass() const { return m_PacketId >> 3; } GetPacketType() const75*89c4ff92SAndroid Build Coastguard Worker uint32_t GetPacketType() const { return m_PacketId & 7; } GetLength() const76*89c4ff92SAndroid Build Coastguard Worker uint32_t GetLength() const { return m_Length; } GetData() const77*89c4ff92SAndroid Build Coastguard Worker const unsigned char* GetData() const { return m_Data.get(); } 78*89c4ff92SAndroid Build Coastguard Worker IsEmpty()79*89c4ff92SAndroid Build Coastguard Worker bool IsEmpty() { return m_Header == 0 && m_Length == 0; } 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker private: 82*89c4ff92SAndroid Build Coastguard Worker uint32_t m_Header; 83*89c4ff92SAndroid Build Coastguard Worker uint32_t m_PacketFamily; 84*89c4ff92SAndroid Build Coastguard Worker uint32_t m_PacketId; 85*89c4ff92SAndroid Build Coastguard Worker uint32_t m_Length; 86*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<unsigned char[]> m_Data; 87*89c4ff92SAndroid Build Coastguard Worker }; 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 90*89c4ff92SAndroid Build Coastguard Worker 91*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 92