2 * Copyright (C) ARM Limited 2013-2014. All rights reserved.
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.
13 #include <semaphore.h>
15 #include "k/perf_event.h"
21 FRAME_BLOCK_COUNTER = 5,
23 FRAME_PERF_ATTRS = 11,
29 static const size_t MAXSIZE_PACK32 = 5;
30 static const size_t MAXSIZE_PACK64 = 10;
32 Buffer(int32_t core, int32_t buftype, const int size, sem_t *const readerSem);
35 void write(Sender *sender);
37 int bytesAvailable() const;
38 int contiguousSpaceAvailable() const;
39 void commit(const uint64_t time);
40 void check(const uint64_t time);
43 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);
46 // Block Counter messages
47 bool eventHeader(uint64_t curr_time);
48 bool eventTid(int tid);
49 void event(int key, int32_t value);
50 void event64(int key, int64_t value);
52 // Perf Attrs messages
53 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);
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); }
69 static void packInt(char *const buf, const int size, int &writePos, int32_t x);
70 void packInt(int32_t x);
71 static void packInt64(char *const buf, const int size, int &writePos, int64_t x);
72 void packInt64(int64_t x);
73 void writeBytes(const void *const data, size_t count);
74 void writeString(const char *const str);
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;
85 bool commitReady() const;
86 bool checkSpace(int bytes);
89 sem_t *const mReaderSem;
99 const int32_t mBufType;
101 // Intentionally unimplemented
102 Buffer(const Buffer &);
103 Buffer &operator=(const Buffer &);