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 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 128 int main(void) 129 { 130 return test_harness(generic_events_valid_test, "generic_events_valid_test"); 131 } 132