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