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