summaryrefslogtreecommitdiffstats
path: root/rsnix/src/memory.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rsnix/src/memory.rs13
1 files changed, 11 insertions, 2 deletions
diff --git a/rsnix/src/memory.rs b/rsnix/src/memory.rs
index 2a32da8..0bac169 100644
--- a/rsnix/src/memory.rs
+++ b/rsnix/src/memory.rs
@@ -1200,6 +1200,13 @@ pub fn alloc_pages(count: usize) -> Option<usize> {
1200/// chipsets is hostile to PCI masters and shows up as a controller 1200/// chipsets is hostile to PCI masters and shows up as a controller
1201/// "System Error" (SE) halt. Page-aligned like `alloc_pages`. 1201/// "System Error" (SE) halt. Page-aligned like `alloc_pages`.
1202pub fn alloc_pages_above(count: usize, min_addr: usize) -> Option<usize> { 1202pub fn alloc_pages_above(count: usize, min_addr: usize) -> Option<usize> {
1203 alloc_pages_range(count, min_addr, usize::MAX)
1204}
1205
1206/// Allocate `count` contiguous physical pages inside `[min_addr, max_addr)`.
1207/// The upper bound matters for 32-bit DMA engines (EHCI): a buffer above
1208/// 4 GiB is unreachable even though the kernel can address it.
1209pub fn alloc_pages_range(count: usize, min_addr: usize, max_addr: usize) -> Option<usize> {
1203 if count == 0 { 1210 if count == 0 {
1204 return None; 1211 return None;
1205 } 1212 }
@@ -1209,13 +1216,15 @@ pub fn alloc_pages_above(count: usize, min_addr: usize) -> Option<usize> {
1209 } 1216 }
1210 let span = SPAN_PAGES; 1217 let span = SPAN_PAGES;
1211 let min_page = min_addr.div_ceil(PAGE_SIZE).max(BASE_PAGE); 1218 let min_page = min_addr.div_ceil(PAGE_SIZE).max(BASE_PAGE);
1212 if min_page >= BASE_PAGE + span { 1219 let max_page = (max_addr / PAGE_SIZE).min(BASE_PAGE + span);
1220 if min_page >= max_page {
1213 return None; 1221 return None;
1214 } 1222 }
1215 let start_idx = min_page - BASE_PAGE; 1223 let start_idx = min_page - BASE_PAGE;
1224 let end_idx = max_page - BASE_PAGE;
1216 let mut run_start = 0usize; 1225 let mut run_start = 0usize;
1217 let mut run_len = 0usize; 1226 let mut run_len = 0usize;
1218 for idx in start_idx..span { 1227 for idx in start_idx..end_idx {
1219 let free = (*BITMAP.add(idx / 8) >> (idx % 8)) & 1 == 0; 1228 let free = (*BITMAP.add(idx / 8) >> (idx % 8)) & 1 == 0;
1220 if free { 1229 if free {
1221 if run_len == 0 { 1230 if run_len == 0 {