⬢ DragonFlyBSD Kernel Audit
DF-3612 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/si_dpm.c
+++ b/sys/dev/drm/radeon/si_dpm.c
@@ -4828,8 +4828,13 @@
 
 		if (radeon_atombios_get_asic_ss_info(rdev, &ss,
 						     ASIC_INTERNAL_ENGINE_SS, vco_freq)) {
-			u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate);
-			u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
+			u32 clk_s, clk_v;
+
+			if (ss.rate == 0)
+				return -EINVAL;
+			clk_s = reference_clock * 5 / (reference_divider * ss.rate);
+			clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
+
 
 			cg_spll_spread_spectrum &= ~CLK_S_MASK;
 			cg_spll_spread_spectrum |= CLK_S(clk_s);
@@ -4928,8 +4933,13 @@
 		tmp = tmp * tmp;
 		if (radeon_atombios_get_asic_ss_info(rdev, &ss,
 						     ASIC_INTERNAL_MEMORY_SS, freq_nom)) {
-			u32 clks = reference_clock * 5 / ss.rate;
-			u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
+			u32 clks, clkv;
+
+			if (ss.rate == 0)
+				return -EINVAL;
+			clks = reference_clock * 5 / ss.rate;
+			clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
+
 
 			mpll_ss1 &= ~CLKV_MASK;
 			mpll_ss1 |= CLKV(clkv);