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

source code of linux/tools/testing/selftests/powerpc/pmu/ebb/event_attributes_test.c