intel_pt_insn
struct intel_pt_insn intel_pt_insn;
if (intel_pt_get_insn(dat->data, MAX_INSN_SIZE, x86_64, &intel_pt_insn)) {
if ((int)intel_pt_insn.op != op) {
intel_pt_insn.op, op, dat->asm_rep);
if ((int)intel_pt_insn.branch != branch) {
intel_pt_insn.branch, branch, dat->asm_rep);
if (intel_pt_insn.rel != dat->expected_rel) {
intel_pt_insn.rel, dat->expected_rel, dat->asm_rep);
sample.insn_len = btsq->intel_pt_insn.length;
memcpy(sample.insn, btsq->intel_pt_insn.buf, INTEL_PT_INSN_BUF_SZ);
if (intel_pt_get_insn(buf, len, x86_64, &btsq->intel_pt_insn))
btsq->intel_pt_insn.length = 0;
btsq->intel_pt_insn.length = 0;
btsq->intel_pt_insn.length = 0;
btsq->sample_flags = intel_pt_insn_type(btsq->intel_pt_insn.op);
btsq->intel_pt_insn.length,
struct intel_pt_insn intel_pt_insn;
struct intel_pt_insn intel_pt_insn;
err = decoder->walk_insn(&intel_pt_insn, &insn_cnt, &decoder->ip,
if (intel_pt_insn.branch != INTEL_PT_BR_NO_BRANCH) {
decoder->ip += intel_pt_insn.length;
struct intel_pt_insn *intel_pt_insn, uint64_t ip)
err = decoder->walk_insn(intel_pt_insn, &insn_cnt, &decoder->ip, ip,
int (*walk_insn)(struct intel_pt_insn *intel_pt_insn,
if (intel_pt_insn->branch == INTEL_PT_BR_NO_BRANCH) {
decoder->ip += intel_pt_insn->length;
if (intel_pt_insn->op == INTEL_PT_OP_CALL) {
if (intel_pt_insn->branch != INTEL_PT_BR_UNCONDITIONAL ||
intel_pt_insn->rel) {
intel_pt_insn->length);
} else if (intel_pt_insn->op == INTEL_PT_OP_RET) {
if (intel_pt_insn->branch == INTEL_PT_BR_UNCONDITIONAL) {
decoder->ip += intel_pt_insn->length +
intel_pt_insn->rel;
decoder->state.insn_op = intel_pt_insn->op;
decoder->state.insn_len = intel_pt_insn->length;
memcpy(decoder->state.insn, intel_pt_insn->buf,
struct intel_pt_insn *intel_pt_insn,
intel_pt_insn->branch == INTEL_PT_BR_INDIRECT &&
ip == decoder->ip + intel_pt_insn->length;
struct intel_pt_insn intel_pt_insn;
err = intel_pt_walk_insn(decoder, &intel_pt_insn, ip);
intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) {
if (intel_pt_insn.branch == INTEL_PT_BR_INDIRECT) {
if (intel_pt_insn.branch == INTEL_PT_BR_CONDITIONAL) {
struct intel_pt_insn intel_pt_insn;
err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0);
if (intel_pt_insn.branch == INTEL_PT_BR_INDIRECT) {
if (intel_pt_insn.branch == INTEL_PT_BR_CONDITIONAL) {
uint64_t to_ip = decoder->ip + intel_pt_insn.length +
intel_pt_insn.rel;
struct intel_pt_insn intel_pt_insn;
err = intel_pt_walk_insn(decoder, &intel_pt_insn, 0);
decoder->emulated_ptwrite = intel_pt_insn.emulated_ptwrite;
if (intel_pt_insn.op == INTEL_PT_OP_RET) {
if (intel_pt_insn.branch == INTEL_PT_BR_INDIRECT) {
if (intel_pt_insn.branch == INTEL_PT_BR_CONDITIONAL) {
decoder->ip += intel_pt_insn.length +
intel_pt_insn.rel;
decoder->ip += intel_pt_insn.length;
decoder->ip += intel_pt_insn.length;
struct intel_pt_insn;
int (*walk_insn)(struct intel_pt_insn *intel_pt_insn,
intel_pt_insn->op = op;
intel_pt_insn->branch = branch;
intel_pt_insn->length = insn->length;
intel_pt_insn->rel = insn->immediate.value;
intel_pt_insn->rel =
intel_pt_insn->rel = bswap_32(insn->immediate.value);
intel_pt_insn->rel = 0;
intel_pt_insn->rel = insn->immediate.value;
struct intel_pt_insn *intel_pt_insn)
intel_pt_insn_decoder(&insn, intel_pt_insn);
memcpy(intel_pt_insn->buf, buf, insn.length);
memcpy(intel_pt_insn->buf, buf, INTEL_PT_INSN_BUF_SZ);
struct intel_pt_insn in;
struct intel_pt_insn *intel_pt_insn)
int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
switch (intel_pt_insn->branch) {
intel_pt_insn_name(intel_pt_insn->op),
intel_pt_insn->rel > 0 ? "+" : "",
intel_pt_insn->rel);
intel_pt_insn_name(intel_pt_insn->op));
intel_pt_insn->rel = 0;
intel_pt_insn->emulated_ptwrite = false;
intel_pt_insn->op = INTEL_PT_OP_OTHER;
intel_pt_insn->branch = INTEL_PT_BR_NO_BRANCH;
intel_pt_insn->length = insn->length;
intel_pt_insn->op = INTEL_PT_OP_JMP;
intel_pt_insn->branch = INTEL_PT_BR_INDIRECT;
intel_pt_insn->length = insn->length;
struct intel_pt_insn *intel_pt_insn);
int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
void __intel_pt_log_insn(struct intel_pt_insn *intel_pt_insn, uint64_t ip)
size_t len = intel_pt_insn->length;
intel_pt_print_data(intel_pt_insn->buf, len, ip, 8);
if (intel_pt_insn_desc(intel_pt_insn, desc, INTEL_PT_INSN_DESC_MAX) > 0)
void __intel_pt_log_insn_no_data(struct intel_pt_insn *intel_pt_insn,
if (intel_pt_insn_desc(intel_pt_insn, desc, INTEL_PT_INSN_DESC_MAX) > 0)
struct intel_pt_insn;
void __intel_pt_log_insn(struct intel_pt_insn *intel_pt_insn, uint64_t ip);
void __intel_pt_log_insn_no_data(struct intel_pt_insn *intel_pt_insn,
struct intel_pt_insn *intel_pt_insn)
e->op = intel_pt_insn->op;
e->branch = intel_pt_insn->branch;
e->emulated_ptwrite = intel_pt_insn->emulated_ptwrite;
e->length = intel_pt_insn->length;
e->rel = intel_pt_insn->rel;
memcpy(e->insn, intel_pt_insn->buf, INTEL_PT_INSN_BUF_SZ);
static inline bool intel_pt_jmp_16(struct intel_pt_insn *intel_pt_insn)
return intel_pt_insn->rel == 16 && intel_pt_insn->branch == INTEL_PT_BR_UNCONDITIONAL;
static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
intel_pt_insn->length = 0;
intel_pt_insn->op = INTEL_PT_OP_OTHER;
intel_pt_insn->op = e->op;
intel_pt_insn->branch = e->branch;
intel_pt_insn->emulated_ptwrite = e->emulated_ptwrite;
intel_pt_insn->length = e->length;
intel_pt_insn->rel = e->rel;
memcpy(intel_pt_insn->buf, e->insn, INTEL_PT_INSN_BUF_SZ);
intel_pt_log_insn_no_data(intel_pt_insn, *ip);
if (intel_pt_get_insn(buf, len, x86_64, intel_pt_insn)) {
intel_pt_log_insn(intel_pt_insn, *ip);
if (intel_pt_insn->branch != INTEL_PT_BR_NO_BRANCH) {
if (!intel_pt_jmp_16(intel_pt_insn))
offs = offset + intel_pt_insn->length;
intel_pt_insn->emulated_ptwrite = eptw;
*ip += intel_pt_insn->length;
intel_pt_insn->length = 0;
intel_pt_insn->op = INTEL_PT_OP_OTHER;
offset += intel_pt_insn->length;
*ip - start_ip, intel_pt_insn);