summaryrefslogtreecommitdiffstats
path: root/rsnix/src/memory.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rsnix/src/memory.rs37
1 files changed, 26 insertions, 11 deletions
diff --git a/rsnix/src/memory.rs b/rsnix/src/memory.rs
index a947c53..605125a 100644
--- a/rsnix/src/memory.rs
+++ b/rsnix/src/memory.rs
@@ -366,18 +366,33 @@ fn init_heap() {
366 if d.kind == MEMORY_TYPE_CONVENTIONAL { 366 if d.kind == MEMORY_TYPE_CONVENTIONAL {
367 let s = d.physical_start as usize; 367 let s = d.physical_start as usize;
368 let e = s + d.number_of_pages as usize * 4096; 368 let e = s + d.number_of_pages as usize * 4096;
369 // Subtract any overlap with the framebuffer region. 369 // Split at the framebuffer hole so the free list NEVER
370 let (cs, ce) = match fb { 370 // contains fb pages: a coarse size subtraction leaves one
371 Some((b, sz)) if e > b && s < b + sz => (s.max(b), e.min(b + sz)), 371 // block *spanning* the hole, letting a large allocation
372 _ => (e, s), // no overlap → empty range 372 // (e.g. the 1.9 MB display shadow) straddle the display.
373 }; 373 let mut lo = s;
374 let mut sz = e - s; 374 if let Some((b, sz)) = fb
375 if ce > cs { 375 && e > b
376 sz -= ce - cs; 376 && s < b + sz
377 {
378 let h0 = b.max(s);
379 let h1 = (b + sz).min(e);
380 if h0 > lo {
381 // Segment before the hole.
382 let seg = h0 - lo;
383 if seg > best_size {
384 best_start = lo;
385 best_size = seg;
386 }
387 }
388 lo = h1;
377 } 389 }
378 if sz > best_size { 390 if e > lo {
379 best_start = s; 391 let seg = e - lo;
380 best_size = sz; 392 if seg > best_size {
393 best_start = lo;
394 best_size = seg;
395 }
381 } 396 }
382 } 397 }
383 } 398 }