Lines Matching refs:decoder
23 #include "arm-spe-decoder.h"
84 struct arm_spe_decoder *decoder;
89 decoder = zalloc(sizeof(struct arm_spe_decoder));
90 if (!decoder)
93 decoder->get_trace = params->get_trace;
94 decoder->data = params->data;
96 return decoder;
99 void arm_spe_decoder_free(struct arm_spe_decoder *decoder)
101 free(decoder);
104 static int arm_spe_get_data(struct arm_spe_decoder *decoder)
110 ret = decoder->get_trace(&buffer, decoder->data);
114 decoder->buf = buffer.buf;
115 decoder->len = buffer.len;
117 if (!decoder->len)
120 return decoder->len;
123 static int arm_spe_get_next_packet(struct arm_spe_decoder *decoder)
128 if (!decoder->len) {
129 ret = arm_spe_get_data(decoder);
136 ret = arm_spe_get_packet(decoder->buf, decoder->len,
137 &decoder->packet);
140 decoder->buf += 1;
141 decoder->len -= 1;
145 decoder->buf += ret;
146 decoder->len -= ret;
147 } while (decoder->packet.type == ARM_SPE_PAD);
152 static int arm_spe_read_record(struct arm_spe_decoder *decoder)
158 memset(&decoder->record, 0x0, sizeof(decoder->record));
159 decoder->record.context_id = (u64)-1;
162 err = arm_spe_get_next_packet(decoder);
166 idx = decoder->packet.index;
167 payload = decoder->packet.payload;
169 switch (decoder->packet.type) {
171 decoder->record.timestamp = payload;
178 decoder->record.from_ip = ip;
180 decoder->record.to_ip = ip;
182 decoder->record.virt_addr = ip;
184 decoder->record.phys_addr = ip;
186 decoder->record.prev_br_tgt = ip;
190 decoder->record.latency = payload;
193 decoder->record.context_id = payload;
198 decoder->record.op |= ARM_SPE_OP_LDST;
200 decoder->record.op |= ARM_SPE_OP_ST;
202 decoder->record.op |= ARM_SPE_OP_LD;
204 decoder->record.op |= ARM_SPE_OP_SVE_LDST;
207 decoder->record.op |= ARM_SPE_OP_OTHER;
209 decoder->record.op |= ARM_SPE_OP_SVE_OTHER;
212 decoder->record.op |= ARM_SPE_OP_BRANCH_ERET;
214 decoder->record.op |= ARM_SPE_OP_BR_COND;
216 decoder->record.op |= ARM_SPE_OP_BR_INDIRECT;
218 decoder->record.op |= ARM_SPE_OP_BR_GCS;
220 decoder->record.op |= ARM_SPE_OP_BR_CR_BL;
222 decoder->record.op |= ARM_SPE_OP_BR_CR_RET;
224 decoder->record.op |= ARM_SPE_OP_BR_CR_NON_BL_RET;
233 decoder->record.type |= ARM_SPE_L1D_MISS;
236 decoder->record.type |= ARM_SPE_L1D_ACCESS;
239 decoder->record.type |= ARM_SPE_TLB_MISS;
242 decoder->record.type |= ARM_SPE_TLB_ACCESS;
245 decoder->record.type |= ARM_SPE_LLC_MISS;
248 decoder->record.type |= ARM_SPE_LLC_ACCESS;
251 decoder->record.type |= ARM_SPE_REMOTE_ACCESS;
254 decoder->record.type |= ARM_SPE_BRANCH_MISS;
257 decoder->record.type |= ARM_SPE_BRANCH_NOT_TAKEN;
260 decoder->record.type |= ARM_SPE_IN_TXN;
263 decoder->record.type |= ARM_SPE_SVE_PARTIAL_PRED;
266 decoder->record.type |= ARM_SPE_SVE_EMPTY_PRED;
270 decoder->record.source = payload;
285 int arm_spe_decode(struct arm_spe_decoder *decoder)
287 return arm_spe_read_record(decoder);