135 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_SAMPLE_H3#define __PERF_SAMPLE_H4 5#include <linux/perf_event.h>6#include <linux/types.h>7 8/* number of register is bound by the number of bits in regs_dump::mask (64) */9#define PERF_SAMPLE_REGS_CACHE_SIZE (8 * sizeof(u64))10 11struct regs_dump {12 u64 abi;13 u64 mask;14 u64 *regs;15 16 /* Cached values/mask filled by first register access. */17 u64 cache_regs[PERF_SAMPLE_REGS_CACHE_SIZE];18 u64 cache_mask;19};20 21struct stack_dump {22 u16 offset;23 u64 size;24 char *data;25};26 27struct sample_read_value {28 u64 value;29 u64 id; /* only if PERF_FORMAT_ID */30 u64 lost; /* only if PERF_FORMAT_LOST */31};32 33struct sample_read {34 u64 time_enabled;35 u64 time_running;36 union {37 struct {38 u64 nr;39 struct sample_read_value *values;40 } group;41 struct sample_read_value one;42 };43};44 45static inline size_t sample_read_value_size(u64 read_format)46{47 /* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */48 if (read_format & PERF_FORMAT_LOST)49 return sizeof(struct sample_read_value);50 else51 return offsetof(struct sample_read_value, lost);52}53 54static inline struct sample_read_value *next_sample_read_value(struct sample_read_value *v, u64 read_format)55{56 return (void *)v + sample_read_value_size(read_format);57}58 59#define sample_read_group__for_each(v, nr, rf) \60 for (int __i = 0; __i < (int)nr; v = next_sample_read_value(v, rf), __i++)61 62#define MAX_INSN 1663 64struct aux_sample {65 u64 size;66 void *data;67};68 69struct simd_flags {70 u64 arch:1, /* architecture (isa) */71 pred:2; /* predication */72};73 74/* simd architecture flags */75#define SIMD_OP_FLAGS_ARCH_SVE 0x01 /* ARM SVE */76 77/* simd predicate flags */78#define SIMD_OP_FLAGS_PRED_PARTIAL 0x01 /* partial predicate */79#define SIMD_OP_FLAGS_PRED_EMPTY 0x02 /* empty predicate */80 81struct perf_sample {82 u64 ip;83 u32 pid, tid;84 u64 time;85 u64 addr;86 u64 id;87 u64 stream_id;88 u64 period;89 u64 weight;90 u64 transaction;91 u64 insn_cnt;92 u64 cyc_cnt;93 u32 cpu;94 u32 raw_size;95 u64 data_src;96 u64 phys_addr;97 u64 data_page_size;98 u64 code_page_size;99 u64 cgroup;100 u32 flags;101 u32 machine_pid;102 u32 vcpu;103 u16 insn_len;104 u8 cpumode;105 u16 misc;106 u16 ins_lat;107 union {108 u16 p_stage_cyc;109 u16 retire_lat;110 };111 bool no_hw_idx; /* No hw_idx collected in branch_stack */112 char insn[MAX_INSN];113 void *raw_data;114 struct ip_callchain *callchain;115 struct branch_stack *branch_stack;116 u64 *branch_stack_cntr;117 struct regs_dump user_regs;118 struct regs_dump intr_regs;119 struct stack_dump user_stack;120 struct sample_read read;121 struct aux_sample aux_sample;122 struct simd_flags simd_flags;123};124 125/*126 * raw_data is always 4 bytes from an 8-byte boundary, so subtract 4 to get127 * 8-byte alignment.128 */129static inline void *perf_sample__synth_ptr(struct perf_sample *sample)130{131 return sample->raw_data - 4;132}133 134#endif /* __PERF_SAMPLE_H */135