Commit 5c1b1583 authored by Leo Yan's avatar Leo Yan Committed by Namhyung Kim
Browse files

perf arm-spe: Fill branch operations and events to record



The new added branch operations and events are filled into record, the
information will be consumed when synthesizing samples.

Reviewed-by: default avatarIan Rogers <irogers@google.com>
Reviewed-by: default avatarJames Clark <james.clark@linaro.org>
Signed-off-by: default avatarLeo Yan <leo.yan@arm.com>
Link: https://lore.kernel.org/r/20250304111240.3378214-10-leo.yan@arm.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent faf22605
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -207,6 +207,18 @@ static int arm_spe_read_record(struct arm_spe_decoder *decoder)
				break;
			case SPE_OP_PKT_HDR_CLASS_BR_ERET:
				decoder->record.op |= ARM_SPE_OP_BRANCH_ERET;
				if (payload & SPE_OP_PKT_COND)
					decoder->record.op |= ARM_SPE_OP_BR_COND;
				if (payload & SPE_OP_PKT_INDIRECT_BRANCH)
					decoder->record.op |= ARM_SPE_OP_BR_INDIRECT;
				if (payload & SPE_OP_PKT_GCS)
					decoder->record.op |= ARM_SPE_OP_BR_GCS;
				if (SPE_OP_PKT_CR_BL(payload))
					decoder->record.op |= ARM_SPE_OP_BR_CR_BL;
				if (SPE_OP_PKT_CR_RET(payload))
					decoder->record.op |= ARM_SPE_OP_BR_CR_RET;
				if (SPE_OP_PKT_CR_NON_BL_RET(payload))
					decoder->record.op |= ARM_SPE_OP_BR_CR_NON_BL_RET;
				break;
			default:
				pr_err("Get packet error!\n");
@@ -238,6 +250,12 @@ static int arm_spe_read_record(struct arm_spe_decoder *decoder)
			if (payload & BIT(EV_MISPRED))
				decoder->record.type |= ARM_SPE_BRANCH_MISS;

			if (payload & BIT(EV_NOT_TAKEN))
				decoder->record.type |= ARM_SPE_BRANCH_NOT_TAKEN;

			if (payload & BIT(EV_TRANSACTIONAL))
				decoder->record.type |= ARM_SPE_IN_TXN;

			if (payload & BIT(EV_PARTIAL_PREDICATE))
				decoder->record.type |= ARM_SPE_SVE_PARTIAL_PRED;

+8 −2
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ enum arm_spe_sample_type {
	ARM_SPE_REMOTE_ACCESS		= 1 << 7,
	ARM_SPE_SVE_PARTIAL_PRED	= 1 << 8,
	ARM_SPE_SVE_EMPTY_PRED		= 1 << 9,
	ARM_SPE_BRANCH_NOT_TAKEN	= 1 << 10,
	ARM_SPE_IN_TXN			= 1 << 11,
};

enum arm_spe_op_type {
@@ -54,6 +56,10 @@ enum arm_spe_op_type {
	/* Second level operation type for BRANCH_ERET */
	ARM_SPE_OP_BR_COND		= 1 << 16,
	ARM_SPE_OP_BR_INDIRECT		= 1 << 17,
	ARM_SPE_OP_BR_GCS		= 1 << 18,
	ARM_SPE_OP_BR_CR_BL		= 1 << 19,
	ARM_SPE_OP_BR_CR_RET		= 1 << 20,
	ARM_SPE_OP_BR_CR_NON_BL_RET	= 1 << 21,
};

enum arm_spe_common_data_source {