From bd8ef7964eaed8ee1c56572d962487c723ea4da4 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Fri, 5 Aug 2016 10:37:52 -0700 Subject: [PATCH] UPSTREAM: 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: Ie4dd43afeb8a30fedc4da28ccc6ecce9589d23f3 Signed-off-by: Julius Werner Reviewed-on: https://review.coreboot.org/16075 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin Reviewed-on: https://chromium-review.googlesource.com/368782 Commit-Ready: Furquan Shaikh Tested-by: Furquan Shaikh --- payloads/libpayload/arch/arm64/mmu.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/payloads/libpayload/arch/arm64/mmu.c b/payloads/libpayload/arch/arm64/mmu.c index 50e7f6cd17..d84f969dc6 100644 --- a/payloads/libpayload/arch/arm64/mmu.c +++ b/payloads/libpayload/arch/arm64/mmu.c @@ -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; }