pt_insn_next - Man Page

iterate over traced instructions

Synopsis

#include <intel-pt.h>

struct pt_insn;

int pt_insn_next(struct pt_insn_decoder *decoder,

                 struct pt_insn *insn, size_t size);

Link with -lipt.

Description

pt_insn_next() provides the next instruction in execution order, which is described by the pt_insn structure.

The size argument must be set to sizeof(struct pt_insn). The function will provide at most size bytes of the pt_insn structure. A newer decoder library may truncate an extended pt_insn object to size bytes.

An older decoder library may provide less pt_insn fields. Fields that are not provided will be zero-initialized. For fields where zero is a valid value (e.g. for bit-fields), check the decoder library version to determine which fields are valid. See pt_library_version(3).

On success, the next instruction is provided in the pt_insn object pointed to by the insn argument. The pt_insn structure is declared as:

/** A single traced instruction. */
struct pt_insn {
    /** The virtual address in its process. */
    uint64_t ip;

    /** The image section identifier for the section containing this
     * instruction.
     *
     * A value of zero means that the section did not have an identifier.
     * The section was not added via an image section cache or the memory
     * was read via the read memory callback.
     */
    int isid;

    /** The execution mode. */
    enum pt_exec_mode mode;

    /** A coarse classification. */
    enum pt_insn_class iclass;

    /** The raw bytes. */
    uint8_t raw[pt_max_insn_size];

    /** The size in bytes. */
    uint8_t size;

    /** A collection of flags giving additional information:
     *
     * - the instruction was executed speculatively.
     */
    uint32_t speculative:1;

    /** - this instruction is truncated in its image section.
     *
     *    It starts in the image section identified by \@isid and continues
     *    in one or more other sections.
     */
    uint32_t truncated:1;
};

The fields of the pt_insn structure are described in more detail below:

ip

The virtual address of the instruction. The address should be interpreted in the current address space context.

isid

The image section identifier of the section from which the instruction originated. This will be zero unless the instruction came from a section that was added via an image section cache. See pt_image_add_cached(3).

The image section identifier can be used to trace an instruction back to its binary file and from there to source code.

mode

The execution mode at which the instruction was executed. The pt_exec_mode enumeration is declared as:

/** An execution mode. */
enum pt_exec_mode {
    ptem_unknown,
    ptem_16bit,
    ptem_32bit,
    ptem_64bit
};
iclass

A coarse classification of the instruction suitable for constructing a call back trace. The pt_insn_class enumeration is declared as:

/** The instruction class.
 *
 * We provide only a very coarse classification suitable for
 * reconstructing the execution flow.
 */
enum pt_insn_class {
    /* The instruction has not been classified. */
    ptic_unknown,

    /* The instruction is something not listed below. */
    ptic_other,

    /* The instruction is a near (function) call. */
    ptic_call,

    /* The instruction is a near (function) return. */
    ptic_return,

    /* The instruction is a near unconditional jump. */
    ptic_jump,

    /* The instruction is a near conditional jump. */
    ptic_cond_jump,

    /* The instruction is a call-like far transfer.
     * E.g. SYSCALL, SYSENTER, or FAR CALL.
     */
    ptic_far_call,

    /* The instruction is a return-like far transfer.
     * E.g. SYSRET, SYSEXIT, IRET, or FAR RET.
     */
    ptic_far_return,

    /* The instruction is a jump-like far transfer.
     * E.g. FAR JMP.
     */
    ptic_far_jump,

    /* The instruction is a PTWRITE. */
    ptic_ptwrite,

    /* The instruction is an indirect jump or a far transfer. */
    ptic_indirect
};
raw

The memory containing the instruction.

size

The size of the instruction in bytes.

speculative

A flag giving the speculative execution status of the instruction. If set, the instruction was executed speculatively. Otherwise, the instruction was executed normally.

truncated

A flag saying whether this instruction spans more than one image section. If clear, this instruction originates from a single section identified by isid. If set, the instruction overlaps two or more image sections. In this case, isid identifies the section that contains the first byte.

Return Value

pt_insn_next() returns zero or a positive value on success or a negative pt_error_code enumeration constant in case of an error.

On success, a bit-vector of pt_status_flag enumeration constants is returned. The pt_status_flag enumeration is declared as:

/** Decoder status flags. */
enum pt_status_flag {
    /** There is an event pending. */
    pts_event_pending   = 1 << 0,

    /** The address has been suppressed. */
    pts_ip_suppressed   = 1 << 1,

    /** There is no more trace data available. */
    pts_eos             = 1 << 2
};

The pts_event_pending flag indicates that one or more events are pending. Use pt_insn_event(3) to process pending events before calling pt_insn_next() again.

The pt_eos flag indicates that the information contained in the Intel PT stream has been consumed. Further calls to pt_insn_next() will continue to provide instructions as long as the instruction’s address can be determined without further trace.

Errors

pte_invalid

The decoder or insn argument is NULL or the size argument is too small.

pte_eos

Decode reached the end of the trace stream.

pte_nosync

The decoder has not been synchronized onto the trace stream. Use pt_insn_sync_forward(3), pt_insn_sync_backward(3), or pt_insn_sync_set(3) to synchronize decoder.

pte_bad_opc

The decoder encountered an unsupported Intel PT packet opcode.

pte_bad_packet

The decoder encountered an unsupported Intel PT packet payload.

pte_bad_query

Execution flow reconstruction and trace got out of sync.

This typically means that, on its way to the virtual address of the next event, the decoder encountered a conditional or indirect branch for which it did not find guidance in the trace.

See Also

pt_insn_alloc_decoder(3), pt_insn_free_decoder(3), pt_insn_sync_forward(3), pt_insn_sync_backward(3), pt_insn_sync_set(3), pt_insn_time(3), pt_insn_core_bus_ratio(3), pt_insn_event(3)

Referenced By

pt_evt_next(3), pt_insn_alloc_decoder(3), pt_insn_get_image(3), pt_insn_get_offset(3), pt_insn_sync_forward(3), pt_qry_time(3).

The man page pt_insn(3) is an alias of pt_insn_next(3).