.. | .. |
---|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 |
---|
2 | 2 | #include <stdbool.h> |
---|
3 | 3 | #include <inttypes.h> |
---|
| 4 | +#include <stdlib.h> |
---|
| 5 | +#include <string.h> |
---|
| 6 | +#include <linux/bitops.h> |
---|
4 | 7 | #include <linux/kernel.h> |
---|
5 | 8 | #include <linux/types.h> |
---|
6 | 9 | |
---|
7 | | -#include "util.h" |
---|
| 10 | +#include "map_symbol.h" |
---|
| 11 | +#include "branch.h" |
---|
8 | 12 | #include "event.h" |
---|
9 | 13 | #include "evsel.h" |
---|
10 | 14 | #include "debug.h" |
---|
| 15 | +#include "util/synthetic-events.h" |
---|
11 | 16 | |
---|
12 | 17 | #include "tests.h" |
---|
13 | 18 | |
---|
.. | .. |
---|
94 | 99 | |
---|
95 | 100 | if (type & PERF_SAMPLE_BRANCH_STACK) { |
---|
96 | 101 | COMP(branch_stack->nr); |
---|
| 102 | + COMP(branch_stack->hw_idx); |
---|
97 | 103 | for (i = 0; i < s1->branch_stack->nr; i++) |
---|
98 | 104 | MCOMP(branch_stack->entries[i]); |
---|
99 | 105 | } |
---|
.. | .. |
---|
145 | 151 | if (type & PERF_SAMPLE_PHYS_ADDR) |
---|
146 | 152 | COMP(phys_addr); |
---|
147 | 153 | |
---|
| 154 | + if (type & PERF_SAMPLE_CGROUP) |
---|
| 155 | + COMP(cgroup); |
---|
| 156 | + |
---|
| 157 | + if (type & PERF_SAMPLE_AUX) { |
---|
| 158 | + COMP(aux_sample.size); |
---|
| 159 | + if (memcmp(s1->aux_sample.data, s2->aux_sample.data, |
---|
| 160 | + s1->aux_sample.size)) { |
---|
| 161 | + pr_debug("Samples differ at 'aux_sample'\n"); |
---|
| 162 | + return false; |
---|
| 163 | + } |
---|
| 164 | + } |
---|
| 165 | + |
---|
148 | 166 | return true; |
---|
149 | 167 | } |
---|
150 | 168 | |
---|
151 | 169 | static int do_test(u64 sample_type, u64 sample_regs, u64 read_format) |
---|
152 | 170 | { |
---|
153 | | - struct perf_evsel evsel = { |
---|
| 171 | + struct evsel evsel = { |
---|
154 | 172 | .needs_swap = false, |
---|
155 | | - .attr = { |
---|
156 | | - .sample_type = sample_type, |
---|
157 | | - .read_format = read_format, |
---|
| 173 | + .core = { |
---|
| 174 | + . attr = { |
---|
| 175 | + .sample_type = sample_type, |
---|
| 176 | + .read_format = read_format, |
---|
| 177 | + }, |
---|
158 | 178 | }, |
---|
159 | 179 | }; |
---|
160 | 180 | union perf_event *event; |
---|
.. | .. |
---|
170 | 190 | u64 data[64]; |
---|
171 | 191 | } branch_stack = { |
---|
172 | 192 | /* 1 branch_entry */ |
---|
173 | | - .data = {1, 211, 212, 213}, |
---|
| 193 | + .data = {1, -1ULL, 211, 212, 213}, |
---|
174 | 194 | }; |
---|
175 | 195 | u64 regs[64]; |
---|
176 | 196 | const u32 raw_data[] = {0x12345678, 0x0a0b0c0d, 0x11020304, 0x05060708, 0 }; |
---|
177 | 197 | const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL}; |
---|
| 198 | + const u64 aux_data[] = {0xa55a, 0, 0xeeddee, 0x0282028202820282}; |
---|
178 | 199 | struct perf_sample sample = { |
---|
179 | 200 | .ip = 101, |
---|
180 | 201 | .pid = 102, |
---|
.. | .. |
---|
191 | 212 | .transaction = 112, |
---|
192 | 213 | .raw_data = (void *)raw_data, |
---|
193 | 214 | .callchain = &callchain.callchain, |
---|
| 215 | + .no_hw_idx = false, |
---|
194 | 216 | .branch_stack = &branch_stack.branch_stack, |
---|
195 | 217 | .user_regs = { |
---|
196 | 218 | .abi = PERF_SAMPLE_REGS_ABI_64, |
---|
.. | .. |
---|
211 | 233 | .regs = regs, |
---|
212 | 234 | }, |
---|
213 | 235 | .phys_addr = 113, |
---|
| 236 | + .cgroup = 114, |
---|
| 237 | + .aux_sample = { |
---|
| 238 | + .size = sizeof(aux_data), |
---|
| 239 | + .data = (void *)aux_data, |
---|
| 240 | + }, |
---|
214 | 241 | }; |
---|
215 | 242 | struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},}; |
---|
216 | 243 | struct perf_sample sample_out; |
---|
.. | .. |
---|
218 | 245 | int err, ret = -1; |
---|
219 | 246 | |
---|
220 | 247 | if (sample_type & PERF_SAMPLE_REGS_USER) |
---|
221 | | - evsel.attr.sample_regs_user = sample_regs; |
---|
| 248 | + evsel.core.attr.sample_regs_user = sample_regs; |
---|
222 | 249 | |
---|
223 | 250 | if (sample_type & PERF_SAMPLE_REGS_INTR) |
---|
224 | | - evsel.attr.sample_regs_intr = sample_regs; |
---|
| 251 | + evsel.core.attr.sample_regs_intr = sample_regs; |
---|
| 252 | + |
---|
| 253 | + if (sample_type & PERF_SAMPLE_BRANCH_STACK) |
---|
| 254 | + evsel.core.attr.branch_sample_type |= PERF_SAMPLE_BRANCH_HW_INDEX; |
---|
225 | 255 | |
---|
226 | 256 | for (i = 0; i < sizeof(regs); i++) |
---|
227 | 257 | *(i + (u8 *)regs) = i & 0xfe; |
---|
.. | .. |
---|
266 | 296 | goto out_free; |
---|
267 | 297 | } |
---|
268 | 298 | |
---|
269 | | - evsel.sample_size = __perf_evsel__sample_size(sample_type); |
---|
| 299 | + evsel.sample_size = __evsel__sample_size(sample_type); |
---|
270 | 300 | |
---|
271 | | - err = perf_evsel__parse_sample(&evsel, event, &sample_out); |
---|
| 301 | + err = evsel__parse_sample(&evsel, event, &sample_out); |
---|
272 | 302 | if (err) { |
---|
273 | 303 | pr_debug("%s failed for sample_type %#"PRIx64", error %d\n", |
---|
274 | | - "perf_evsel__parse_sample", sample_type, err); |
---|
| 304 | + "evsel__parse_sample", sample_type, err); |
---|
275 | 305 | goto out_free; |
---|
276 | 306 | } |
---|
277 | 307 | |
---|
.. | .. |
---|
310 | 340 | * were added. Please actually update the test rather than just change |
---|
311 | 341 | * the condition below. |
---|
312 | 342 | */ |
---|
313 | | - if (PERF_SAMPLE_MAX > PERF_SAMPLE_PHYS_ADDR << 1) { |
---|
| 343 | + if (PERF_SAMPLE_MAX > PERF_SAMPLE_CGROUP << 1) { |
---|
314 | 344 | pr_debug("sample format has changed, some new PERF_SAMPLE_ bit was introduced - test needs updating\n"); |
---|
315 | 345 | return -1; |
---|
316 | 346 | } |
---|