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 */
15int 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
130int main(void)
131{
132	return test_harness(event_attributes, "event_attributes");
133}
134