Harden the early allocator

This commit is contained in:
Ruihan Li 2025-03-15 14:39:00 +08:00 committed by Junyang Zhang
parent 14685cce5d
commit 624dcf712a

View File

@ -302,19 +302,22 @@ impl EarlyFrameAllocator {
/// Allocates a contiguous range of frames. /// Allocates a contiguous range of frames.
pub fn alloc(&mut self, layout: Layout) -> Option<Paddr> { pub fn alloc(&mut self, layout: Layout) -> Option<Paddr> {
let size = layout.size().align_up(PAGE_SIZE); let size = layout.size().align_up(PAGE_SIZE);
let allocated = self.under_4g_end.align_up(layout.align()); let align = layout.align().max(PAGE_SIZE);
if allocated + size <= self.under_4g_range.end {
// Allocated below 4G. for (tail, end) in [
self.under_4g_end = allocated + size; (&mut self.under_4g_end, self.under_4g_range.end),
Some(allocated) (&mut self.max_end, self.max_range.end),
} else { ] {
// Try above 4G. let allocated = tail.align_up(align);
let allocated = self.max_end.align_up(layout.align()); if let Some(allocated_end) = allocated.checked_add(size)
if allocated + size <= self.max_range.end { && allocated_end <= end
self.max_end = allocated + size; {
*tail = allocated_end;
return Some(allocated);
} }
Some(allocated)
} }
None
} }
pub(super) fn allocated_regions(&self) -> (Range<Paddr>, Range<Paddr>) { pub(super) fn allocated_regions(&self) -> (Range<Paddr>, Range<Paddr>) {