diff options
Diffstat (limited to '')
| -rw-r--r-- | rsnix/src/memory.rs | 13 |
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`. |
| 1202 | pub fn alloc_pages_above(count: usize, min_addr: usize) -> Option<usize> { | 1202 | pub 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. | ||
| 1209 | pub 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 { |
