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 
17 static int generic_events_valid_test(void)
18 {
19 	struct event event;
20 
21 	/* Check for platform support for the test */
22 	SKIP_IF(platform_check_for_tests());
23 
24 	/* generic events is different in compat_mode */
25 	SKIP_IF(check_for_generic_compat_pmu());
26 
27 	/*
28 	 * Invalid generic events in power10:
29 	 * - PERF_COUNT_HW_BUS_CYCLES
30 	 * - PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
31 	 * - PERF_COUNT_HW_STALLED_CYCLES_BACKEND
32 	 * - PERF_COUNT_HW_REF_CPU_CYCLES
33 	 */
34 	if (PVR_VER(mfspr(SPRN_PVR)) == POWER10) {
35 		event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
36 		FAIL_IF(event_open(&event));
37 		event_close(&event);
38 
39 		event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS,
40 				PERF_TYPE_HARDWARE, "event");
41 		FAIL_IF(event_open(&event));
42 		event_close(&event);
43 
44 		event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES,
45 				PERF_TYPE_HARDWARE, "event");
46 		FAIL_IF(event_open(&event));
47 		event_close(&event);
48 
49 		event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event");
50 		FAIL_IF(event_open(&event));
51 		event_close(&event);
52 
53 		event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
54 				PERF_TYPE_HARDWARE, "event");
55 		FAIL_IF(event_open(&event));
56 		event_close(&event);
57 
58 		event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event");
59 		FAIL_IF(event_open(&event));
60 		event_close(&event);
61 
62 		event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event");
63 		FAIL_IF(!event_open(&event));
64 
65 		event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND,
66 				PERF_TYPE_HARDWARE, "event");
67 		FAIL_IF(!event_open(&event));
68 
69 		event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND,
70 				PERF_TYPE_HARDWARE, "event");
71 		FAIL_IF(!event_open(&event));
72 
73 		event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
74 		FAIL_IF(!event_open(&event));
75 	} else if (PVR_VER(mfspr(SPRN_PVR)) == POWER9) {
76 		/*
77 		 * Invalid generic events in power9:
78 		 * - PERF_COUNT_HW_BUS_CYCLES
79 		 * - PERF_COUNT_HW_REF_CPU_CYCLES
80 		 */
81 		event_init_opts(&event, PERF_COUNT_HW_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
82 		FAIL_IF(event_open(&event));
83 		event_close(&event);
84 
85 		event_init_opts(&event, PERF_COUNT_HW_INSTRUCTIONS, PERF_TYPE_HARDWARE, "event");
86 		FAIL_IF(event_open(&event));
87 		event_close(&event);
88 
89 		event_init_opts(&event, PERF_COUNT_HW_CACHE_REFERENCES,
90 				PERF_TYPE_HARDWARE, "event");
91 		FAIL_IF(event_open(&event));
92 		event_close(&event);
93 
94 		event_init_opts(&event, PERF_COUNT_HW_CACHE_MISSES, PERF_TYPE_HARDWARE, "event");
95 		FAIL_IF(event_open(&event));
96 		event_close(&event);
97 
98 		event_init_opts(&event, PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
99 				PERF_TYPE_HARDWARE, "event");
100 		FAIL_IF(event_open(&event));
101 		event_close(&event);
102 
103 		event_init_opts(&event, PERF_COUNT_HW_BRANCH_MISSES, PERF_TYPE_HARDWARE, "event");
104 		FAIL_IF(event_open(&event));
105 		event_close(&event);
106 
107 		event_init_opts(&event, PERF_COUNT_HW_BUS_CYCLES, PERF_TYPE_HARDWARE, "event");
108 		FAIL_IF(!event_open(&event));
109 
110 		event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND,
111 				PERF_TYPE_HARDWARE, "event");
112 		FAIL_IF(event_open(&event));
113 		event_close(&event);
114 
115 		event_init_opts(&event, PERF_COUNT_HW_STALLED_CYCLES_BACKEND,
116 				PERF_TYPE_HARDWARE, "event");
117 		FAIL_IF(event_open(&event));
118 		event_close(&event);
119 
120 		event_init_opts(&event, PERF_COUNT_HW_REF_CPU_CYCLES, PERF_TYPE_HARDWARE, "event");
121 		FAIL_IF(!event_open(&event));
122 	}
123 
124 	return 0;
125 }
126 
127 int main(void)
128 {
129 	return test_harness(generic_events_valid_test, "generic_events_valid_test");
130 }
131