diff options
| author | liYangYang <[email protected]> | 2024-04-27 18:25:42 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-04-27 18:25:42 +0800 |
| commit | d30c8b340ef6ee245f28873f88fe18248d1656d4 (patch) | |
| tree | 36f31c1df618cf9414a900d174ad8603dee4b9c9 /components/drivers | |
| parent | 946dd264edb98476df211809bc5838d9783a5a5a (diff) | |
[drivers][ofw] Fixed fdt_scan_memory() memory adjustment bug (#8853)
* Fixed fdt memory adjustment bug
* Modify the memory adjustment logic
Diffstat (limited to 'components/drivers')
| -rw-r--r-- | components/drivers/ofw/fdt.c | 84 |
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; + } } } } |
