2 * Copyright (C) ARM Limited 2013-2015. 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, const bool force = false);
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 marshalPea(const uint64_t currTime, const struct perf_event_attr *const pea, int key);
54 void marshalKeys(const uint64_t currTime, const int count, const __u64 *const ids, const int *const keys);
55 void marshalKeysOld(const uint64_t currTime, const int keyCount, const int *const keys, const int bytes, const char *const buf);
56 void marshalFormat(const uint64_t currTime, const int length, const char *const format);
57 void marshalMaps(const uint64_t currTime, const int pid, const int tid, const char *const maps);
58 void marshalComm(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 int cpu);
60 void offlineCPU(const uint64_t currTime, const int cpu);
61 void marshalKallsyms(const uint64_t currTime, const char *const kallsyms);
62 void perfCounterHeader(const uint64_t time);
63 void perfCounter(const int core, const int key, const int64_t value);
64 void perfCounterFooter(const uint64_t currTime);
69 // Prefer a new member to using these functions if possible
70 char *getWritePos() { return mBuf + mWritePos; }
71 void advanceWrite(int bytes) { mWritePos = (mWritePos + bytes) & /*mask*/(mSize - 1); }
72 static void packInt(char *const buf, const int size, int &writePos, int32_t x);
73 void packInt(int32_t x);
74 static void packInt64(char *const buf, const int size, int &writePos, int64_t x);
75 void packInt64(int64_t x);
76 void writeBytes(const void *const data, size_t count);
77 void writeString(const char *const str);
79 static void writeLEInt(unsigned char *buf, int v) {
80 buf[0] = (v >> 0) & 0xFF;
81 buf[1] = (v >> 8) & 0xFF;
82 buf[2] = (v >> 16) & 0xFF;
83 buf[3] = (v >> 24) & 0xFF;
88 bool commitReady() const;
89 bool checkSpace(int bytes);
92 sem_t *const mReaderSem;
102 const int32_t mBufType;
104 // Intentionally unimplemented
105 Buffer(const Buffer &);
106 Buffer &operator=(const Buffer &);