| .. | .. |
|---|
| 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 | } |
|---|