Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * intel_pt_pkt_decoder.c: Intel Processor Trace support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2013-2014, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <endian.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <byteswap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "intel-pt-pkt-decoder.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define BIT(n)		(1 << (n))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define BIT63		((uint64_t)1 << 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define NR_FLAG		BIT63
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #if __BYTE_ORDER == __BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define le16_to_cpu bswap_16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define le32_to_cpu bswap_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define le64_to_cpu bswap_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define memcpy_le64(d, s, n) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	memcpy((d), (s), (n));    \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	*(d) = le64_to_cpu(*(d)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define le16_to_cpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define le32_to_cpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define le64_to_cpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define memcpy_le64 memcpy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) static const char * const packet_name[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	[INTEL_PT_BAD]		= "Bad Packet!",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	[INTEL_PT_PAD]		= "PAD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	[INTEL_PT_TNT]		= "TNT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	[INTEL_PT_TIP_PGD]	= "TIP.PGD",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	[INTEL_PT_TIP_PGE]	= "TIP.PGE",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	[INTEL_PT_TSC]		= "TSC",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	[INTEL_PT_TMA]		= "TMA",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	[INTEL_PT_MODE_EXEC]	= "MODE.Exec",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	[INTEL_PT_MODE_TSX]	= "MODE.TSX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	[INTEL_PT_MTC]		= "MTC",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	[INTEL_PT_TIP]		= "TIP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	[INTEL_PT_FUP]		= "FUP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	[INTEL_PT_CYC]		= "CYC",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	[INTEL_PT_VMCS]		= "VMCS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	[INTEL_PT_PSB]		= "PSB",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	[INTEL_PT_PSBEND]	= "PSBEND",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	[INTEL_PT_CBR]		= "CBR",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	[INTEL_PT_TRACESTOP]	= "TraceSTOP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	[INTEL_PT_PIP]		= "PIP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	[INTEL_PT_OVF]		= "OVF",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	[INTEL_PT_MNT]		= "MNT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	[INTEL_PT_PTWRITE]	= "PTWRITE",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	[INTEL_PT_PTWRITE_IP]	= "PTWRITE",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	[INTEL_PT_EXSTOP]	= "EXSTOP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	[INTEL_PT_EXSTOP_IP]	= "EXSTOP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	[INTEL_PT_MWAIT]	= "MWAIT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	[INTEL_PT_PWRE]		= "PWRE",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	[INTEL_PT_PWRX]		= "PWRX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	[INTEL_PT_BBP]		= "BBP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	[INTEL_PT_BIP]		= "BIP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	[INTEL_PT_BEP]		= "BEP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	[INTEL_PT_BEP_IP]	= "BEP",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) const char *intel_pt_pkt_name(enum intel_pt_pkt_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	return packet_name[type];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) static int intel_pt_get_long_tnt(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 				 struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	uint64_t payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	payload = le64_to_cpu(*(uint64_t *)buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	for (count = 47; count; count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		if (payload & BIT63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 		payload <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	packet->type = INTEL_PT_TNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	packet->count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	packet->payload = payload << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) static int intel_pt_get_pip(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	uint64_t payload = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	packet->type = INTEL_PT_PIP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	memcpy_le64(&payload, buf + 2, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	packet->payload = payload >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	if (payload & 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		packet->payload |= NR_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static int intel_pt_get_tracestop(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	packet->type = INTEL_PT_TRACESTOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static int intel_pt_get_cbr(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	packet->type = INTEL_PT_CBR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	packet->payload = le16_to_cpu(*(uint16_t *)(buf + 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	return 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static int intel_pt_get_vmcs(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 			     struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	unsigned int count = (52 - 5) >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	if (count < 1 || count > 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	if (len < count + 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	packet->type = INTEL_PT_VMCS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	packet->count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	memcpy_le64(&packet->payload, buf + 2, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	return count + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static int intel_pt_get_ovf(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	packet->type = INTEL_PT_OVF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static int intel_pt_get_psb(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	if (len < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	for (i = 2; i < 16; i += 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		if (buf[i] != 2 || buf[i + 1] != 0x82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 			return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	packet->type = INTEL_PT_PSB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	return 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static int intel_pt_get_psbend(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	packet->type = INTEL_PT_PSBEND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static int intel_pt_get_tma(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	if (len < 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	packet->type = INTEL_PT_TMA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	packet->payload = buf[2] | (buf[3] << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	packet->count = buf[5] | ((buf[6] & BIT(0)) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	return 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static int intel_pt_get_pad(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	packet->type = INTEL_PT_PAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static int intel_pt_get_mnt(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	if (len < 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	packet->type = INTEL_PT_MNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	memcpy_le64(&packet->payload, buf + 3, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	return 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static int intel_pt_get_3byte(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 			      struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	if (len < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	switch (buf[2]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	case 0x88: /* MNT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		return intel_pt_get_mnt(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static int intel_pt_get_ptwrite(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 				struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	packet->count = (buf[1] >> 5) & 0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	packet->type = buf[1] & BIT(7) ? INTEL_PT_PTWRITE_IP :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 					 INTEL_PT_PTWRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	switch (packet->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		if (len < 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		packet->payload = le32_to_cpu(*(uint32_t *)(buf + 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		return 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		if (len < 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		packet->payload = le64_to_cpu(*(uint64_t *)(buf + 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		return 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static int intel_pt_get_exstop(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	packet->type = INTEL_PT_EXSTOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) static int intel_pt_get_exstop_ip(struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	packet->type = INTEL_PT_EXSTOP_IP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static int intel_pt_get_mwait(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 			      struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	if (len < 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	packet->type = INTEL_PT_MWAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	packet->payload = le64_to_cpu(*(uint64_t *)(buf + 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	return 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static int intel_pt_get_pwre(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 			     struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	packet->type = INTEL_PT_PWRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	memcpy_le64(&packet->payload, buf + 2, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	return 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static int intel_pt_get_pwrx(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 			     struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	if (len < 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	packet->type = INTEL_PT_PWRX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	memcpy_le64(&packet->payload, buf + 2, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	return 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) static int intel_pt_get_bbp(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	if (len < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	packet->type = INTEL_PT_BBP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	packet->count = buf[2] >> 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	packet->payload = buf[2] & 0x1f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	return 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) static int intel_pt_get_bip_4(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 			      struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	if (len < 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	packet->type = INTEL_PT_BIP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	packet->count = buf[0] >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	memcpy_le64(&packet->payload, buf + 1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	return 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) static int intel_pt_get_bip_8(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 			      struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	if (len < 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	packet->type = INTEL_PT_BIP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	packet->count = buf[0] >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	memcpy_le64(&packet->payload, buf + 1, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	return 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) static int intel_pt_get_bep(size_t len, struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	packet->type = INTEL_PT_BEP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) static int intel_pt_get_bep_ip(size_t len, struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	packet->type = INTEL_PT_BEP_IP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static int intel_pt_get_ext(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	if ((buf[1] & 0x1f) == 0x12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 		return intel_pt_get_ptwrite(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	switch (buf[1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	case 0xa3: /* Long TNT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 		return intel_pt_get_long_tnt(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	case 0x43: /* PIP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		return intel_pt_get_pip(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	case 0x83: /* TraceStop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 		return intel_pt_get_tracestop(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	case 0x03: /* CBR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		return intel_pt_get_cbr(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	case 0xc8: /* VMCS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 		return intel_pt_get_vmcs(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	case 0xf3: /* OVF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		return intel_pt_get_ovf(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	case 0x82: /* PSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 		return intel_pt_get_psb(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	case 0x23: /* PSBEND */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		return intel_pt_get_psbend(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	case 0x73: /* TMA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 		return intel_pt_get_tma(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	case 0xC3: /* 3-byte header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		return intel_pt_get_3byte(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	case 0x62: /* EXSTOP no IP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 		return intel_pt_get_exstop(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	case 0xE2: /* EXSTOP with IP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 		return intel_pt_get_exstop_ip(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	case 0xC2: /* MWAIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 		return intel_pt_get_mwait(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	case 0x22: /* PWRE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		return intel_pt_get_pwre(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	case 0xA2: /* PWRX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		return intel_pt_get_pwrx(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	case 0x63: /* BBP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		return intel_pt_get_bbp(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	case 0x33: /* BEP no IP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 		return intel_pt_get_bep(len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	case 0xb3: /* BEP with IP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		return intel_pt_get_bep_ip(len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) static int intel_pt_get_short_tnt(unsigned int byte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 				  struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	for (count = 6; count; count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 		if (byte & BIT(7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		byte <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	packet->type = INTEL_PT_TNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	packet->count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	packet->payload = (uint64_t)byte << 57;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) static int intel_pt_get_cyc(unsigned int byte, const unsigned char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 			    size_t len, struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	unsigned int offs = 1, shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	uint64_t payload = byte >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	byte >>= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	len -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	for (shift = 5; byte & 1; shift += 7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 		if (offs > 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 			return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 		if (len < offs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 		byte = buf[offs++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		payload |= ((uint64_t)byte >> 1) << shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	packet->type = INTEL_PT_CYC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	packet->payload = payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	return offs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) static int intel_pt_get_ip(enum intel_pt_pkt_type type, unsigned int byte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 			   const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 			   struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	int ip_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	packet->count = byte >> 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	switch (packet->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		ip_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		if (len < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 		ip_len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		packet->payload = le16_to_cpu(*(uint16_t *)(buf + 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 		if (len < 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 		ip_len = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 		packet->payload = le32_to_cpu(*(uint32_t *)(buf + 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 		if (len < 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		ip_len = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 		memcpy_le64(&packet->payload, buf + 1, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 		if (len < 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 			return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 		ip_len = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 		packet->payload = le64_to_cpu(*(uint64_t *)(buf + 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	packet->type = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	return ip_len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) static int intel_pt_get_mode(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 			     struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 	switch (buf[1] >> 5) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 		packet->type = INTEL_PT_MODE_EXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 		switch (buf[1] & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 			packet->payload = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 		case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 			packet->payload = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 		case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 			packet->payload = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 			return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 		packet->type = INTEL_PT_MODE_TSX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 		if ((buf[1] & 3) == 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 			return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		packet->payload = buf[1] & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) static int intel_pt_get_tsc(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	packet->type = INTEL_PT_TSC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 	memcpy_le64(&packet->payload, buf + 1, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	return 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) static int intel_pt_get_mtc(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 			    struct intel_pt_pkt *packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	packet->type = INTEL_PT_MTC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	packet->payload = buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) static int intel_pt_do_get_packet(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 				  struct intel_pt_pkt *packet,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 				  enum intel_pt_pkt_ctx ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 	unsigned int byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	memset(packet, 0, sizeof(struct intel_pt_pkt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	if (!len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 		return INTEL_PT_NEED_MORE_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	byte = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	switch (ctx) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	case INTEL_PT_NO_CTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	case INTEL_PT_BLK_4_CTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 		if ((byte & 0x7) == 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 			return intel_pt_get_bip_4(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	case INTEL_PT_BLK_8_CTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 		if ((byte & 0x7) == 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 			return intel_pt_get_bip_8(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	if (!(byte & BIT(0))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 		if (byte == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 			return intel_pt_get_pad(packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 		if (byte == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 			return intel_pt_get_ext(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 		return intel_pt_get_short_tnt(byte, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	if ((byte & 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 		return intel_pt_get_cyc(byte, buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 	switch (byte & 0x1f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	case 0x0D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 		return intel_pt_get_ip(INTEL_PT_TIP, byte, buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	case 0x11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 		return intel_pt_get_ip(INTEL_PT_TIP_PGE, byte, buf, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 				       packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	case 0x01:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 		return intel_pt_get_ip(INTEL_PT_TIP_PGD, byte, buf, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 				       packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	case 0x1D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 		return intel_pt_get_ip(INTEL_PT_FUP, byte, buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 	case 0x19:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 		switch (byte) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 		case 0x99:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 			return intel_pt_get_mode(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 		case 0x19:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 			return intel_pt_get_tsc(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 		case 0x59:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 			return intel_pt_get_mtc(buf, len, packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 			return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 		return INTEL_PT_BAD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) void intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 			  enum intel_pt_pkt_ctx *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 	switch (packet->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 	case INTEL_PT_BAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 	case INTEL_PT_PAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 	case INTEL_PT_TSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 	case INTEL_PT_TMA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 	case INTEL_PT_MTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	case INTEL_PT_FUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 	case INTEL_PT_CYC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 	case INTEL_PT_CBR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 	case INTEL_PT_MNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 	case INTEL_PT_EXSTOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 	case INTEL_PT_EXSTOP_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 	case INTEL_PT_PWRE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 	case INTEL_PT_PWRX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 	case INTEL_PT_BIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 	case INTEL_PT_TNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 	case INTEL_PT_TIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 	case INTEL_PT_TIP_PGD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 	case INTEL_PT_TIP_PGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 	case INTEL_PT_MODE_EXEC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 	case INTEL_PT_MODE_TSX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 	case INTEL_PT_PIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 	case INTEL_PT_OVF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 	case INTEL_PT_VMCS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 	case INTEL_PT_TRACESTOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 	case INTEL_PT_PSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 	case INTEL_PT_PSBEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 	case INTEL_PT_PTWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 	case INTEL_PT_PTWRITE_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 	case INTEL_PT_MWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 	case INTEL_PT_BEP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 	case INTEL_PT_BEP_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 		*ctx = INTEL_PT_NO_CTX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 	case INTEL_PT_BBP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 		if (packet->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 			*ctx = INTEL_PT_BLK_4_CTX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 			*ctx = INTEL_PT_BLK_8_CTX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) int intel_pt_get_packet(const unsigned char *buf, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 			struct intel_pt_pkt *packet, enum intel_pt_pkt_ctx *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 	ret = intel_pt_do_get_packet(buf, len, packet, *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 	if (ret > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 		while (ret < 8 && len > (size_t)ret && !buf[ret])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 			ret += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 		intel_pt_upd_pkt_ctx(packet, ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) int intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 		      size_t buf_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 	int ret, i, nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 	unsigned long long payload = packet->payload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 	const char *name = intel_pt_pkt_name(packet->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 	switch (packet->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 	case INTEL_PT_BAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 	case INTEL_PT_PAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 	case INTEL_PT_PSB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 	case INTEL_PT_PSBEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	case INTEL_PT_TRACESTOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 	case INTEL_PT_OVF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 		return snprintf(buf, buf_len, "%s", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 	case INTEL_PT_TNT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 		size_t blen = buf_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 		ret = snprintf(buf, blen, "%s ", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 		buf += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 		blen -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 		for (i = 0; i < packet->count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 			if (payload & BIT63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 				ret = snprintf(buf, blen, "T");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 				ret = snprintf(buf, blen, "N");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 			if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 				return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 			buf += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 			blen -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 			payload <<= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 		ret = snprintf(buf, blen, " (%d)", packet->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 		if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 			return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 		blen -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 		return buf_len - blen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 	case INTEL_PT_TIP_PGD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 	case INTEL_PT_TIP_PGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 	case INTEL_PT_TIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 	case INTEL_PT_FUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 		if (!(packet->count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 			return snprintf(buf, buf_len, "%s no ip", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 		__fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 	case INTEL_PT_CYC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 	case INTEL_PT_VMCS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 	case INTEL_PT_MTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 	case INTEL_PT_MNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 	case INTEL_PT_CBR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 	case INTEL_PT_TSC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		return snprintf(buf, buf_len, "%s 0x%llx", name, payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 	case INTEL_PT_TMA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 		return snprintf(buf, buf_len, "%s CTC 0x%x FC 0x%x", name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 				(unsigned)payload, packet->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 	case INTEL_PT_MODE_EXEC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 		return snprintf(buf, buf_len, "%s %lld", name, payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 	case INTEL_PT_MODE_TSX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 		return snprintf(buf, buf_len, "%s TXAbort:%u InTX:%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 				name, (unsigned)(payload >> 1) & 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 				(unsigned)payload & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 	case INTEL_PT_PIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 		nr = packet->payload & NR_FLAG ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 		payload &= ~NR_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 		ret = snprintf(buf, buf_len, "%s 0x%llx (NR=%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 			       name, payload, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 	case INTEL_PT_PTWRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 		return snprintf(buf, buf_len, "%s 0x%llx IP:0", name, payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 	case INTEL_PT_PTWRITE_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		return snprintf(buf, buf_len, "%s 0x%llx IP:1", name, payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 	case INTEL_PT_BEP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 	case INTEL_PT_EXSTOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 		return snprintf(buf, buf_len, "%s IP:0", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 	case INTEL_PT_BEP_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 	case INTEL_PT_EXSTOP_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 		return snprintf(buf, buf_len, "%s IP:1", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 	case INTEL_PT_MWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 		return snprintf(buf, buf_len, "%s 0x%llx Hints 0x%x Extensions 0x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 				name, payload, (unsigned int)(payload & 0xff),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 				(unsigned int)((payload >> 32) & 0x3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 	case INTEL_PT_PWRE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 		return snprintf(buf, buf_len, "%s 0x%llx HW:%u CState:%u Sub-CState:%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 				name, payload, !!(payload & 0x80),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 				(unsigned int)((payload >> 12) & 0xf),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 				(unsigned int)((payload >> 8) & 0xf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 	case INTEL_PT_PWRX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 		return snprintf(buf, buf_len, "%s 0x%llx Last CState:%u Deepest CState:%u Wake Reason 0x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 				name, payload,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 				(unsigned int)((payload >> 4) & 0xf),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 				(unsigned int)(payload & 0xf),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 				(unsigned int)((payload >> 8) & 0xf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 	case INTEL_PT_BBP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 		return snprintf(buf, buf_len, "%s SZ %s-byte Type 0x%llx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 				name, packet->count ? "4" : "8", payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 	case INTEL_PT_BIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 		return snprintf(buf, buf_len, "%s ID 0x%02x Value 0x%llx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 				name, packet->count, payload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 	return snprintf(buf, buf_len, "%s 0x%llx (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 			name, payload, packet->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }