1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef __PERF_SAMPLE_H |
3 | #define __PERF_SAMPLE_H |
4 | |
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 | |
11 | struct 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 | |
21 | struct stack_dump { |
22 | u16 offset; |
23 | u64 size; |
24 | char *data; |
25 | }; |
26 | |
27 | struct sample_read_value { |
28 | u64 value; |
29 | u64 id; /* only if PERF_FORMAT_ID */ |
30 | u64 lost; /* only if PERF_FORMAT_LOST */ |
31 | }; |
32 | |
33 | struct 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 | |
45 | static 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 | else |
51 | return offsetof(struct sample_read_value, lost); |
52 | } |
53 | |
54 | static 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 16 |
63 | |
64 | struct aux_sample { |
65 | u64 size; |
66 | void *data; |
67 | }; |
68 | |
69 | struct 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 | |
81 | struct 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 get |
127 | * 8-byte alignment. |
128 | */ |
129 | static 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 | |