Skip to content

Commit d30c8b3

Browse files
authored
[drivers][ofw] Fixed fdt_scan_memory() memory adjustment bug (#8853)
* Fixed fdt memory adjustment bug * Modify the memory adjustment logic
1 parent 946dd26 commit d30c8b3

File tree

1 file changed

+45
-39
lines changed
  • components/drivers/ofw

1 file changed

+45
-39
lines changed

components/drivers/ofw/fdt.c

+45-39
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,19 @@ static rt_err_t fdt_scan_memory(void)
475475
break;
476476
}
477477

478+
/*
479+
* +--------+ +--------+
480+
* | memory | | memory |
481+
* +--------+ +----------+ +----------+ +--------+
482+
* | reserved | | reserved |
483+
* +----------+ +----------+
484+
*/
485+
if (res_region->start >= region->end || res_region->end <= region->start)
486+
{
487+
/* No adjustments needed */
488+
continue;
489+
}
490+
478491
/*
479492
* case 0: case 1:
480493
* +------------------+ +----------+
@@ -490,56 +503,49 @@ static rt_err_t fdt_scan_memory(void)
490503
* | reserved | | reserved |
491504
* +----------+ +----------+
492505
*/
493-
494-
/* case 0 */
495-
if (res_region->start >= region->start && res_region->end <= region->end)
506+
if (res_region->start > region->start)
496507
{
497-
rt_size_t new_size = region->end - res_region->end;
508+
if (res_region->end < region->end)
509+
{
510+
/* case 0 */
511+
rt_size_t new_size = region->end - res_region->end;
498512

499-
region->end = res_region->start;
513+
region->end = res_region->start;
500514

501-
/* Commit part next block */
502-
if (new_size)
503-
{
515+
/* Commit part next block */
504516
err = commit_memregion(region->name, res_region->end, new_size, RT_FALSE);
505-
}
506517

507-
if (!err)
508-
{
509-
++no;
518+
if (!err)
519+
{
520+
++no;
510521

511-
/* Scan again */
512-
region = &_memregion[0];
513-
--region;
522+
/* Scan again */
523+
region = &_memregion[0];
524+
--region;
514525

515-
break;
526+
break;
527+
}
528+
}
529+
else
530+
{
531+
/* case 2 */
532+
region->end = res_region->start;
516533
}
517-
518-
continue;
519-
}
520-
521-
/* case 1 */
522-
if (res_region->start <= region->start && res_region->end >= region->end)
523-
{
524-
region->name = RT_NULL;
525-
526-
break;
527-
}
528-
529-
/* case 2 */
530-
if (res_region->start <= region->end && res_region->end >= region->end)
531-
{
532-
region->end = res_region->start;
533-
534-
continue;
535534
}
536-
537-
/* case 3 */
538-
if (res_region->start <= region->start && res_region->end >= region->start)
535+
else
539536
{
540-
region->start = res_region->end;
537+
if (res_region->end < region->end)
538+
{
539+
/* case 3 */
540+
region->start = res_region->end;
541+
}
542+
else
543+
{
544+
/* case 1 */
545+
region->name = RT_NULL;
541546

542-
continue;
547+
break;
548+
}
543549
}
544550
}
545551
}

0 commit comments

Comments
 (0)