From 46cb4f2bf0716d74e6182924d6f1382e283bf30b Mon Sep 17 00:00:00 2001 From: Flora Cui Date: Tue, 30 Jun 2026 13:31:31 +0800 Subject: [PATCH] fix(topology): guard division-by-zero in system properties path Follow-up to the earlier topology zero-guard work; keep behavior unchanged for valid non-zero device info while preventing undefined behavior on zeros. Link: https://github.com/ROCm/librocdxg/pull/8 Co-authored-by: hammmmy Signed-off-by: Flora Cui --- src/topology.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/topology.cpp b/src/topology.cpp index b6533c2..0dd0109 100644 --- a/src/topology.cpp +++ b/src/topology.cpp @@ -538,15 +538,35 @@ static HSAKMT_STATUS topology_sysfs_get_node_props(uint32_t node_id, props.CComputeIdLo = 0; props.FComputeIdLo = 0; props.Capability.ui32.ASICRevision = device->AsicRevision(); - props.Capability.ui32.WatchPointsTotalBits = - std::log2(device->WatchPointsNum()); - props.MaxWavesPerSIMD = device->WavePerCu() / device->SimdPerCu(); + uint32_t watch_points_num = device->WatchPointsNum(); + if (watch_points_num == 0) { + pr_warn( + "WatchPointsNum is 0 for node %u, forcing WatchPointsTotalBits to 0\n", + node_id); + props.Capability.ui32.WatchPointsTotalBits = 0; + } else { + props.Capability.ui32.WatchPointsTotalBits = std::log2(watch_points_num); + } + uint32_t simd_per_cu = device->SimdPerCu(); + if (simd_per_cu == 0) { + pr_warn("SimdPerCu is 0 for node %u, forcing MaxWavesPerSIMD to 0\n", + node_id); + props.MaxWavesPerSIMD = 0; + } else { + props.MaxWavesPerSIMD = device->WavePerCu() / simd_per_cu; + } props.LDSSizeInKB = device->LdsSize() / 1024; props.GDSSizeInKB = 0; props.WaveFrontSize = device->WavefrontSize(); props.NumShaderBanks = device->NumShaderEngine(); props.NumArrays = device->ShaderArrayPerShaderEngine(); - props.NumCUPerArray = device->ComputeUnitCount() / props.NumArrays; + if (props.NumArrays == 0) { + pr_warn("NumArrays is 0 for node %u, forcing NumCUPerArray to 0\n", + node_id); + props.NumCUPerArray = 0; + } else { + props.NumCUPerArray = device->ComputeUnitCount() / props.NumArrays; + } props.NumSIMDPerCU = device->SimdPerCu(); props.MaxSlotsScratchCU = device->MaxScratchSlotsPerCu(); props.VendorId = 0x1002;