Skip to content

Commit afed685

Browse files
vwaxgregkh
authored andcommitted
of: Fix reserved-memory overlap detection
[ Upstream commit ca05f33 ] The reserved-memory overlap detection code fails to detect overlaps if either of the regions starts at address 0x0. The code explicitly checks for and ignores such regions, apparently in order to ignore dynamically allocated regions which have an address of 0x0 at this point. These dynamically allocated regions also have a size of 0x0 at this point, so fix this by removing the check and sorting the dynamically allocated regions ahead of any static regions at address 0x0. For example, there are two overlaps in this case but they are not currently reported: foo@0 { reg = <0x0 0x2000>; }; bar@0 { reg = <0x0 0x1000>; }; baz@1000 { reg = <0x1000 0x1000>; }; quux { size = <0x1000>; }; but they are after this patch: OF: reserved mem: OVERLAP DETECTED! bar@0 (0x00000000--0x00001000) overlaps with foo@0 (0x00000000--0x00002000) OF: reserved mem: OVERLAP DETECTED! foo@0 (0x00000000--0x00002000) overlaps with baz@1000 (0x00001000--0x00002000) Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com> Link: https://lore.kernel.org/r/ded6fd6b47b58741aabdcc6967f73eca6a3f311e.1603273666.git-series.vincent.whitchurch@axis.com Signed-off-by: Rob Herring <robh@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 61500bf commit afed685

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

drivers/of/of_reserved_mem.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,16 @@ static int __init __rmem_cmp(const void *a, const void *b)
200200
if (ra->base > rb->base)
201201
return 1;
202202

203+
/*
204+
* Put the dynamic allocations (address == 0, size == 0) before static
205+
* allocations at address 0x0 so that overlap detection works
206+
* correctly.
207+
*/
208+
if (ra->size < rb->size)
209+
return -1;
210+
if (ra->size > rb->size)
211+
return 1;
212+
203213
return 0;
204214
}
205215

@@ -217,8 +227,7 @@ static void __init __rmem_check_for_overlap(void)
217227

218228
this = &reserved_mem[i];
219229
next = &reserved_mem[i + 1];
220-
if (!(this->base && next->base))
221-
continue;
230+
222231
if (this->base + this->size > next->base) {
223232
phys_addr_t this_end, next_end;
224233

0 commit comments

Comments
 (0)