libpayload: arm64: Fix MMU range overlap check

The ARM64 MMU code maintains a list of used ranges, to avoid mapping the
DMA buffer over the coreboot tables and things like that. Unfortunately,
the overlap with ranges in that list is checked with

 (start1 >= start2 && start1 <= end2) || (end1 >= start2 && end1 <= end2)

which is not a full overlap check and misses the case where the second
region is completely contained within the first. This patch replaces
that code with a properly vetted primitive from Stack Overflow.

BRANCH=none
BUG=chrome-os-partner:54416
TEST=Observe how Kevin recovery screen now gets drawn at 10x the speed.

Change-Id: I7e2706426762794e160d743bbfc40da1e26eee12
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/16075
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Julius Werner 2016-08-05 10:37:52 -07:00 committed by Martin Roth
parent 98c65c1b01
commit 41ddd4fcc1
1 changed files with 1 additions and 2 deletions

View File

@ -441,8 +441,7 @@ static int mmu_is_range_free(uint64_t r_base,
uint64_t start = r[i].base;
uint64_t end = start + r[i].size;
if (((r_base >= start) && (r_base <= end)) ||
((r_end >= start) && (r_end <= end)))
if ((start < r_end) && (end > r_base))
return 0;
}