x86: improve lb_cleanup_memory_ranges
There are 2 issues in lb_cleanup_memory_ranges(). The first is that during sort there is a neighbor comparison that initially starts with the current entry. The second issue is that merging has an off by one comparison for adjacent entries. Before: coreboot memory table: 0. 0000000000000000-0000000000000fff: CONFIGURATION TABLES 1. 0000000000001000-000000000009ffff: RAM 2. 00000000000a0000-00000000000fffff: RESERVED 3. 0000000000100000-0000000000efffff: RAM 4. 0000000000f00000-0000000000ffffff: RESERVED 5. 0000000001000000-00000000acebffff: RAM 6. 00000000acec0000-00000000acffffff: CONFIGURATION TABLES 7. 00000000ad000000-00000000af9fffff: RESERVED 8. 00000000f0000000-00000000f3ffffff: RESERVED 9. 00000000fed10000-00000000fed17fff: RESERVED 10. 00000000fed18000-00000000fed18fff: RESERVED 11. 00000000fed19000-00000000fed19fff: RESERVED 12. 00000000fed84000-00000000fed84fff: RESERVED 13. 0000000100000000-000000018f5fffff: RAM After: coreboot memory table: 0. 0000000000000000-0000000000000fff: CONFIGURATION TABLES 1. 0000000000001000-000000000009ffff: RAM 2. 00000000000a0000-00000000000fffff: RESERVED 3. 0000000000100000-0000000000efffff: RAM 4. 0000000000f00000-0000000000ffffff: RESERVED 5. 0000000001000000-00000000acebffff: RAM 6. 00000000acec0000-00000000acffffff: CONFIGURATION TABLES 7. 00000000ad000000-00000000af9fffff: RESERVED 8. 00000000f0000000-00000000f3ffffff: RESERVED 9. 00000000fed10000-00000000fed19fff: RESERVED 10. 00000000fed84000-00000000fed84fff: RESERVED 11. 0000000100000000-000000018f5fffff: RAM Change-Id: I656aab61b0ed4711c9dceaedb81c290d040ffdec Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/2671 Tested-by: build bot (Jenkins) Reviewed-by: Marc Jones <marc.jones@se-eng.com> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
parent
0160d76152
commit
f7fa218359
|
@ -414,7 +414,7 @@ static void lb_cleanup_memory_ranges(struct lb_memory *mem)
|
||||||
/* Sort the lb memory ranges */
|
/* Sort the lb memory ranges */
|
||||||
for(i = 0; i < entries; i++) {
|
for(i = 0; i < entries; i++) {
|
||||||
uint64_t entry_start = unpack_lb64(mem->map[i].start);
|
uint64_t entry_start = unpack_lb64(mem->map[i].start);
|
||||||
for(j = i; j < entries; j++) {
|
for(j = i + 1; j < entries; j++) {
|
||||||
uint64_t temp_start = unpack_lb64(mem->map[j].start);
|
uint64_t temp_start = unpack_lb64(mem->map[j].start);
|
||||||
if (temp_start < entry_start) {
|
if (temp_start < entry_start) {
|
||||||
struct lb_memory_range tmp;
|
struct lb_memory_range tmp;
|
||||||
|
@ -435,7 +435,7 @@ static void lb_cleanup_memory_ranges(struct lb_memory *mem)
|
||||||
end = start + unpack_lb64(mem->map[i].size);
|
end = start + unpack_lb64(mem->map[i].size);
|
||||||
nstart = unpack_lb64(mem->map[i + 1].start);
|
nstart = unpack_lb64(mem->map[i + 1].start);
|
||||||
nend = nstart + unpack_lb64(mem->map[i + 1].size);
|
nend = nstart + unpack_lb64(mem->map[i + 1].size);
|
||||||
if ((start <= nstart) && (end > nstart)) {
|
if ((start <= nstart) && (end >= nstart)) {
|
||||||
if (start > nstart) {
|
if (start > nstart) {
|
||||||
start = nstart;
|
start = nstart;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue