1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright 2014, Michael Ellerman, IBM Corp.
4 */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #include "ebb.h"
10
11
12 /*
13 * Test various attributes of the EBB event are enforced.
14 */
event_attributes(void)15 int event_attributes(void)
16 {
17 struct event event, leader;
18
19 SKIP_IF(!ebb_is_supported());
20
21 event_init(&event, 0x1001e);
22 event_leader_ebb_init(&event);
23 /* Expected to succeed */
24 FAIL_IF(event_open(&event));
25 event_close(&event);
26
27
28 event_init(&event, 0x001e); /* CYCLES - no PMC specified */
29 event_leader_ebb_init(&event);
30 /* Expected to fail, no PMC specified */
31 FAIL_IF(event_open(&event) == 0);
32
33
34 event_init(&event, 0x2001e);
35 event_leader_ebb_init(&event);
36 event.attr.exclusive = 0;
37 /* Expected to fail, not exclusive */
38 FAIL_IF(event_open(&event) == 0);
39
40
41 event_init(&event, 0x3001e);
42 event_leader_ebb_init(&event);
43 event.attr.freq = 1;
44 /* Expected to fail, sets freq */
45 FAIL_IF(event_open(&event) == 0);
46
47
48 event_init(&event, 0x4001e);
49 event_leader_ebb_init(&event);
50 event.attr.sample_period = 1;
51 /* Expected to fail, sets sample_period */
52 FAIL_IF(event_open(&event) == 0);
53
54
55 event_init(&event, 0x1001e);
56 event_leader_ebb_init(&event);
57 event.attr.enable_on_exec = 1;
58 /* Expected to fail, sets enable_on_exec */
59 FAIL_IF(event_open(&event) == 0);
60
61
62 event_init(&event, 0x1001e);
63 event_leader_ebb_init(&event);
64 event.attr.inherit = 1;
65 /* Expected to fail, sets inherit */
66 FAIL_IF(event_open(&event) == 0);
67
68
69 event_init(&leader, 0x1001e);
70 event_leader_ebb_init(&leader);
71 FAIL_IF(event_open(&leader));
72
73 event_init(&event, 0x20002);
74 event_ebb_init(&event);
75
76 /* Expected to succeed */
77 FAIL_IF(event_open_with_group(&event, leader.fd));
78 event_close(&leader);
79 event_close(&event);
80
81
82 event_init(&leader, 0x1001e);
83 event_leader_ebb_init(&leader);
84 FAIL_IF(event_open(&leader));
85
86 event_init(&event, 0x20002);
87
88 /* Expected to fail, event doesn't request EBB, leader does */
89 FAIL_IF(event_open_with_group(&event, leader.fd) == 0);
90 event_close(&leader);
91
92
93 event_init(&leader, 0x1001e);
94 event_leader_ebb_init(&leader);
95 /* Clear the EBB flag */
96 leader.attr.config &= ~(1ull << 63);
97
98 FAIL_IF(event_open(&leader));
99
100 event_init(&event, 0x20002);
101 event_ebb_init(&event);
102
103 /* Expected to fail, leader doesn't request EBB */
104 FAIL_IF(event_open_with_group(&event, leader.fd) == 0);
105 event_close(&leader);
106
107
108 event_init(&leader, 0x1001e);
109 event_leader_ebb_init(&leader);
110 leader.attr.exclusive = 0;
111 /* Expected to fail, leader isn't exclusive */
112 FAIL_IF(event_open(&leader) == 0);
113
114
115 event_init(&leader, 0x1001e);
116 event_leader_ebb_init(&leader);
117 leader.attr.pinned = 0;
118 /* Expected to fail, leader isn't pinned */
119 FAIL_IF(event_open(&leader) == 0);
120
121 event_init(&event, 0x1001e);
122 event_leader_ebb_init(&event);
123 /* Expected to fail, not a task event */
124 SKIP_IF(require_paranoia_below(1));
125 FAIL_IF(event_open_with_cpu(&event, 0) == 0);
126
127 return 0;
128 }
129
main(void)130 int main(void)
131 {
132 return test_harness(event_attributes, "event_attributes");
133 }
134