summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'driver/gator_marshaling.c')
-rw-r--r--driver/gator_marshaling.c152
1 files changed, 104 insertions, 48 deletions
diff --git a/driver/gator_marshaling.c b/driver/gator_marshaling.c
index 630d142..a84b280 100644
--- a/driver/gator_marshaling.c
+++ b/driver/gator_marshaling.c
@@ -9,40 +9,44 @@
9 9
10static void marshal_summary(long long timestamp, long long uptime) { 10static void marshal_summary(long long timestamp, long long uptime) {
11 int cpu = 0; 11 int cpu = 0;
12 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, MESSAGE_SUMMARY); 12 gator_buffer_write_packed_int64(cpu, SUMMARY_BUF, timestamp);
13 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, timestamp); 13 gator_buffer_write_packed_int64(cpu, SUMMARY_BUF, uptime);
14 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, uptime); 14 buffer_check(cpu, SUMMARY_BUF);
15} 15}
16 16
17static bool marshal_cookie_header(char* text) { 17static bool marshal_cookie_header(char* text) {
18 int cpu = smp_processor_id(); 18 int cpu = smp_processor_id();
19 return buffer_check_space(cpu, BACKTRACE_BUF, strlen(text) + 2 * MAXSIZE_PACK32); 19 return buffer_check_space(cpu, NAME_BUF, strlen(text) + 2*MAXSIZE_PACK32);
20} 20}
21 21
22static void marshal_cookie(int cookie, char* text) { 22static void marshal_cookie(int cookie, char* text) {
23 int cpu = smp_processor_id(); 23 int cpu = smp_processor_id();
24 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, MESSAGE_COOKIE); 24 // TODO(dreric01) How long can the string be?
25 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, cookie); 25 if (buffer_check_space(cpu, NAME_BUF, 2*MAXSIZE_PACK32)) {
26 gator_buffer_write_string(cpu, BACKTRACE_BUF, text); 26 gator_buffer_write_packed_int(cpu, NAME_BUF, MESSAGE_COOKIE);
27 gator_buffer_write_packed_int(cpu, NAME_BUF, cookie);
28 gator_buffer_write_string(cpu, NAME_BUF, text);
29 }
30 buffer_check(cpu, NAME_BUF);
27} 31}
28 32
29static void marshal_pid_name(int pid, char* name) { 33static void marshal_thread_name(int pid, char* name) {
30 unsigned long flags, cpu; 34 unsigned long flags, cpu;
31 local_irq_save(flags); 35 local_irq_save(flags);
32 cpu = smp_processor_id(); 36 cpu = smp_processor_id();
33 if (buffer_check_space(cpu, BACKTRACE_BUF, TASK_COMM_LEN + 2 * MAXSIZE_PACK32 + MAXSIZE_PACK64)) { 37 if (buffer_check_space(cpu, NAME_BUF, TASK_COMM_LEN + 2*MAXSIZE_PACK32 + MAXSIZE_PACK64)) {
34 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, MESSAGE_PID_NAME); 38 gator_buffer_write_packed_int(cpu, NAME_BUF, MESSAGE_THREAD_NAME);
35 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, gator_get_time()); 39 gator_buffer_write_packed_int64(cpu, NAME_BUF, gator_get_time());
36 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, pid); 40 gator_buffer_write_packed_int(cpu, NAME_BUF, pid);
37 gator_buffer_write_string(cpu, BACKTRACE_BUF, name); 41 gator_buffer_write_string(cpu, NAME_BUF, name);
38 } 42 }
39 local_irq_restore(flags); 43 local_irq_restore(flags);
44 buffer_check(cpu, NAME_BUF);
40} 45}
41 46
42static bool marshal_backtrace_header(int exec_cookie, int tgid, int pid, int inKernel) { 47static bool marshal_backtrace_header(int exec_cookie, int tgid, int pid, int inKernel) {
43 int cpu = smp_processor_id(); 48 int cpu = smp_processor_id();
44 if (buffer_check_space(cpu, BACKTRACE_BUF, gator_backtrace_depth * 2 * MAXSIZE_PACK32)) { 49 if (buffer_check_space(cpu, BACKTRACE_BUF, gator_backtrace_depth*2*MAXSIZE_PACK32)) {
45 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, MESSAGE_START_BACKTRACE);
46 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, gator_get_time()); 50 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, gator_get_time());
47 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, exec_cookie); 51 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, exec_cookie);
48 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, tgid); 52 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, tgid);
@@ -57,9 +61,9 @@ static bool marshal_backtrace_header(int exec_cookie, int tgid, int pid, int inK
57 return false; 61 return false;
58} 62}
59 63
60static void marshal_backtrace(int address, int cookie) { 64static void marshal_backtrace(unsigned long address, int cookie) {
61 int cpu = smp_processor_id(); 65 int cpu = smp_processor_id();
62 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, address); 66 gator_buffer_write_packed_int64(cpu, BACKTRACE_BUF, address);
63 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, cookie); 67 gator_buffer_write_packed_int(cpu, BACKTRACE_BUF, cookie);
64} 68}
65 69
@@ -76,15 +80,15 @@ static bool marshal_event_header(void) {
76 bool retval = false; 80 bool retval = false;
77 81
78 local_irq_save(flags); 82 local_irq_save(flags);
79 if (buffer_check_space(cpu, COUNTER_BUF, MAXSIZE_PACK32 + MAXSIZE_PACK64)) { 83 if (buffer_check_space(cpu, BLOCK_COUNTER_BUF, MAXSIZE_PACK32 + MAXSIZE_PACK64)) {
80 gator_buffer_write_packed_int(cpu, COUNTER_BUF, 0); // key of zero indicates a timestamp 84 gator_buffer_write_packed_int(cpu, BLOCK_COUNTER_BUF, 0); // key of zero indicates a timestamp
81 gator_buffer_write_packed_int64(cpu, COUNTER_BUF, gator_get_time()); 85 gator_buffer_write_packed_int64(cpu, BLOCK_COUNTER_BUF, gator_get_time());
82 retval = true; 86 retval = true;
83 } 87 }
84 local_irq_restore(flags); 88 local_irq_restore(flags);
85 89
86 // Check and commit; commit is set to occur once buffer is 3/4 full 90 // Check and commit; commit is set to occur once buffer is 3/4 full
87 buffer_check(cpu, COUNTER_BUF); 91 buffer_check(cpu, BLOCK_COUNTER_BUF);
88 92
89 return retval; 93 return retval;
90} 94}
@@ -104,17 +108,17 @@ static void marshal_event(int len, int* buffer) {
104 // events must be written in key,value pairs 108 // events must be written in key,value pairs
105 for (i = 0; i < len; i += 2) { 109 for (i = 0; i < len; i += 2) {
106 local_irq_save(flags); 110 local_irq_save(flags);
107 if (!buffer_check_space(cpu, COUNTER_BUF, MAXSIZE_PACK32 * 2)) { 111 if (!buffer_check_space(cpu, BLOCK_COUNTER_BUF, 2*MAXSIZE_PACK32)) {
108 local_irq_restore(flags); 112 local_irq_restore(flags);
109 break; 113 break;
110 } 114 }
111 gator_buffer_write_packed_int(cpu, COUNTER_BUF, buffer[i]); 115 gator_buffer_write_packed_int(cpu, BLOCK_COUNTER_BUF, buffer[i]);
112 gator_buffer_write_packed_int(cpu, COUNTER_BUF, buffer[i + 1]); 116 gator_buffer_write_packed_int(cpu, BLOCK_COUNTER_BUF, buffer[i + 1]);
113 local_irq_restore(flags); 117 local_irq_restore(flags);
114 } 118 }
115 119
116 // Check and commit; commit is set to occur once buffer is 3/4 full 120 // Check and commit; commit is set to occur once buffer is 3/4 full
117 buffer_check(cpu, COUNTER_BUF); 121 buffer_check(cpu, BLOCK_COUNTER_BUF);
118} 122}
119 123
120static void marshal_event64(int len, long long* buffer64) { 124static void marshal_event64(int len, long long* buffer64) {
@@ -132,17 +136,17 @@ static void marshal_event64(int len, long long* buffer64) {
132 // events must be written in key,value pairs 136 // events must be written in key,value pairs
133 for (i = 0; i < len; i += 2) { 137 for (i = 0; i < len; i += 2) {
134 local_irq_save(flags); 138 local_irq_save(flags);
135 if (!buffer_check_space(cpu, COUNTER_BUF, MAXSIZE_PACK64 * 2)) { 139 if (!buffer_check_space(cpu, BLOCK_COUNTER_BUF, 2*MAXSIZE_PACK64)) {
136 local_irq_restore(flags); 140 local_irq_restore(flags);
137 break; 141 break;
138 } 142 }
139 gator_buffer_write_packed_int64(cpu, COUNTER_BUF, buffer64[i]); 143 gator_buffer_write_packed_int64(cpu, BLOCK_COUNTER_BUF, buffer64[i]);
140 gator_buffer_write_packed_int64(cpu, COUNTER_BUF, buffer64[i + 1]); 144 gator_buffer_write_packed_int64(cpu, BLOCK_COUNTER_BUF, buffer64[i + 1]);
141 local_irq_restore(flags); 145 local_irq_restore(flags);
142 } 146 }
143 147
144 // Check and commit; commit is set to occur once buffer is 3/4 full 148 // Check and commit; commit is set to occur once buffer is 3/4 full
145 buffer_check(cpu, COUNTER_BUF); 149 buffer_check(cpu, BLOCK_COUNTER_BUF);
146} 150}
147 151
148#if GATOR_CPU_FREQ_SUPPORT 152#if GATOR_CPU_FREQ_SUPPORT
@@ -151,28 +155,28 @@ static void marshal_event_single(int core, int key, int value) {
151 155
152 local_irq_save(flags); 156 local_irq_save(flags);
153 cpu = smp_processor_id(); 157 cpu = smp_processor_id();
154 if (buffer_check_space(cpu, COUNTER2_BUF, MAXSIZE_PACK64 + MAXSIZE_PACK32 * 3)) { 158 if (buffer_check_space(cpu, COUNTER_BUF, MAXSIZE_PACK64 + 3*MAXSIZE_PACK32)) {
155 gator_buffer_write_packed_int64(cpu, COUNTER2_BUF, gator_get_time()); 159 gator_buffer_write_packed_int64(cpu, COUNTER_BUF, gator_get_time());
156 gator_buffer_write_packed_int(cpu, COUNTER2_BUF, core); 160 gator_buffer_write_packed_int(cpu, COUNTER_BUF, core);
157 gator_buffer_write_packed_int(cpu, COUNTER2_BUF, key); 161 gator_buffer_write_packed_int(cpu, COUNTER_BUF, key);
158 gator_buffer_write_packed_int(cpu, COUNTER2_BUF, value); 162 gator_buffer_write_packed_int(cpu, COUNTER_BUF, value);
159 } 163 }
160 local_irq_restore(flags); 164 local_irq_restore(flags);
161 165
162 // Check and commit; commit is set to occur once buffer is 3/4 full 166 // Check and commit; commit is set to occur once buffer is 3/4 full
163 buffer_check(cpu, COUNTER2_BUF); 167 buffer_check(cpu, COUNTER_BUF);
164} 168}
165#endif 169#endif
166 170
167static void marshal_sched_gpu(int type, int unit, int core, int tgid, int pid) { 171static void marshal_sched_gpu_start(int unit, int core, int tgid, int pid) {
168 unsigned long cpu = smp_processor_id(), flags; 172 unsigned long cpu = smp_processor_id(), flags;
169 173
170 if (!per_cpu(gator_buffer, cpu)[GPU_TRACE_BUF]) 174 if (!per_cpu(gator_buffer, cpu)[GPU_TRACE_BUF])
171 return; 175 return;
172 176
173 local_irq_save(flags); 177 local_irq_save(flags);
174 if (buffer_check_space(cpu, GPU_TRACE_BUF, MAXSIZE_PACK64 + 5 * MAXSIZE_PACK32)) { 178 if (buffer_check_space(cpu, GPU_TRACE_BUF, MAXSIZE_PACK64 + 5*MAXSIZE_PACK32)) {
175 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, type); 179 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, MESSAGE_GPU_START);
176 gator_buffer_write_packed_int64(cpu, GPU_TRACE_BUF, gator_get_time()); 180 gator_buffer_write_packed_int64(cpu, GPU_TRACE_BUF, gator_get_time());
177 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, unit); 181 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, unit);
178 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, core); 182 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, core);
@@ -185,18 +189,37 @@ static void marshal_sched_gpu(int type, int unit, int core, int tgid, int pid) {
185 buffer_check(cpu, GPU_TRACE_BUF); 189 buffer_check(cpu, GPU_TRACE_BUF);
186} 190}
187 191
188static void marshal_sched_trace(int type, int pid, int tgid, int cookie, int state) { 192static void marshal_sched_gpu_stop(int unit, int core) {
193 unsigned long cpu = smp_processor_id(), flags;
194
195 if (!per_cpu(gator_buffer, cpu)[GPU_TRACE_BUF])
196 return;
197
198 local_irq_save(flags);
199 if (buffer_check_space(cpu, GPU_TRACE_BUF, MAXSIZE_PACK64 + 3*MAXSIZE_PACK32)) {
200 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, MESSAGE_GPU_STOP);
201 gator_buffer_write_packed_int64(cpu, GPU_TRACE_BUF, gator_get_time());
202 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, unit);
203 gator_buffer_write_packed_int(cpu, GPU_TRACE_BUF, core);
204 }
205 local_irq_restore(flags);
206
207 // Check and commit; commit is set to occur once buffer is 3/4 full
208 buffer_check(cpu, GPU_TRACE_BUF);
209}
210
211static void marshal_sched_trace_switch(int tgid, int pid, int cookie, int state) {
189 unsigned long cpu = smp_processor_id(), flags; 212 unsigned long cpu = smp_processor_id(), flags;
190 213
191 if (!per_cpu(gator_buffer, cpu)[SCHED_TRACE_BUF]) 214 if (!per_cpu(gator_buffer, cpu)[SCHED_TRACE_BUF])
192 return; 215 return;
193 216
194 local_irq_save(flags); 217 local_irq_save(flags);
195 if (buffer_check_space(cpu, SCHED_TRACE_BUF, MAXSIZE_PACK64 + 5 * MAXSIZE_PACK32)) { 218 if (buffer_check_space(cpu, SCHED_TRACE_BUF, MAXSIZE_PACK64 + 5*MAXSIZE_PACK32)) {
196 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, type); 219 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, MESSAGE_SCHED_SWITCH);
197 gator_buffer_write_packed_int64(cpu, SCHED_TRACE_BUF, gator_get_time()); 220 gator_buffer_write_packed_int64(cpu, SCHED_TRACE_BUF, gator_get_time());
198 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, pid);
199 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, tgid); 221 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, tgid);
222 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, pid);
200 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, cookie); 223 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, cookie);
201 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, state); 224 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, state);
202 } 225 }
@@ -206,21 +229,39 @@ static void marshal_sched_trace(int type, int pid, int tgid, int cookie, int sta
206 buffer_check(cpu, SCHED_TRACE_BUF); 229 buffer_check(cpu, SCHED_TRACE_BUF);
207} 230}
208 231
232static void marshal_sched_trace_exit(int tgid, int pid) {
233 unsigned long cpu = smp_processor_id(), flags;
234
235 if (!per_cpu(gator_buffer, cpu)[SCHED_TRACE_BUF])
236 return;
237
238 local_irq_save(flags);
239 if (buffer_check_space(cpu, SCHED_TRACE_BUF, MAXSIZE_PACK64 + 2*MAXSIZE_PACK32)) {
240 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, MESSAGE_SCHED_EXIT);
241 gator_buffer_write_packed_int64(cpu, SCHED_TRACE_BUF, gator_get_time());
242 gator_buffer_write_packed_int(cpu, SCHED_TRACE_BUF, pid);
243 }
244 local_irq_restore(flags);
245
246 // Check and commit; commit is set to occur once buffer is 3/4 full
247 buffer_check(cpu, SCHED_TRACE_BUF);
248}
249
209#if GATOR_CPU_FREQ_SUPPORT 250#if GATOR_CPU_FREQ_SUPPORT
210static void marshal_wfi(int core, int state) { 251static void marshal_idle(int core, int state) {
211 unsigned long flags, cpu; 252 unsigned long flags, cpu;
212 253
213 local_irq_save(flags); 254 local_irq_save(flags);
214 cpu = smp_processor_id(); 255 cpu = smp_processor_id();
215 if (buffer_check_space(cpu, WFI_BUF, MAXSIZE_PACK64 + MAXSIZE_PACK32 * 2)) { 256 if (buffer_check_space(cpu, IDLE_BUF, MAXSIZE_PACK64 + 2*MAXSIZE_PACK32)) {
216 gator_buffer_write_packed_int64(cpu, WFI_BUF, gator_get_time()); 257 gator_buffer_write_packed_int(cpu, IDLE_BUF, state);
217 gator_buffer_write_packed_int(cpu, WFI_BUF, core); 258 gator_buffer_write_packed_int64(cpu, IDLE_BUF, gator_get_time());
218 gator_buffer_write_packed_int(cpu, WFI_BUF, state); 259 gator_buffer_write_packed_int(cpu, IDLE_BUF, core);
219 } 260 }
220 local_irq_restore(flags); 261 local_irq_restore(flags);
221 262
222 // Check and commit; commit is set to occur once buffer is 3/4 full 263 // Check and commit; commit is set to occur once buffer is 3/4 full
223 buffer_check(cpu, WFI_BUF); 264 buffer_check(cpu, IDLE_BUF);
224} 265}
225#endif 266#endif
226 267
@@ -237,3 +278,18 @@ static void marshal_frame(int cpu, int buftype, int frame) {
237 gator_buffer_write_packed_int(cpu, buftype, frame); 278 gator_buffer_write_packed_int(cpu, buftype, frame);
238 gator_buffer_write_packed_int(cpu, buftype, cpu); 279 gator_buffer_write_packed_int(cpu, buftype, cpu);
239} 280}
281
282#if defined(__arm__) || defined(__aarch64__)
283static void marshal_core_name(const char* name) {
284 int cpu = smp_processor_id();
285 unsigned long flags;
286 local_irq_save(flags);
287 if (buffer_check_space(cpu, NAME_BUF, MAXSIZE_PACK32 + MAXSIZE_CORE_NAME)) {
288 gator_buffer_write_packed_int(cpu, NAME_BUF, HRTIMER_CORE_NAME);
289 gator_buffer_write_string(cpu, NAME_BUF, name);
290 }
291 local_irq_restore(flags);
292
293 buffer_check(cpu, NAME_BUF);
294}
295#endif