Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6035b680 authored by Leo Yan's avatar Leo Yan Committed by Arnaldo Carvalho de Melo
Browse files

perf cs-etm: Support dummy address value for CS_ETM_TRACE_ON packet



For CS_ETM_TRACE_ON packet, its fields 'packet->start_addr' and
'packet->end_addr' equal to 0xdeadbeefdeadbeefUL which are emitted in
the decoder layer as dummy value, but the dummy value is pointless for
branch sample when we use 'perf script' command to check program flow.

This patch is a preparation to support CS_ETM_TRACE_ON packet for branch
sample, it converts the dummy address value to zero for more readable;
this is accomplished by cs_etm__last_executed_instr() and
cs_etm__first_executed_instr().  The later one is a new function
introduced by this patch.

Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kim Phillips <kim.phillips@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Robert Walker <robert.walker@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1531295145-596-5-git-send-email-leo.yan@linaro.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3eb3e07b
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -494,6 +494,10 @@ static inline void cs_etm__reset_last_branch_rb(struct cs_etm_queue *etmq)

static inline u64 cs_etm__last_executed_instr(struct cs_etm_packet *packet)
{
	/* Returns 0 for the CS_ETM_TRACE_ON packet */
	if (packet->sample_type == CS_ETM_TRACE_ON)
		return 0;

	/*
	 * The packet records the execution range with an exclusive end address
	 *
@@ -505,6 +509,15 @@ static inline u64 cs_etm__last_executed_instr(struct cs_etm_packet *packet)
	return packet->end_addr - A64_INSTR_SIZE;
}

static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
{
	/* Returns 0 for the CS_ETM_TRACE_ON packet */
	if (packet->sample_type == CS_ETM_TRACE_ON)
		return 0;

	return packet->start_addr;
}

static inline u64 cs_etm__instr_count(const struct cs_etm_packet *packet)
{
	/*
@@ -546,7 +559,7 @@ static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq)

	be       = &bs->entries[etmq->last_branch_pos];
	be->from = cs_etm__last_executed_instr(etmq->prev_packet);
	be->to	 = etmq->packet->start_addr;
	be->to	 = cs_etm__first_executed_instr(etmq->packet);
	/* No support for mispredict */
	be->flags.mispred = 0;
	be->flags.predicted = 1;
@@ -701,7 +714,7 @@ static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq)
	sample.ip = cs_etm__last_executed_instr(etmq->prev_packet);
	sample.pid = etmq->pid;
	sample.tid = etmq->tid;
	sample.addr = etmq->packet->start_addr;
	sample.addr = cs_etm__first_executed_instr(etmq->packet);
	sample.id = etmq->etm->branches_id;
	sample.stream_id = etmq->etm->branches_id;
	sample.period = 1;