1*f4aa0819SAdrian Hunter /* 2*f4aa0819SAdrian Hunter * intel_pt_decoder.h: Intel Processor Trace support 3*f4aa0819SAdrian Hunter * Copyright (c) 2013-2014, Intel Corporation. 4*f4aa0819SAdrian Hunter * 5*f4aa0819SAdrian Hunter * This program is free software; you can redistribute it and/or modify it 6*f4aa0819SAdrian Hunter * under the terms and conditions of the GNU General Public License, 7*f4aa0819SAdrian Hunter * version 2, as published by the Free Software Foundation. 8*f4aa0819SAdrian Hunter * 9*f4aa0819SAdrian Hunter * This program is distributed in the hope it will be useful, but WITHOUT 10*f4aa0819SAdrian Hunter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*f4aa0819SAdrian Hunter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*f4aa0819SAdrian Hunter * more details. 13*f4aa0819SAdrian Hunter * 14*f4aa0819SAdrian Hunter */ 15*f4aa0819SAdrian Hunter 16*f4aa0819SAdrian Hunter #ifndef INCLUDE__INTEL_PT_DECODER_H__ 17*f4aa0819SAdrian Hunter #define INCLUDE__INTEL_PT_DECODER_H__ 18*f4aa0819SAdrian Hunter 19*f4aa0819SAdrian Hunter #include <stdint.h> 20*f4aa0819SAdrian Hunter #include <stddef.h> 21*f4aa0819SAdrian Hunter #include <stdbool.h> 22*f4aa0819SAdrian Hunter 23*f4aa0819SAdrian Hunter #include "intel-pt-insn-decoder.h" 24*f4aa0819SAdrian Hunter 25*f4aa0819SAdrian Hunter #define INTEL_PT_IN_TX (1 << 0) 26*f4aa0819SAdrian Hunter #define INTEL_PT_ABORT_TX (1 << 1) 27*f4aa0819SAdrian Hunter #define INTEL_PT_ASYNC (1 << 2) 28*f4aa0819SAdrian Hunter 29*f4aa0819SAdrian Hunter enum intel_pt_sample_type { 30*f4aa0819SAdrian Hunter INTEL_PT_BRANCH = 1 << 0, 31*f4aa0819SAdrian Hunter INTEL_PT_INSTRUCTION = 1 << 1, 32*f4aa0819SAdrian Hunter INTEL_PT_TRANSACTION = 1 << 2, 33*f4aa0819SAdrian Hunter }; 34*f4aa0819SAdrian Hunter 35*f4aa0819SAdrian Hunter enum intel_pt_period_type { 36*f4aa0819SAdrian Hunter INTEL_PT_PERIOD_NONE, 37*f4aa0819SAdrian Hunter INTEL_PT_PERIOD_INSTRUCTIONS, 38*f4aa0819SAdrian Hunter INTEL_PT_PERIOD_TICKS, 39*f4aa0819SAdrian Hunter }; 40*f4aa0819SAdrian Hunter 41*f4aa0819SAdrian Hunter enum { 42*f4aa0819SAdrian Hunter INTEL_PT_ERR_NOMEM = 1, 43*f4aa0819SAdrian Hunter INTEL_PT_ERR_INTERN, 44*f4aa0819SAdrian Hunter INTEL_PT_ERR_BADPKT, 45*f4aa0819SAdrian Hunter INTEL_PT_ERR_NODATA, 46*f4aa0819SAdrian Hunter INTEL_PT_ERR_NOINSN, 47*f4aa0819SAdrian Hunter INTEL_PT_ERR_MISMAT, 48*f4aa0819SAdrian Hunter INTEL_PT_ERR_OVR, 49*f4aa0819SAdrian Hunter INTEL_PT_ERR_LOST, 50*f4aa0819SAdrian Hunter INTEL_PT_ERR_UNK, 51*f4aa0819SAdrian Hunter INTEL_PT_ERR_NELOOP, 52*f4aa0819SAdrian Hunter INTEL_PT_ERR_MAX, 53*f4aa0819SAdrian Hunter }; 54*f4aa0819SAdrian Hunter 55*f4aa0819SAdrian Hunter struct intel_pt_state { 56*f4aa0819SAdrian Hunter enum intel_pt_sample_type type; 57*f4aa0819SAdrian Hunter int err; 58*f4aa0819SAdrian Hunter uint64_t from_ip; 59*f4aa0819SAdrian Hunter uint64_t to_ip; 60*f4aa0819SAdrian Hunter uint64_t cr3; 61*f4aa0819SAdrian Hunter uint64_t timestamp; 62*f4aa0819SAdrian Hunter uint64_t est_timestamp; 63*f4aa0819SAdrian Hunter uint64_t trace_nr; 64*f4aa0819SAdrian Hunter uint32_t flags; 65*f4aa0819SAdrian Hunter enum intel_pt_insn_op insn_op; 66*f4aa0819SAdrian Hunter int insn_len; 67*f4aa0819SAdrian Hunter }; 68*f4aa0819SAdrian Hunter 69*f4aa0819SAdrian Hunter struct intel_pt_insn; 70*f4aa0819SAdrian Hunter 71*f4aa0819SAdrian Hunter struct intel_pt_buffer { 72*f4aa0819SAdrian Hunter const unsigned char *buf; 73*f4aa0819SAdrian Hunter size_t len; 74*f4aa0819SAdrian Hunter bool consecutive; 75*f4aa0819SAdrian Hunter uint64_t ref_timestamp; 76*f4aa0819SAdrian Hunter uint64_t trace_nr; 77*f4aa0819SAdrian Hunter }; 78*f4aa0819SAdrian Hunter 79*f4aa0819SAdrian Hunter struct intel_pt_params { 80*f4aa0819SAdrian Hunter int (*get_trace)(struct intel_pt_buffer *buffer, void *data); 81*f4aa0819SAdrian Hunter int (*walk_insn)(struct intel_pt_insn *intel_pt_insn, 82*f4aa0819SAdrian Hunter uint64_t *insn_cnt_ptr, uint64_t *ip, uint64_t to_ip, 83*f4aa0819SAdrian Hunter uint64_t max_insn_cnt, void *data); 84*f4aa0819SAdrian Hunter void *data; 85*f4aa0819SAdrian Hunter bool return_compression; 86*f4aa0819SAdrian Hunter uint64_t period; 87*f4aa0819SAdrian Hunter enum intel_pt_period_type period_type; 88*f4aa0819SAdrian Hunter unsigned max_non_turbo_ratio; 89*f4aa0819SAdrian Hunter }; 90*f4aa0819SAdrian Hunter 91*f4aa0819SAdrian Hunter struct intel_pt_decoder; 92*f4aa0819SAdrian Hunter 93*f4aa0819SAdrian Hunter struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params); 94*f4aa0819SAdrian Hunter void intel_pt_decoder_free(struct intel_pt_decoder *decoder); 95*f4aa0819SAdrian Hunter 96*f4aa0819SAdrian Hunter const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder); 97*f4aa0819SAdrian Hunter 98*f4aa0819SAdrian Hunter unsigned char *intel_pt_find_overlap(unsigned char *buf_a, size_t len_a, 99*f4aa0819SAdrian Hunter unsigned char *buf_b, size_t len_b, 100*f4aa0819SAdrian Hunter bool have_tsc); 101*f4aa0819SAdrian Hunter 102*f4aa0819SAdrian Hunter int intel_pt__strerror(int code, char *buf, size_t buflen); 103*f4aa0819SAdrian Hunter 104*f4aa0819SAdrian Hunter #endif 105