2018-01-18 00:52:13 +07:00
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0
|
|
|
|
*
|
|
|
|
* Copyright(C) 2015-2018 Linaro Limited.
|
|
|
|
*
|
|
|
|
* Author: Tor Jeremiassen <tor@ti.com>
|
|
|
|
* Author: Mathieu Poirier <mathieu.poirier@linaro.org>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef INCLUDE__CS_ETM_DECODER_H__
|
|
|
|
#define INCLUDE__CS_ETM_DECODER_H__
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
struct cs_etm_decoder;
|
|
|
|
|
|
|
|
enum cs_etm_sample_type {
|
2018-12-11 14:38:24 +07:00
|
|
|
CS_ETM_EMPTY,
|
|
|
|
CS_ETM_RANGE,
|
2018-12-11 14:38:25 +07:00
|
|
|
CS_ETM_DISCONTINUITY,
|
perf cs-etm: Generate branch sample for exception packet
The exception packet appears as one element with 'elem_type' ==
OCSD_GEN_TRC_ELEM_EXCEPTION or OCSD_GEN_TRC_ELEM_EXCEPTION_RET, which is
present for exception entry and exit respectively. The decoder sets the
packet fields 'packet->exc' and 'packet->exc_ret' to indicate the
exception packets; but exception packets don't have a dedicated sample
type and shares the same sample type CS_ETM_RANGE with normal
instruction packets.
As a result, the exception packets are taken as normal instruction
packets and this introduces confusion in mixing different packet types.
Furthermore, these instruction range packets will be processed for
branch samples only when 'packet->last_instr_taken_branch' is true,
otherwise they will be omitted, this can introduce a mess for exception
and exception returning due to not having the complete address range
info for context switching.
To process exception packets properly, this patch introduces two new
sample types: CS_ETM_EXCEPTION and CS_ETM_EXCEPTION_RET; these two types
of packets will be handled by cs_etm__exception(). The function
cs_etm__exception() forces setting the previous CS_ETM_RANGE packet flag
'prev_packet->last_instr_taken_branch' to true, this matches well with
the program flow when the exception is trapped from user space to kernel
space, no matter if the most recent flow has branch taken or not; this
is also safe for returning to user space after exception handling.
After exception packets have their own sample type, the packet fields
'packet->exc' and 'packet->exc_ret' aren't needed anymore, so remove
them.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Robert Walker <robert.walker@arm.com>
Cc: coresight ml <coresight@lists.linaro.org>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1544513908-16805-9-git-send-email-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-12-11 14:38:28 +07:00
|
|
|
CS_ETM_EXCEPTION,
|
|
|
|
CS_ETM_EXCEPTION_RET,
|
2018-01-18 00:52:13 +07:00
|
|
|
};
|
|
|
|
|
2018-12-03 19:18:46 +07:00
|
|
|
enum cs_etm_isa {
|
|
|
|
CS_ETM_ISA_UNKNOWN,
|
|
|
|
CS_ETM_ISA_A64,
|
|
|
|
CS_ETM_ISA_A32,
|
|
|
|
CS_ETM_ISA_T32,
|
|
|
|
};
|
|
|
|
|
2018-01-18 00:52:13 +07:00
|
|
|
struct cs_etm_packet {
|
|
|
|
enum cs_etm_sample_type sample_type;
|
2018-12-03 19:18:46 +07:00
|
|
|
enum cs_etm_isa isa;
|
2018-01-18 00:52:13 +07:00
|
|
|
u64 start_addr;
|
|
|
|
u64 end_addr;
|
2018-12-03 19:18:46 +07:00
|
|
|
u32 instr_count;
|
perf cs-etm: Add last instruction information in packet
Decoder provides last instruction related information, these information
can be used for trace analysis; specifically we can get to know what
kind of branch instruction has been executed, mainly the information are
contained in three element fields:
last_i_type: this is significant type for waypoint calculation, it
indicates the last instruction is one of immediate branch instruction,
indirect branch instruction, instruction barrier (ISB), or data
barrier (DSB/DMB).
last_i_subtype: this is used for instruction sub type, it can be
branch with link, ARMv8 return instruction, ARMv8 eret instruction
(return from exception), or ARMv7 instruction which could imply
return (e.g. MOV PC, LR; POP { ,PC}).
last_instr_cond: it indicates if the last instruction was conditional.
But these three fields are not saved into cs_etm_packet struct, thus
cs-etm layer don't know related information and cannot generate sample
flags for branch instructions.
This patch add corresponding three new fields in cs_etm_packet struct
and save related value into the packet structure, it is preparation for
supporting sample flags.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Robert Walker <robert.walker@arm.com>
Cc: Suzuki K Poulouse <suzuki.poulose@arm.com>
Cc: coresight ml <coresight@lists.linaro.org>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/20190129122842.32041-2-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2019-01-29 19:28:35 +07:00
|
|
|
u32 last_instr_type;
|
|
|
|
u32 last_instr_subtype;
|
2019-01-29 19:28:36 +07:00
|
|
|
u32 flags;
|
2019-01-29 19:28:38 +07:00
|
|
|
u32 exception_number;
|
perf cs-etm: Add last instruction information in packet
Decoder provides last instruction related information, these information
can be used for trace analysis; specifically we can get to know what
kind of branch instruction has been executed, mainly the information are
contained in three element fields:
last_i_type: this is significant type for waypoint calculation, it
indicates the last instruction is one of immediate branch instruction,
indirect branch instruction, instruction barrier (ISB), or data
barrier (DSB/DMB).
last_i_subtype: this is used for instruction sub type, it can be
branch with link, ARMv8 return instruction, ARMv8 eret instruction
(return from exception), or ARMv7 instruction which could imply
return (e.g. MOV PC, LR; POP { ,PC}).
last_instr_cond: it indicates if the last instruction was conditional.
But these three fields are not saved into cs_etm_packet struct, thus
cs-etm layer don't know related information and cannot generate sample
flags for branch instructions.
This patch add corresponding three new fields in cs_etm_packet struct
and save related value into the packet structure, it is preparation for
supporting sample flags.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Robert Walker <robert.walker@arm.com>
Cc: Suzuki K Poulouse <suzuki.poulose@arm.com>
Cc: coresight ml <coresight@lists.linaro.org>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/20190129122842.32041-2-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2019-01-29 19:28:35 +07:00
|
|
|
u8 last_instr_cond;
|
2018-02-14 18:24:39 +07:00
|
|
|
u8 last_instr_taken_branch;
|
2018-12-03 19:18:46 +07:00
|
|
|
u8 last_instr_size;
|
2019-01-29 19:28:40 +07:00
|
|
|
u8 trace_chan_id;
|
2018-01-18 00:52:13 +07:00
|
|
|
int cpu;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cs_etm_queue;
|
|
|
|
|
|
|
|
typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u64,
|
|
|
|
size_t, u8 *);
|
|
|
|
|
2018-12-05 03:39:02 +07:00
|
|
|
struct cs_etmv3_trace_params {
|
|
|
|
u32 reg_ctrl;
|
|
|
|
u32 reg_trc_id;
|
|
|
|
u32 reg_ccer;
|
|
|
|
u32 reg_idr;
|
|
|
|
};
|
|
|
|
|
2018-01-18 00:52:13 +07:00
|
|
|
struct cs_etmv4_trace_params {
|
|
|
|
u32 reg_idr0;
|
|
|
|
u32 reg_idr1;
|
|
|
|
u32 reg_idr2;
|
|
|
|
u32 reg_idr8;
|
|
|
|
u32 reg_configr;
|
|
|
|
u32 reg_traceidr;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cs_etm_trace_params {
|
|
|
|
int protocol;
|
|
|
|
union {
|
2018-12-05 03:39:02 +07:00
|
|
|
struct cs_etmv3_trace_params etmv3;
|
2018-01-18 00:52:13 +07:00
|
|
|
struct cs_etmv4_trace_params etmv4;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cs_etm_decoder_params {
|
|
|
|
int operation;
|
|
|
|
void (*packet_printer)(const char *msg);
|
|
|
|
cs_etm_mem_cb_type mem_acc_cb;
|
|
|
|
u8 formatted;
|
|
|
|
u8 fsyncs;
|
|
|
|
u8 hsyncs;
|
|
|
|
u8 frame_aligned;
|
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The following enums are indexed starting with 1 to align with the
|
|
|
|
* open source coresight trace decoder library.
|
|
|
|
*/
|
|
|
|
enum {
|
|
|
|
CS_ETM_PROTO_ETMV3 = 1,
|
|
|
|
CS_ETM_PROTO_ETMV4i,
|
|
|
|
CS_ETM_PROTO_ETMV4d,
|
2018-12-05 03:39:04 +07:00
|
|
|
CS_ETM_PROTO_PTM,
|
2018-01-18 00:52:13 +07:00
|
|
|
};
|
|
|
|
|
2019-02-13 00:16:09 +07:00
|
|
|
enum cs_etm_decoder_operation {
|
2018-01-18 00:52:13 +07:00
|
|
|
CS_ETM_OPERATION_PRINT = 1,
|
|
|
|
CS_ETM_OPERATION_DECODE,
|
2019-02-13 00:16:09 +07:00
|
|
|
CS_ETM_OPERATION_MAX,
|
2018-01-18 00:52:13 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
|
|
|
|
u64 indx, const u8 *buf,
|
|
|
|
size_t len, size_t *consumed);
|
|
|
|
|
|
|
|
struct cs_etm_decoder *
|
|
|
|
cs_etm_decoder__new(int num_cpu,
|
|
|
|
struct cs_etm_decoder_params *d_params,
|
|
|
|
struct cs_etm_trace_params t_params[]);
|
|
|
|
|
|
|
|
void cs_etm_decoder__free(struct cs_etm_decoder *decoder);
|
|
|
|
|
2018-01-18 00:52:15 +07:00
|
|
|
int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder,
|
|
|
|
u64 start, u64 end,
|
|
|
|
cs_etm_mem_cb_type cb_func);
|
|
|
|
|
|
|
|
int cs_etm_decoder__get_packet(struct cs_etm_decoder *decoder,
|
|
|
|
struct cs_etm_packet *packet);
|
|
|
|
|
|
|
|
int cs_etm_decoder__reset(struct cs_etm_decoder *decoder);
|
|
|
|
|
2018-01-18 00:52:13 +07:00
|
|
|
#endif /* INCLUDE__CS_ETM_DECODER_H__ */
|