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