1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright 2022, Athira Rajeev, IBM Corp.
4 */
5
6 #include <stdio.h>
7 #include <sys/prctl.h>
8 #include <limits.h>
9 #include "../event.h"
10 #include "../sampling_tests/misc.h"
11
12 /*
13 * Testcase to ensure that using invalid event in generic
14 * event for PERF_TYPE_HARDWARE should fail
15 */
16
generic_events_valid_test(void)17 static int generic_events_valid_test(void)
18 {
19 struct event event;
20 int pvr = mfspr(SPRN_PVR);
21
22 /* Check for platform support for the test */
23 SKIP_IF(platform_check_for_tests());
24
25 /* generic events is different in compat_mode */
26 SKIP_IF(check_for_generic_compat_pmu());
27
28 /*
29 * Invalid generic events in power10:
30 * - PERF_COUNT_HW_BUS_CYCLES
31 * - PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
32 * - PERF_COUNT_HW_STALLED_CYCLES_BACKEND
33 * - PERF_COUNT_HW_REF_CPU_CYCLES
34 */
35 if ((pvr == POWER10) || (pvr == POWER11)) {
36 event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
37 FAIL_IF(event_open(&event));
38 event_close(&event);
39
40 event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS,
41 PERF_TYPE_HARDWARE, "event");
42 FAIL_IF(event_open(&event));
43 event_close(&event);
44
45 event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES,
46 PERF_TYPE_HARDWARE, "event");
47 FAIL_IF(event_open(&event));
48 event_close(&event);
49
50 event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event");
51 FAIL_IF(event_open(&event));
52 event_close(&event);
53
54 event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
55 PERF_TYPE_HARDWARE, "event");
56 FAIL_IF(event_open(&event));
57 event_close(&event);
58
59 event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event");
60 FAIL_IF(event_open(&event));
61 event_close(&event);
62
63 event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event");
64 FAIL_IF(!event_open(&event));
65
66 event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND,
67 PERF_TYPE_HARDWARE, "event");
68 FAIL_IF(!event_open(&event));
69
70 event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND,
71 PERF_TYPE_HARDWARE, "event");
72 FAIL_IF(!event_open(&event));
73
74 event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
75 FAIL_IF(!event_open(&event));
76 } else if (PVR_VER(mfspr(SPRN_PVR)) == POWER9) {
77 /*
78 * Invalid generic events in power9:
79 * - PERF_COUNT_HW_BUS_CYCLES
80 * - PERF_COUNT_HW_REF_CPU_CYCLES
81 */
82 event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
83 FAIL_IF(event_open(&event));
84 event_close(&event);
85
86 event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS, PERF_TYPE_HARDWARE, "event");
87 FAIL_IF(event_open(&event));
88 event_close(&event);
89
90 event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES,
91 PERF_TYPE_HARDWARE, "event");
92 FAIL_IF(event_open(&event));
93 event_close(&event);
94
95 event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event");
96 FAIL_IF(event_open(&event));
97 event_close(&event);
98
99 event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
100 PERF_TYPE_HARDWARE, "event");
101 FAIL_IF(event_open(&event));
102 event_close(&event);
103
104 event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event");
105 FAIL_IF(event_open(&event));
106 event_close(&event);
107
108 event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event");
109 FAIL_IF(!event_open(&event));
110
111 event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND,
112 PERF_TYPE_HARDWARE, "event");
113 FAIL_IF(event_open(&event));
114 event_close(&event);
115
116 event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND,
117 PERF_TYPE_HARDWARE, "event");
118 FAIL_IF(event_open(&event));
119 event_close(&event);
120
121 event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
122 FAIL_IF(!event_open(&event));
123 }
124
125 return 0;
126 }
127
main(void)128 int main(void)
129 {
130 return test_harness(generic_events_valid_test, "generic_events_valid_test");
131 }
132