These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / tools / testing / selftests / powerpc / pmu / ebb / ebb.c
1 /*
2  * Copyright 2014, Michael Ellerman, IBM Corp.
3  * Licensed under GPLv2.
4  */
5
6 #define _GNU_SOURCE     /* For CPU_ZERO etc. */
7
8 #include <sched.h>
9 #include <sys/wait.h>
10 #include <setjmp.h>
11 #include <signal.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <sys/ioctl.h>
16 #include <linux/auxvec.h>
17
18 #include "trace.h"
19 #include "reg.h"
20 #include "ebb.h"
21
22
23 void (*ebb_user_func)(void);
24
25 void ebb_hook(void)
26 {
27         if (ebb_user_func)
28                 ebb_user_func();
29 }
30
31 struct ebb_state ebb_state;
32
33 u64 sample_period = 0x40000000ull;
34
35 void reset_ebb_with_clear_mask(unsigned long mmcr0_clear_mask)
36 {
37         u64 val;
38
39         /* 2) clear MMCR0[PMAO] - docs say BESCR[PMEO] should do this */
40         /* 3) set MMCR0[PMAE]   - docs say BESCR[PME] should do this */
41         val = mfspr(SPRN_MMCR0);
42         mtspr(SPRN_MMCR0, (val & ~mmcr0_clear_mask) | MMCR0_PMAE);
43
44         /* 4) clear BESCR[PMEO] */
45         mtspr(SPRN_BESCRR, BESCR_PMEO);
46
47         /* 5) set BESCR[PME] */
48         mtspr(SPRN_BESCRS, BESCR_PME);
49
50         /* 6) rfebb 1 - done in our caller */
51 }
52
53 void reset_ebb(void)
54 {
55         reset_ebb_with_clear_mask(MMCR0_PMAO | MMCR0_FC);
56 }
57
58 /* Called outside of the EBB handler to check MMCR0 is sane */
59 int ebb_check_mmcr0(void)
60 {
61         u64 val;
62
63         val = mfspr(SPRN_MMCR0);
64         if ((val & (MMCR0_FC | MMCR0_PMAO)) == MMCR0_FC) {
65                 /* It's OK if we see FC & PMAO, but not FC by itself */
66                 printf("Outside of loop, only FC set 0x%llx\n", val);
67                 return 1;
68         }
69
70         return 0;
71 }
72
73 bool ebb_check_count(int pmc, u64 sample_period, int fudge)
74 {
75         u64 count, upper, lower;
76
77         count = ebb_state.stats.pmc_count[PMC_INDEX(pmc)];
78
79         lower = ebb_state.stats.ebb_count * (sample_period - fudge);
80
81         if (count < lower) {
82                 printf("PMC%d count (0x%llx) below lower limit 0x%llx (-0x%llx)\n",
83                         pmc, count, lower, lower - count);
84                 return false;
85         }
86
87         upper = ebb_state.stats.ebb_count * (sample_period + fudge);
88
89         if (count > upper) {
90                 printf("PMC%d count (0x%llx) above upper limit 0x%llx (+0x%llx)\n",
91                         pmc, count, upper, count - upper);
92                 return false;
93         }
94
95         printf("PMC%d count (0x%llx) is between 0x%llx and 0x%llx delta +0x%llx/-0x%llx\n",
96                 pmc, count, lower, upper, count - lower, upper - count);
97
98         return true;
99 }
100
101 void standard_ebb_callee(void)
102 {
103         int found, i;
104         u64 val;
105
106         val = mfspr(SPRN_BESCR);
107         if (!(val & BESCR_PMEO)) {
108                 ebb_state.stats.spurious++;
109                 goto out;
110         }
111
112         ebb_state.stats.ebb_count++;
113         trace_log_counter(ebb_state.trace, ebb_state.stats.ebb_count);
114
115         val = mfspr(SPRN_MMCR0);
116         trace_log_reg(ebb_state.trace, SPRN_MMCR0, val);
117
118         found = 0;
119         for (i = 1; i <= 6; i++) {
120                 if (ebb_state.pmc_enable[PMC_INDEX(i)])
121                         found += count_pmc(i, sample_period);
122         }
123
124         if (!found)
125                 ebb_state.stats.no_overflow++;
126
127 out:
128         reset_ebb();
129 }
130
131 extern void ebb_handler(void);
132
133 void setup_ebb_handler(void (*callee)(void))
134 {
135         u64 entry;
136
137 #if defined(_CALL_ELF) && _CALL_ELF == 2
138         entry = (u64)ebb_handler;
139 #else
140         struct opd
141         {
142             u64 entry;
143             u64 toc;
144         } *opd;
145
146         opd = (struct opd *)ebb_handler;
147         entry = opd->entry;
148 #endif
149         printf("EBB Handler is at %#llx\n", entry);
150
151         ebb_user_func = callee;
152
153         /* Ensure ebb_user_func is set before we set the handler */
154         mb();
155         mtspr(SPRN_EBBHR, entry);
156
157         /* Make sure the handler is set before we return */
158         mb();
159 }
160
161 void clear_ebb_stats(void)
162 {
163         memset(&ebb_state.stats, 0, sizeof(ebb_state.stats));
164 }
165
166 void dump_summary_ebb_state(void)
167 {
168         printf("ebb_state:\n"                   \
169                "  ebb_count    = %d\n"          \
170                "  spurious     = %d\n"          \
171                "  negative     = %d\n"          \
172                "  no_overflow  = %d\n"          \
173                "  pmc[1] count = 0x%llx\n"      \
174                "  pmc[2] count = 0x%llx\n"      \
175                "  pmc[3] count = 0x%llx\n"      \
176                "  pmc[4] count = 0x%llx\n"      \
177                "  pmc[5] count = 0x%llx\n"      \
178                "  pmc[6] count = 0x%llx\n",
179                 ebb_state.stats.ebb_count, ebb_state.stats.spurious,
180                 ebb_state.stats.negative, ebb_state.stats.no_overflow,
181                 ebb_state.stats.pmc_count[0], ebb_state.stats.pmc_count[1],
182                 ebb_state.stats.pmc_count[2], ebb_state.stats.pmc_count[3],
183                 ebb_state.stats.pmc_count[4], ebb_state.stats.pmc_count[5]);
184 }
185
186 static char *decode_mmcr0(u32 value)
187 {
188         static char buf[16];
189
190         buf[0] = '\0';
191
192         if (value & (1 << 31))
193                 strcat(buf, "FC ");
194         if (value & (1 << 26))
195                 strcat(buf, "PMAE ");
196         if (value & (1 << 7))
197                 strcat(buf, "PMAO ");
198
199         return buf;
200 }
201
202 static char *decode_bescr(u64 value)
203 {
204         static char buf[16];
205
206         buf[0] = '\0';
207
208         if (value & (1ull << 63))
209                 strcat(buf, "GE ");
210         if (value & (1ull << 32))
211                 strcat(buf, "PMAE ");
212         if (value & 1)
213                 strcat(buf, "PMAO ");
214
215         return buf;
216 }
217
218 void dump_ebb_hw_state(void)
219 {
220         u64 bescr;
221         u32 mmcr0;
222
223         mmcr0 = mfspr(SPRN_MMCR0);
224         bescr = mfspr(SPRN_BESCR);
225
226         printf("HW state:\n"            \
227                "MMCR0 0x%016x %s\n"     \
228                "MMCR2 0x%016lx\n"       \
229                "EBBHR 0x%016lx\n"       \
230                "BESCR 0x%016llx %s\n"   \
231                "PMC1  0x%016lx\n"       \
232                "PMC2  0x%016lx\n"       \
233                "PMC3  0x%016lx\n"       \
234                "PMC4  0x%016lx\n"       \
235                "PMC5  0x%016lx\n"       \
236                "PMC6  0x%016lx\n"       \
237                "SIAR  0x%016lx\n",
238                mmcr0, decode_mmcr0(mmcr0), mfspr(SPRN_MMCR2),
239                mfspr(SPRN_EBBHR), bescr, decode_bescr(bescr),
240                mfspr(SPRN_PMC1), mfspr(SPRN_PMC2), mfspr(SPRN_PMC3),
241                mfspr(SPRN_PMC4), mfspr(SPRN_PMC5), mfspr(SPRN_PMC6),
242                mfspr(SPRN_SIAR));
243 }
244
245 void dump_ebb_state(void)
246 {
247         dump_summary_ebb_state();
248
249         dump_ebb_hw_state();
250
251         trace_buffer_print(ebb_state.trace);
252 }
253
254 int count_pmc(int pmc, uint32_t sample_period)
255 {
256         uint32_t start_value;
257         u64 val;
258
259         /* 0) Read PMC */
260         start_value = pmc_sample_period(sample_period);
261
262         val = read_pmc(pmc);
263         if (val < start_value)
264                 ebb_state.stats.negative++;
265         else
266                 ebb_state.stats.pmc_count[PMC_INDEX(pmc)] += val - start_value;
267
268         trace_log_reg(ebb_state.trace, SPRN_PMC1 + pmc - 1, val);
269
270         /* 1) Reset PMC */
271         write_pmc(pmc, start_value);
272
273         /* Report if we overflowed */
274         return val >= COUNTER_OVERFLOW;
275 }
276
277 int ebb_event_enable(struct event *e)
278 {
279         int rc;
280
281         /* Ensure any SPR writes are ordered vs us */
282         mb();
283
284         rc = ioctl(e->fd, PERF_EVENT_IOC_ENABLE);
285         if (rc)
286                 return rc;
287
288         rc = event_read(e);
289
290         /* Ditto */
291         mb();
292
293         return rc;
294 }
295
296 void ebb_freeze_pmcs(void)
297 {
298         mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) | MMCR0_FC);
299         mb();
300 }
301
302 void ebb_unfreeze_pmcs(void)
303 {
304         /* Unfreeze counters */
305         mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC);
306         mb();
307 }
308
309 void ebb_global_enable(void)
310 {
311         /* Enable EBBs globally and PMU EBBs */
312         mtspr(SPRN_BESCR, 0x8000000100000000ull);
313         mb();
314 }
315
316 void ebb_global_disable(void)
317 {
318         /* Disable EBBs & freeze counters, events are still scheduled */
319         mtspr(SPRN_BESCRR, BESCR_PME);
320         mb();
321 }
322
323 bool ebb_is_supported(void)
324 {
325 #ifdef PPC_FEATURE2_EBB
326         /* EBB requires at least POWER8 */
327         return ((long)get_auxv_entry(AT_HWCAP2) & PPC_FEATURE2_EBB);
328 #else
329         return false;
330 #endif
331 }
332
333 void event_ebb_init(struct event *e)
334 {
335         e->attr.config |= (1ull << 63);
336 }
337
338 void event_bhrb_init(struct event *e, unsigned ifm)
339 {
340         e->attr.config |= (1ull << 62) | ((u64)ifm << 60);
341 }
342
343 void event_leader_ebb_init(struct event *e)
344 {
345         event_ebb_init(e);
346
347         e->attr.exclusive = 1;
348         e->attr.pinned = 1;
349 }
350
351 int ebb_child(union pipe read_pipe, union pipe write_pipe)
352 {
353         struct event event;
354         uint64_t val;
355
356         FAIL_IF(wait_for_parent(read_pipe));
357
358         event_init_named(&event, 0x1001e, "cycles");
359         event_leader_ebb_init(&event);
360
361         event.attr.exclude_kernel = 1;
362         event.attr.exclude_hv = 1;
363         event.attr.exclude_idle = 1;
364
365         FAIL_IF(event_open(&event));
366
367         ebb_enable_pmc_counting(1);
368         setup_ebb_handler(standard_ebb_callee);
369         ebb_global_enable();
370
371         FAIL_IF(event_enable(&event));
372
373         if (event_read(&event)) {
374                 /*
375                  * Some tests expect to fail here, so don't report an error on
376                  * this line, and return a distinguisable error code. Tell the
377                  * parent an error happened.
378                  */
379                 notify_parent_of_error(write_pipe);
380                 return 2;
381         }
382
383         mtspr(SPRN_PMC1, pmc_sample_period(sample_period));
384
385         FAIL_IF(notify_parent(write_pipe));
386         FAIL_IF(wait_for_parent(read_pipe));
387         FAIL_IF(notify_parent(write_pipe));
388
389         while (ebb_state.stats.ebb_count < 20) {
390                 FAIL_IF(core_busy_loop());
391
392                 /* To try and hit SIGILL case */
393                 val  = mfspr(SPRN_MMCRA);
394                 val |= mfspr(SPRN_MMCR2);
395                 val |= mfspr(SPRN_MMCR0);
396         }
397
398         ebb_global_disable();
399         ebb_freeze_pmcs();
400
401         count_pmc(1, sample_period);
402
403         dump_ebb_state();
404
405         event_close(&event);
406
407         FAIL_IF(ebb_state.stats.ebb_count == 0);
408
409         return 0;
410 }
411
412 static jmp_buf setjmp_env;
413
414 static void sigill_handler(int signal)
415 {
416         printf("Took sigill\n");
417         longjmp(setjmp_env, 1);
418 }
419
420 static struct sigaction sigill_action = {
421         .sa_handler = sigill_handler,
422 };
423
424 int catch_sigill(void (*func)(void))
425 {
426         if (sigaction(SIGILL, &sigill_action, NULL)) {
427                 perror("sigaction");
428                 return 1;
429         }
430
431         if (setjmp(setjmp_env) == 0) {
432                 func();
433                 return 1;
434         }
435
436         return 0;
437 }
438
439 void write_pmc1(void)
440 {
441         mtspr(SPRN_PMC1, 0);
442 }
443
444 void write_pmc(int pmc, u64 value)
445 {
446         switch (pmc) {
447                 case 1: mtspr(SPRN_PMC1, value); break;
448                 case 2: mtspr(SPRN_PMC2, value); break;
449                 case 3: mtspr(SPRN_PMC3, value); break;
450                 case 4: mtspr(SPRN_PMC4, value); break;
451                 case 5: mtspr(SPRN_PMC5, value); break;
452                 case 6: mtspr(SPRN_PMC6, value); break;
453         }
454 }
455
456 u64 read_pmc(int pmc)
457 {
458         switch (pmc) {
459                 case 1: return mfspr(SPRN_PMC1);
460                 case 2: return mfspr(SPRN_PMC2);
461                 case 3: return mfspr(SPRN_PMC3);
462                 case 4: return mfspr(SPRN_PMC4);
463                 case 5: return mfspr(SPRN_PMC5);
464                 case 6: return mfspr(SPRN_PMC6);
465         }
466
467         return 0;
468 }
469
470 static void term_handler(int signal)
471 {
472         dump_summary_ebb_state();
473         dump_ebb_hw_state();
474         abort();
475 }
476
477 struct sigaction term_action = {
478         .sa_handler = term_handler,
479 };
480
481 static void __attribute__((constructor)) ebb_init(void)
482 {
483         clear_ebb_stats();
484
485         if (sigaction(SIGTERM, &term_action, NULL))
486                 perror("sigaction");
487
488         ebb_state.trace = trace_buffer_allocate(1 * 1024 * 1024);
489 }