summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliYangYang <[email protected]>2024-04-27 18:25:42 +0800
committerGitHub <[email protected]>2024-04-27 18:25:42 +0800
commitd30c8b340ef6ee245f28873f88fe18248d1656d4 (patch)
tree36f31c1df618cf9414a900d174ad8603dee4b9c9
parent946dd264edb98476df211809bc5838d9783a5a5a (diff)
[drivers][ofw] Fixed fdt_scan_memory() memory adjustment bug (#8853)
* Fixed fdt memory adjustment bug * Modify the memory adjustment logic
-rw-r--r--components/drivers/ofw/fdt.c84
1 files changed, 45 insertions, 39 deletions
diff --git a/components/drivers/ofw/fdt.c b/components/drivers/ofw/fdt.c
index 9f65436d7d..d0a1415b94 100644
--- a/components/drivers/ofw/fdt.c
+++ b/components/drivers/ofw/fdt.c
@@ -476,6 +476,19 @@ static rt_err_t fdt_scan_memory(void)
}
/*
+ * +--------+ +--------+
+ * | memory | | memory |
+ * +--------+ +----------+ +----------+ +--------+
+ * | reserved | | reserved |
+ * +----------+ +----------+
+ */
+ if (res_region->start >= region->end || res_region->end <= region->start)
+ {
+ /* No adjustments needed */
+ continue;
+ }
+
+ /*
* case 0: case 1:
* +------------------+ +----------+
* | memory | | memory |
@@ -490,56 +503,49 @@ static rt_err_t fdt_scan_memory(void)
* | reserved | | reserved |
* +----------+ +----------+
*/
-
- /* case 0 */
- if (res_region->start >= region->start && res_region->end <= region->end)
+ if (res_region->start > region->start)
{
- rt_size_t new_size = region->end - res_region->end;
+ if (res_region->end < region->end)
+ {
+ /* case 0 */
+ rt_size_t new_size = region->end - res_region->end;
- region->end = res_region->start;
+ region->end = res_region->start;
- /* Commit part next block */
- if (new_size)
- {
+ /* Commit part next block */
err = commit_memregion(region->name, res_region->end, new_size, RT_FALSE);
- }
- if (!err)
- {
- ++no;
+ if (!err)
+ {
+ ++no;
- /* Scan again */
- region = &_memregion[0];
- --region;
+ /* Scan again */
+ region = &_memregion[0];
+ --region;
- break;
+ break;
+ }
+ }
+ else
+ {
+ /* case 2 */
+ region->end = res_region->start;
}
-
- continue;
- }
-
- /* case 1 */
- if (res_region->start <= region->start && res_region->end >= region->end)
- {
- region->name = RT_NULL;
-
- break;
- }
-
- /* case 2 */
- if (res_region->start <= region->end && res_region->end >= region->end)
- {
- region->end = res_region->start;
-
- continue;
}
-
- /* case 3 */
- if (res_region->start <= region->start && res_region->end >= region->start)
+ else
{
- region->start = res_region->end;
+ if (res_region->end < region->end)
+ {
+ /* case 3 */
+ region->start = res_region->end;
+ }
+ else
+ {
+ /* case 1 */
+ region->name = RT_NULL;
- continue;
+ break;
+ }
}
}
}