cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

intel-pt-pkt-decoder.c (18969B)


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