| /** |
| * Copyright (C) ARM Limited 2013-2014. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| |
| #ifndef BUFFER_H |
| #define BUFFER_H |
| |
| #include <stdint.h> |
| #include <semaphore.h> |
| |
| #include "k/perf_event.h" |
| |
| class Sender; |
| |
| enum { |
| FRAME_SUMMARY = 1, |
| FRAME_BLOCK_COUNTER = 5, |
| FRAME_EXTERNAL = 10, |
| FRAME_PERF_ATTRS = 11, |
| FRAME_PERF = 12, |
| }; |
| |
| class Buffer { |
| public: |
| static const size_t MAXSIZE_PACK32 = 5; |
| static const size_t MAXSIZE_PACK64 = 10; |
| |
| Buffer(int32_t core, int32_t buftype, const int size, sem_t *const readerSem); |
| ~Buffer(); |
| |
| void write(Sender *sender); |
| |
| int bytesAvailable() const; |
| int contiguousSpaceAvailable() const; |
| void commit(const uint64_t time); |
| void check(const uint64_t time); |
| |
| void frame(); |
| |
| // Summary messages |
| void summary(const int64_t timestamp, const int64_t uptime, const int64_t monotonicDelta, const char *const uname); |
| void coreName(const int core, const int cpuid, const char *const name); |
| |
| // Block Counter messages |
| bool eventHeader(uint64_t curr_time); |
| bool eventTid(int tid); |
| void event(int32_t key, int32_t value); |
| void event64(int64_t key, int64_t value); |
| |
| // Perf Attrs messages |
| void pea(const struct perf_event_attr *const pea, int key); |
| void keys(const int count, const __u64 *const ids, const int *const keys); |
| void format(const int length, const char *const format); |
| void maps(const int pid, const int tid, const char *const maps); |
| void comm(const int pid, const int tid, const char *const image, const char *const comm); |
| |
| void setDone(); |
| bool isDone() const; |
| |
| // Prefer a new member to using these functions if possible |
| char *getWritePos() { return mBuf + mWritePos; } |
| void advanceWrite(int bytes) { mWritePos = (mWritePos + bytes) & /*mask*/(mSize - 1); } |
| |
| static void writeLEInt(unsigned char *buf, int v) { |
| buf[0] = (v >> 0) & 0xFF; |
| buf[1] = (v >> 8) & 0xFF; |
| buf[2] = (v >> 16) & 0xFF; |
| buf[3] = (v >> 24) & 0xFF; |
| } |
| |
| private: |
| bool commitReady() const; |
| bool checkSpace(int bytes); |
| |
| void packInt(int32_t x); |
| void packInt64(int64_t x); |
| void writeBytes(const void *const data, size_t count); |
| void writeString(const char *const str); |
| |
| const int32_t mCore; |
| const int32_t mBufType; |
| const int mSize; |
| int mReadPos; |
| int mWritePos; |
| int mCommitPos; |
| bool mAvailable; |
| bool mIsDone; |
| char *const mBuf; |
| uint64_t mCommitTime; |
| sem_t *const mReaderSem; |
| |
| // Intentionally unimplemented |
| Buffer(const Buffer &); |
| Buffer &operator=(const Buffer &); |
| }; |
| |
| #endif // BUFFER_H |