⬢ DragonFlyBSD Kernel Audit
DF-3703 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -307,8 +307,12 @@ static int vega10_odn_initial_default_set
 	od_lookup_table = &odn_table->vddc_lookup_table;
 	vddc_lookup_table = table_info->vddc_lookup_table;
 
-	for (i = 0; i < vddc_lookup_table->count; i++)
+	od_lookup_table->count = vddc_lookup_table->count >
+			MAX_REGULAR_DPM_NUMBER ?
+			MAX_REGULAR_DPM_NUMBER : vddc_lookup_table->count;
+
+	for (i = 0; i < od_lookup_table->count; i++)
 		od_lookup_table->entries[i].us_vdd = vddc_lookup_table->entries[i].us_vdd;
-
-	od_lookup_table->count = vddc_lookup_table->count;
 
 	dep_table[0] = table_info->vdd_dep_on_sclk;
@@ -321,8 +325,15 @@ static int vega10_odn_initial_default_set
 	od_table[2] = (struct phm_ppt_v1_clock_voltage_dependency_table *)&odn_table->vdd_dep_on_socclk;
 
-	for (i = 0; i < 3; i++)
+	for (i = 0; i < 3; i++) {
+		/* odn destinations are fixed entries[MAX_REGULAR_DPM_NUMBER=8];
+		 * dep sources are VBIOS ucNumEntries (<=255). Bound the copy. */
+		uint32_t n = dep_table[i]->count;
+
+		if (n > MAX_REGULAR_DPM_NUMBER)
+			n = MAX_REGULAR_DPM_NUMBER;
+		dep_table[i]->count = n;
 		smu_get_voltage_dependency_table_ppt_v1(dep_table[i], od_table[i]);
+	}
@@ -2429,13 +2436,15 @@ static void vega10_check_dpm_table_updat
 	dep_table = table_info->vdd_dep_on_mclk;
 	odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_mclk);
 
-	for (i = 0; i < dep_table->count; i++) {
+	for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) {
 		if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
@@ -2439,7 +2448,7 @@ static void vega10_check_dpm_table_updat
 	dep_table = table_info->vdd_dep_on_sclk;
 	odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_sclk);
-	for (i = 0; i < dep_table->count; i++) {
+	for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) {
 		if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
@@ -4819,7 +4828,8 @@ static void vega10_odn_update_soc_table(
 		}
 		dpm_table = &data->dpm_table.soc_table;
-		for (i = 0; i < dep_table->count; i++) {
+		for (i = 0; i < dep_table->count && i < MAX_REGULAR_DPM_NUMBER; i++) {
 			if (dep_table->entries[i].vddInd == podn_vdd_dep->entries[dep_table->count-1].vddInd &&