diff options
Diffstat (limited to '')
| -rw-r--r-- | rsnix/src/memory.rs | 37 |
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 | } |
