162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * intel_pt_pkt_decoder.h: Intel Processor Trace support
462306a36Sopenharmony_ci * Copyright (c) 2013-2014, Intel Corporation.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef INCLUDE__INTEL_PT_PKT_DECODER_H__
862306a36Sopenharmony_ci#define INCLUDE__INTEL_PT_PKT_DECODER_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <stddef.h>
1162306a36Sopenharmony_ci#include <stdint.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define INTEL_PT_PKT_DESC_MAX	256
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define INTEL_PT_NEED_MORE_BYTES	-1
1662306a36Sopenharmony_ci#define INTEL_PT_BAD_PACKET		-2
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define INTEL_PT_PSB_STR		"\002\202\002\202\002\202\002\202" \
1962306a36Sopenharmony_ci					"\002\202\002\202\002\202\002\202"
2062306a36Sopenharmony_ci#define INTEL_PT_PSB_LEN		16
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define INTEL_PT_PKT_MAX_SZ		16
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define INTEL_PT_VMX_NR_FLAG		1
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cienum intel_pt_pkt_type {
2762306a36Sopenharmony_ci	INTEL_PT_BAD,
2862306a36Sopenharmony_ci	INTEL_PT_PAD,
2962306a36Sopenharmony_ci	INTEL_PT_TNT,
3062306a36Sopenharmony_ci	INTEL_PT_TIP_PGD,
3162306a36Sopenharmony_ci	INTEL_PT_TIP_PGE,
3262306a36Sopenharmony_ci	INTEL_PT_TSC,
3362306a36Sopenharmony_ci	INTEL_PT_TMA,
3462306a36Sopenharmony_ci	INTEL_PT_MODE_EXEC,
3562306a36Sopenharmony_ci	INTEL_PT_MODE_TSX,
3662306a36Sopenharmony_ci	INTEL_PT_MTC,
3762306a36Sopenharmony_ci	INTEL_PT_TIP,
3862306a36Sopenharmony_ci	INTEL_PT_FUP,
3962306a36Sopenharmony_ci	INTEL_PT_CYC,
4062306a36Sopenharmony_ci	INTEL_PT_VMCS,
4162306a36Sopenharmony_ci	INTEL_PT_PSB,
4262306a36Sopenharmony_ci	INTEL_PT_PSBEND,
4362306a36Sopenharmony_ci	INTEL_PT_CBR,
4462306a36Sopenharmony_ci	INTEL_PT_TRACESTOP,
4562306a36Sopenharmony_ci	INTEL_PT_PIP,
4662306a36Sopenharmony_ci	INTEL_PT_OVF,
4762306a36Sopenharmony_ci	INTEL_PT_MNT,
4862306a36Sopenharmony_ci	INTEL_PT_PTWRITE,
4962306a36Sopenharmony_ci	INTEL_PT_PTWRITE_IP,
5062306a36Sopenharmony_ci	INTEL_PT_EXSTOP,
5162306a36Sopenharmony_ci	INTEL_PT_EXSTOP_IP,
5262306a36Sopenharmony_ci	INTEL_PT_MWAIT,
5362306a36Sopenharmony_ci	INTEL_PT_PWRE,
5462306a36Sopenharmony_ci	INTEL_PT_PWRX,
5562306a36Sopenharmony_ci	INTEL_PT_BBP,
5662306a36Sopenharmony_ci	INTEL_PT_BIP,
5762306a36Sopenharmony_ci	INTEL_PT_BEP,
5862306a36Sopenharmony_ci	INTEL_PT_BEP_IP,
5962306a36Sopenharmony_ci	INTEL_PT_CFE,
6062306a36Sopenharmony_ci	INTEL_PT_CFE_IP,
6162306a36Sopenharmony_ci	INTEL_PT_EVD,
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct intel_pt_pkt {
6562306a36Sopenharmony_ci	enum intel_pt_pkt_type	type;
6662306a36Sopenharmony_ci	int			count;
6762306a36Sopenharmony_ci	uint64_t		payload;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/*
7162306a36Sopenharmony_ci * Decoding of BIP packets conflicts with single-byte TNT packets. Since BIP
7262306a36Sopenharmony_ci * packets only occur in the context of a block (i.e. between BBP and BEP), that
7362306a36Sopenharmony_ci * context must be recorded and passed to the packet decoder.
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_cienum intel_pt_pkt_ctx {
7662306a36Sopenharmony_ci	INTEL_PT_NO_CTX,	/* BIP packets are invalid */
7762306a36Sopenharmony_ci	INTEL_PT_BLK_4_CTX,	/* 4-byte BIP packets */
7862306a36Sopenharmony_ci	INTEL_PT_BLK_8_CTX,	/* 8-byte BIP packets */
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciconst char *intel_pt_pkt_name(enum intel_pt_pkt_type);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciint intel_pt_get_packet(const unsigned char *buf, size_t len,
8462306a36Sopenharmony_ci			struct intel_pt_pkt *packet,
8562306a36Sopenharmony_ci			enum intel_pt_pkt_ctx *ctx);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_civoid intel_pt_upd_pkt_ctx(const struct intel_pt_pkt *packet,
8862306a36Sopenharmony_ci			  enum intel_pt_pkt_ctx *ctx);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciint intel_pt_pkt_desc(const struct intel_pt_pkt *packet, char *buf, size_t len);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#endif
93