| .. | .. |
|---|
| 2 | 2 | #include <errno.h> |
|---|
| 3 | 3 | #include <string.h> |
|---|
| 4 | 4 | #include <regex.h> |
|---|
| 5 | +#include <linux/kernel.h> |
|---|
| 6 | +#include <linux/zalloc.h> |
|---|
| 5 | 7 | |
|---|
| 6 | | -#include "../../perf.h" |
|---|
| 7 | | -#include "../../util/util.h" |
|---|
| 8 | | -#include "../../util/perf_regs.h" |
|---|
| 9 | | -#include "../../util/debug.h" |
|---|
| 8 | +#include "../../../perf-sys.h" |
|---|
| 9 | +#include "../../../util/perf_regs.h" |
|---|
| 10 | +#include "../../../util/debug.h" |
|---|
| 11 | +#include "../../../util/event.h" |
|---|
| 10 | 12 | |
|---|
| 11 | 13 | const struct sample_reg sample_reg_masks[] = { |
|---|
| 12 | 14 | SMPL_REG(AX, PERF_REG_X86_AX), |
|---|
| .. | .. |
|---|
| 31 | 33 | SMPL_REG(R14, PERF_REG_X86_R14), |
|---|
| 32 | 34 | SMPL_REG(R15, PERF_REG_X86_R15), |
|---|
| 33 | 35 | #endif |
|---|
| 36 | + SMPL_REG2(XMM0, PERF_REG_X86_XMM0), |
|---|
| 37 | + SMPL_REG2(XMM1, PERF_REG_X86_XMM1), |
|---|
| 38 | + SMPL_REG2(XMM2, PERF_REG_X86_XMM2), |
|---|
| 39 | + SMPL_REG2(XMM3, PERF_REG_X86_XMM3), |
|---|
| 40 | + SMPL_REG2(XMM4, PERF_REG_X86_XMM4), |
|---|
| 41 | + SMPL_REG2(XMM5, PERF_REG_X86_XMM5), |
|---|
| 42 | + SMPL_REG2(XMM6, PERF_REG_X86_XMM6), |
|---|
| 43 | + SMPL_REG2(XMM7, PERF_REG_X86_XMM7), |
|---|
| 44 | + SMPL_REG2(XMM8, PERF_REG_X86_XMM8), |
|---|
| 45 | + SMPL_REG2(XMM9, PERF_REG_X86_XMM9), |
|---|
| 46 | + SMPL_REG2(XMM10, PERF_REG_X86_XMM10), |
|---|
| 47 | + SMPL_REG2(XMM11, PERF_REG_X86_XMM11), |
|---|
| 48 | + SMPL_REG2(XMM12, PERF_REG_X86_XMM12), |
|---|
| 49 | + SMPL_REG2(XMM13, PERF_REG_X86_XMM13), |
|---|
| 50 | + SMPL_REG2(XMM14, PERF_REG_X86_XMM14), |
|---|
| 51 | + SMPL_REG2(XMM15, PERF_REG_X86_XMM15), |
|---|
| 34 | 52 | SMPL_REG_END |
|---|
| 35 | 53 | }; |
|---|
| 36 | 54 | |
|---|
| .. | .. |
|---|
| 254 | 272 | |
|---|
| 255 | 273 | return SDT_ARG_VALID; |
|---|
| 256 | 274 | } |
|---|
| 275 | + |
|---|
| 276 | +uint64_t arch__intr_reg_mask(void) |
|---|
| 277 | +{ |
|---|
| 278 | + struct perf_event_attr attr = { |
|---|
| 279 | + .type = PERF_TYPE_HARDWARE, |
|---|
| 280 | + .config = PERF_COUNT_HW_CPU_CYCLES, |
|---|
| 281 | + .sample_type = PERF_SAMPLE_REGS_INTR, |
|---|
| 282 | + .sample_regs_intr = PERF_REG_EXTENDED_MASK, |
|---|
| 283 | + .precise_ip = 1, |
|---|
| 284 | + .disabled = 1, |
|---|
| 285 | + .exclude_kernel = 1, |
|---|
| 286 | + }; |
|---|
| 287 | + int fd; |
|---|
| 288 | + /* |
|---|
| 289 | + * In an unnamed union, init it here to build on older gcc versions |
|---|
| 290 | + */ |
|---|
| 291 | + attr.sample_period = 1; |
|---|
| 292 | + |
|---|
| 293 | + event_attr_init(&attr); |
|---|
| 294 | + |
|---|
| 295 | + fd = sys_perf_event_open(&attr, 0, -1, -1, 0); |
|---|
| 296 | + if (fd != -1) { |
|---|
| 297 | + close(fd); |
|---|
| 298 | + return (PERF_REG_EXTENDED_MASK | PERF_REGS_MASK); |
|---|
| 299 | + } |
|---|
| 300 | + |
|---|
| 301 | + return PERF_REGS_MASK; |
|---|
| 302 | +} |
|---|