blob: 6cffd8e39a36748d9b2a447bb46ebaff926b662c [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurst15ce78d2014-04-10 09:02:02 +01002 * Copyright (C) ARM Limited 2013-2014. All rights reserved.
Jon Medhurstaaf37a32013-06-11 12:10:56 +01003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef BUFFER_H
10#define BUFFER_H
11
Jon Medhurstaaf37a32013-06-11 12:10:56 +010012#include <stdint.h>
13#include <semaphore.h>
14
Jon Medhurst15ce78d2014-04-10 09:02:02 +010015#include "k/perf_event.h"
16
Jon Medhurstaaf37a32013-06-11 12:10:56 +010017class Sender;
18
Jon Medhurst15ce78d2014-04-10 09:02:02 +010019enum {
20 FRAME_SUMMARY = 1,
21 FRAME_BLOCK_COUNTER = 5,
22 FRAME_EXTERNAL = 10,
23 FRAME_PERF_ATTRS = 11,
24 FRAME_PERF = 12,
25};
26
Jon Medhurstaaf37a32013-06-11 12:10:56 +010027class Buffer {
28public:
29 static const size_t MAXSIZE_PACK32 = 5;
30 static const size_t MAXSIZE_PACK64 = 10;
31
Jon Medhurst15ce78d2014-04-10 09:02:02 +010032 Buffer(int32_t core, int32_t buftype, const int size, sem_t *const readerSem);
33 ~Buffer();
Jon Medhurstaaf37a32013-06-11 12:10:56 +010034
Jon Medhurst15ce78d2014-04-10 09:02:02 +010035 void write(Sender *sender);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010036
Jon Medhurst15ce78d2014-04-10 09:02:02 +010037 int bytesAvailable() const;
38 int contiguousSpaceAvailable() const;
39 void commit(const uint64_t time);
40 void check(const uint64_t time);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010041
Jon Medhurst15ce78d2014-04-10 09:02:02 +010042 // Summary messages
Jon Medhurst96b56152014-10-30 18:01:15 +000043 void summary(const uint64_t currTime, const int64_t timestamp, const int64_t uptime, const int64_t monotonicDelta, const char *const uname);
44 void coreName(const uint64_t currTime, const int core, const int cpuid, const char *const name);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010045
Jon Medhurst15ce78d2014-04-10 09:02:02 +010046 // Block Counter messages
47 bool eventHeader(uint64_t curr_time);
48 bool eventTid(int tid);
Jon Medhurst96b56152014-10-30 18:01:15 +000049 void event(int key, int32_t value);
50 void event64(int key, int64_t value);
Jon Medhurst15ce78d2014-04-10 09:02:02 +010051
52 // Perf Attrs messages
Jon Medhurst96b56152014-10-30 18:01:15 +000053 void pea(const uint64_t currTime, const struct perf_event_attr *const pea, int key);
54 void keys(const uint64_t currTime, const int count, const __u64 *const ids, const int *const keys);
55 void keysOld(const uint64_t currTime, const int keyCount, const int *const keys, const int bytes, const char *const buf);
56 void format(const uint64_t currTime, const int length, const char *const format);
57 void maps(const uint64_t currTime, const int pid, const int tid, const char *const maps);
58 void comm(const uint64_t currTime, const int pid, const int tid, const char *const image, const char *const comm);
59 void onlineCPU(const uint64_t currTime, const uint64_t time, const int cpu);
60 void offlineCPU(const uint64_t currTime, const uint64_t time, const int cpu);
61 void kallsyms(const uint64_t currTime, const char *const kallsyms);
Jon Medhurst15ce78d2014-04-10 09:02:02 +010062
63 void setDone();
64 bool isDone() const;
65
66 // Prefer a new member to using these functions if possible
67 char *getWritePos() { return mBuf + mWritePos; }
68 void advanceWrite(int bytes) { mWritePos = (mWritePos + bytes) & /*mask*/(mSize - 1); }
Jon Medhurste31266f2014-08-04 15:47:44 +010069 static void packInt(char *const buf, const int size, int &writePos, int32_t x);
70 void packInt(int32_t x);
Jon Medhurst96b56152014-10-30 18:01:15 +000071 static void packInt64(char *const buf, const int size, int &writePos, int64_t x);
Jon Medhurste31266f2014-08-04 15:47:44 +010072 void packInt64(int64_t x);
73 void writeBytes(const void *const data, size_t count);
74 void writeString(const char *const str);
Jon Medhurst15ce78d2014-04-10 09:02:02 +010075
76 static void writeLEInt(unsigned char *buf, int v) {
77 buf[0] = (v >> 0) & 0xFF;
78 buf[1] = (v >> 8) & 0xFF;
79 buf[2] = (v >> 16) & 0xFF;
80 buf[3] = (v >> 24) & 0xFF;
81 }
Jon Medhurstaaf37a32013-06-11 12:10:56 +010082
83private:
Jon Medhurst96b56152014-10-30 18:01:15 +000084 void frame();
Jon Medhurst15ce78d2014-04-10 09:02:02 +010085 bool commitReady() const;
86 bool checkSpace(int bytes);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010087
Jon Medhurst96b56152014-10-30 18:01:15 +000088 char *const mBuf;
89 sem_t *const mReaderSem;
90 uint64_t mCommitTime;
91 sem_t mWriterSem;
Jon Medhurst15ce78d2014-04-10 09:02:02 +010092 const int mSize;
93 int mReadPos;
94 int mWritePos;
95 int mCommitPos;
96 bool mAvailable;
97 bool mIsDone;
Jon Medhurst96b56152014-10-30 18:01:15 +000098 const int32_t mCore;
99 const int32_t mBufType;
Jon Medhurst34d97692013-12-19 09:23:06 +0000100
101 // Intentionally unimplemented
102 Buffer(const Buffer &);
103 Buffer &operator=(const Buffer &);
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100104};
105
106#endif // BUFFER_H