Skip to content
/ linux Public

Commit 08c7ead

Browse files
rmurphy-armSasha Levin
authored andcommitted
perf/arm-cmn: Reject unsupported hardware configurations
[ Upstream commit 36c0de0 ] So far we've been fairly lax about accepting both unknown CMN models (at least with a warning), and unknown revisions of those which we do know, as although things do frequently change between releases, typically enough remains the same to be somewhat useful for at least some basic bringup checks. However, we also make assumptions of the maximum supported sizes and numbers of things in various places, and there's no guarantee that something new might not be bigger and lead to nasty array overflows. Make sure we only try to run on things that actually match our assumptions and so will not risk memory corruption. We have at least always failed on completely unknown node types, so update that error message for clarity and consistency too. Cc: stable@vger.kernel.org Fixes: 7819e05 ("perf/arm-cmn: Revamp model detection") Reviewed-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 500778d commit 08c7ead

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

drivers/perf/arm-cmn.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,15 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
24222422
arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn);
24232423
dn->portid_bits = xp->portid_bits;
24242424
dn->deviceid_bits = xp->deviceid_bits;
2425+
/*
2426+
* Logical IDs are assigned from 0 per node type, so as
2427+
* soon as we see one bigger than expected, we can assume
2428+
* there are more than we can cope with.
2429+
*/
2430+
if (dn->logid > CMN_MAX_NODES_PER_EVENT) {
2431+
dev_err(cmn->dev, "Node ID invalid for supported CMN versions: %d\n", dn->logid);
2432+
return -ENODEV;
2433+
}
24252434

24262435
switch (dn->type) {
24272436
case CMN_TYPE_DTC:
@@ -2471,7 +2480,7 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
24712480
break;
24722481
/* Something has gone horribly wrong */
24732482
default:
2474-
dev_err(cmn->dev, "invalid device node type: 0x%x\n", dn->type);
2483+
dev_err(cmn->dev, "Device node type invalid for supported CMN versions: 0x%x\n", dn->type);
24752484
return -ENODEV;
24762485
}
24772486
}
@@ -2499,6 +2508,10 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
24992508
cmn->mesh_x = cmn->num_xps;
25002509
cmn->mesh_y = cmn->num_xps / cmn->mesh_x;
25012510

2511+
if (max(cmn->mesh_x, cmn->mesh_y) > CMN_MAX_DIMENSION) {
2512+
dev_err(cmn->dev, "Mesh size invalid for supported CMN versions: %dx%d\n", cmn->mesh_x, cmn->mesh_y);
2513+
return -ENODEV;
2514+
}
25022515
/* 1x1 config plays havoc with XP event encodings */
25032516
if (cmn->num_xps == 1)
25042517
dev_warn(cmn->dev, "1x1 config not fully supported, translate XP events manually\n");

0 commit comments

Comments
 (0)