Lines Matching +full:byte +full:- +full:len

1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (c) 2017-2018, Arm Ltd.
12 #include "arm-spe-pkt-decoder.h"
63 [ARM_SPE_OP_TYPE] = "OP-TYPE",
65 [ARM_SPE_DATA_SOURCE] = "DATA-SOURCE",
74 * which is in bits 5:4 of the byte.
75 * 00 : byte
80 static int payloadlen(unsigned char byte) in payloadlen() argument
82 return 1 << ((byte & 0x30) >> 4); in payloadlen()
85 static int arm_spe_get_payload(const unsigned char *buf, size_t len, in arm_spe_get_payload() argument
90 if (len < 1 + payload_len) in arm_spe_get_payload()
96 case 1: packet->payload = *(uint8_t *)buf; break; in arm_spe_get_payload()
97 case 2: packet->payload = le16_to_cpu(*(uint16_t *)buf); break; in arm_spe_get_payload()
98 case 4: packet->payload = le32_to_cpu(*(uint32_t *)buf); break; in arm_spe_get_payload()
99 case 8: packet->payload = le64_to_cpu(*(uint64_t *)buf); break; in arm_spe_get_payload()
108 packet->type = ARM_SPE_PAD; in arm_spe_get_pad()
112 static int arm_spe_get_alignment(const unsigned char *buf, size_t len, in arm_spe_get_alignment() argument
117 if (len < alignment) in arm_spe_get_alignment()
120 packet->type = ARM_SPE_PAD; in arm_spe_get_alignment()
121 return alignment - (((uintptr_t)buf) & (alignment - 1)); in arm_spe_get_alignment()
126 packet->type = ARM_SPE_END; in arm_spe_get_end()
130 static int arm_spe_get_timestamp(const unsigned char *buf, size_t len, in arm_spe_get_timestamp() argument
133 packet->type = ARM_SPE_TIMESTAMP; in arm_spe_get_timestamp()
134 return arm_spe_get_payload(buf, len, packet); in arm_spe_get_timestamp()
137 static int arm_spe_get_events(const unsigned char *buf, size_t len, in arm_spe_get_events() argument
140 int ret = arm_spe_get_payload(buf, len, packet); in arm_spe_get_events()
142 packet->type = ARM_SPE_EVENTS; in arm_spe_get_events()
145 * comparisons in arm_spe_pkt_desc(): E.g., the LLC-ACCESS, in arm_spe_get_events()
146 * LLC-REFILL, and REMOTE-ACCESS events are identified iff in arm_spe_get_events()
149 packet->index = ret - 1; in arm_spe_get_events()
154 static int arm_spe_get_data_source(const unsigned char *buf, size_t len, in arm_spe_get_data_source() argument
157 packet->type = ARM_SPE_DATA_SOURCE; in arm_spe_get_data_source()
158 return arm_spe_get_payload(buf, len, packet); in arm_spe_get_data_source()
161 static int arm_spe_get_context(const unsigned char *buf, size_t len, in arm_spe_get_context() argument
164 packet->type = ARM_SPE_CONTEXT; in arm_spe_get_context()
165 packet->index = buf[0] & 0x3; in arm_spe_get_context()
167 return arm_spe_get_payload(buf, len, packet); in arm_spe_get_context()
170 static int arm_spe_get_op_type(const unsigned char *buf, size_t len, in arm_spe_get_op_type() argument
173 packet->type = ARM_SPE_OP_TYPE; in arm_spe_get_op_type()
174 packet->index = buf[0] & 0x3; in arm_spe_get_op_type()
175 return arm_spe_get_payload(buf, len, packet); in arm_spe_get_op_type()
178 static int arm_spe_get_counter(const unsigned char *buf, size_t len, in arm_spe_get_counter() argument
181 if (len < 2) in arm_spe_get_counter()
184 packet->type = ARM_SPE_COUNTER; in arm_spe_get_counter()
186 packet->index = ((buf[0] & 0x3) << 3) | (buf[1] & 0x7); in arm_spe_get_counter()
188 packet->index = buf[0] & 0x7; in arm_spe_get_counter()
190 packet->payload = le16_to_cpu(*(uint16_t *)(buf + 1)); in arm_spe_get_counter()
195 static int arm_spe_get_addr(const unsigned char *buf, size_t len, in arm_spe_get_addr() argument
198 if (len < 8) in arm_spe_get_addr()
201 packet->type = ARM_SPE_ADDRESS; in arm_spe_get_addr()
203 packet->index = ((buf[0] & 0x3) << 3) | (buf[1] & 0x7); in arm_spe_get_addr()
205 packet->index = buf[0] & 0x7; in arm_spe_get_addr()
207 memcpy_le64(&packet->payload, buf + 1, 8); in arm_spe_get_addr()
212 static int arm_spe_do_get_packet(const unsigned char *buf, size_t len, in arm_spe_do_get_packet() argument
215 unsigned int byte; in arm_spe_do_get_packet() local
219 if (!len) in arm_spe_do_get_packet()
222 byte = buf[0]; in arm_spe_do_get_packet()
223 if (byte == SPE_HEADER0_PAD) in arm_spe_do_get_packet()
225 else if (byte == SPE_HEADER0_END) /* no timestamp at end of record */ in arm_spe_do_get_packet()
227 else if (byte & 0xc0 /* 0y11xxxxxx */) { in arm_spe_do_get_packet()
228 if (byte & 0x80) { in arm_spe_do_get_packet()
229 if ((byte & SPE_HEADER0_ADDRESS_MASK) == SPE_HEADER0_ADDRESS) in arm_spe_do_get_packet()
230 return arm_spe_get_addr(buf, len, 0, packet); in arm_spe_do_get_packet()
231 if ((byte & SPE_HEADER0_COUNTER_MASK) == SPE_HEADER0_COUNTER) in arm_spe_do_get_packet()
232 return arm_spe_get_counter(buf, len, 0, packet); in arm_spe_do_get_packet()
234 if (byte == SPE_HEADER0_TIMESTAMP) in arm_spe_do_get_packet()
235 return arm_spe_get_timestamp(buf, len, packet); in arm_spe_do_get_packet()
236 else if ((byte & SPE_HEADER0_EVENTS_MASK) == SPE_HEADER0_EVENTS) in arm_spe_do_get_packet()
237 return arm_spe_get_events(buf, len, packet); in arm_spe_do_get_packet()
238 else if ((byte & SPE_HEADER0_SOURCE_MASK) == SPE_HEADER0_SOURCE) in arm_spe_do_get_packet()
239 return arm_spe_get_data_source(buf, len, packet); in arm_spe_do_get_packet()
240 else if ((byte & SPE_HEADER0_CONTEXT_MASK) == SPE_HEADER0_CONTEXT) in arm_spe_do_get_packet()
241 return arm_spe_get_context(buf, len, packet); in arm_spe_do_get_packet()
242 else if ((byte & SPE_HEADER0_OP_TYPE_MASK) == SPE_HEADER0_OP_TYPE) in arm_spe_do_get_packet()
243 return arm_spe_get_op_type(buf, len, packet); in arm_spe_do_get_packet()
244 } else if ((byte & 0xe0) == 0x20 /* 0y001xxxxx */) { in arm_spe_do_get_packet()
245 /* 16-bit header */ in arm_spe_do_get_packet()
246 byte = buf[1]; in arm_spe_do_get_packet()
247 if (byte == SPE_HEADER1_ALIGNMENT) in arm_spe_do_get_packet()
248 return arm_spe_get_alignment(buf, len, packet); in arm_spe_do_get_packet()
249 else if ((byte & SPE_HEADER1_ADDRESS_MASK) == SPE_HEADER1_ADDRESS) in arm_spe_do_get_packet()
250 return arm_spe_get_addr(buf, len, 1, packet); in arm_spe_do_get_packet()
251 else if ((byte & SPE_HEADER1_COUNTER_MASK) == SPE_HEADER1_COUNTER) in arm_spe_do_get_packet()
252 return arm_spe_get_counter(buf, len, 1, packet); in arm_spe_do_get_packet()
258 int arm_spe_get_packet(const unsigned char *buf, size_t len, in arm_spe_get_packet() argument
263 ret = arm_spe_do_get_packet(buf, len, packet); in arm_spe_get_packet()
265 * the fixed-width output format of 16 bytes per line. in arm_spe_get_packet()
267 if (ret > 0 && packet->type == ARM_SPE_PAD) { in arm_spe_get_packet()
268 while (ret < 16 && len > (size_t)ret && !buf[ret]) in arm_spe_get_packet()
277 int ret, ns, el, idx = packet->index; in arm_spe_pkt_desc()
278 unsigned long long payload = packet->payload; in arm_spe_pkt_desc()
279 const char *name = arm_spe_pkt_name(packet->type); in arm_spe_pkt_desc()
281 switch (packet->type) { in arm_spe_pkt_desc()
292 blen -= ret; in arm_spe_pkt_desc()
294 ret = snprintf(buf, buf_len, " EXCEPTION-GEN"); in arm_spe_pkt_desc()
296 blen -= ret; in arm_spe_pkt_desc()
301 blen -= ret; in arm_spe_pkt_desc()
304 ret = snprintf(buf, buf_len, " L1D-ACCESS"); in arm_spe_pkt_desc()
306 blen -= ret; in arm_spe_pkt_desc()
309 ret = snprintf(buf, buf_len, " L1D-REFILL"); in arm_spe_pkt_desc()
311 blen -= ret; in arm_spe_pkt_desc()
314 ret = snprintf(buf, buf_len, " TLB-ACCESS"); in arm_spe_pkt_desc()
316 blen -= ret; in arm_spe_pkt_desc()
319 ret = snprintf(buf, buf_len, " TLB-REFILL"); in arm_spe_pkt_desc()
321 blen -= ret; in arm_spe_pkt_desc()
324 ret = snprintf(buf, buf_len, " NOT-TAKEN"); in arm_spe_pkt_desc()
326 blen -= ret; in arm_spe_pkt_desc()
331 blen -= ret; in arm_spe_pkt_desc()
335 ret = snprintf(buf, buf_len, " LLC-ACCESS"); in arm_spe_pkt_desc()
337 blen -= ret; in arm_spe_pkt_desc()
340 ret = snprintf(buf, buf_len, " LLC-REFILL"); in arm_spe_pkt_desc()
342 blen -= ret; in arm_spe_pkt_desc()
345 ret = snprintf(buf, buf_len, " REMOTE-ACCESS"); in arm_spe_pkt_desc()
347 blen -= ret; in arm_spe_pkt_desc()
352 blen -= ret; in arm_spe_pkt_desc()
353 return buf_len - blen; in arm_spe_pkt_desc()
358 "COND-SELECT" : "INSN-OTHER"); in arm_spe_pkt_desc()
367 blen -= ret; in arm_spe_pkt_desc()
372 blen -= ret; in arm_spe_pkt_desc()
377 blen -= ret; in arm_spe_pkt_desc()
382 blen -= ret; in arm_spe_pkt_desc()
385 ret = snprintf(buf, buf_len, " SIMD-FP"); in arm_spe_pkt_desc()
387 blen -= ret; in arm_spe_pkt_desc()
391 blen -= ret; in arm_spe_pkt_desc()
392 return buf_len - blen; in arm_spe_pkt_desc()
399 blen -= ret; in arm_spe_pkt_desc()
403 blen -= ret; in arm_spe_pkt_desc()
408 blen -= ret; in arm_spe_pkt_desc()
412 blen -= ret; in arm_spe_pkt_desc()
413 return buf_len - blen; in arm_spe_pkt_desc()
423 case 1: ns = !!(packet->payload & NS_FLAG); in arm_spe_pkt_desc()
424 el = (packet->payload & EL_FLAG) >> 61; in arm_spe_pkt_desc()
429 case 3: ns = !!(packet->payload & NS_FLAG); in arm_spe_pkt_desc()
444 blen -= ret; in arm_spe_pkt_desc()
453 blen -= ret; in arm_spe_pkt_desc()
454 return buf_len - blen; in arm_spe_pkt_desc()
461 name, payload, packet->index); in arm_spe_pkt_desc()