Skip to content

Commit 58dd98f

Browse files
can compile
1 parent 9663436 commit 58dd98f

7 files changed

Lines changed: 28 additions & 13 deletions

File tree

kernel/src/allocator/buddy/heap.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl BuddyAllocatorCore {
111111
let page = &mut *self.pages.add(pfn);
112112
page.flags.insert(PageFlags::FREE);
113113
page.order = order as u8;
114-
self.free_lists[order].push(page);
114+
unsafe { self.free_lists[order].push(page); }
115115

116116
pfn += 1 << order;
117117
}
@@ -134,7 +134,10 @@ impl BuddyAllocatorCore {
134134
}
135135

136136
for o in search_order..=MAX_ORDER {
137-
let page_ptr = self.free_lists[o].pop()?;
137+
let page_ptr = match unsafe { self.free_lists[o].pop() } {
138+
Some(p) => p,
139+
None => continue,
140+
};
138141
let mut current_order = o;
139142

140143
while current_order > order {
@@ -143,7 +146,7 @@ impl BuddyAllocatorCore {
143146
let buddy = unsafe { &mut *self.page_at_mut(buddy_pfn) };
144147
buddy.flags.insert(PageFlags::FREE);
145148
buddy.order = current_order as u8;
146-
self.free_lists[current_order].push(buddy);
149+
unsafe { self.free_lists[current_order].push(buddy); }
147150
}
148151

149152
let page = unsafe { &mut *page_ptr };
@@ -202,7 +205,8 @@ impl BuddyAllocatorCore {
202205
self.base_addr + (pfn << PAGE_SHIFT)
203206
}
204207

205-
fn page_at_mut(&mut self, pfn: usize) -> *mut Page {
208+
/// Get a mutable pointer to the `Page` descriptor for `pfn`.
209+
pub(crate) fn page_at_mut(&mut self, pfn: usize) -> *mut Page {
206210
debug_assert!(pfn < self.total_pages);
207211
unsafe { self.pages.add(pfn) }
208212
}
@@ -215,7 +219,8 @@ impl BuddyAllocatorCore {
215219
let mut node = self.free_lists[order].peek();
216220
while let Some(ptr) = node {
217221
count += 1;
218-
node = unsafe { (*ptr).list.next };
222+
let next = unsafe { (*ptr).list.next };
223+
node = if next.is_null() { None } else { Some(next) };
219224
}
220225
free_pages += count * (1 << order);
221226
}

kernel/src/allocator/buddy/page.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ impl Page {
9191
///
9292
/// Uses the `list` field embedded in each `Page` for linkage.
9393
/// No heap allocations — all nodes are `Page` structs in the mem_map array.
94+
#[derive(Clone, Copy)]
9495
pub struct LinkedList {
9596
head: *mut Page,
9697
}

kernel/src/allocator/buddy/tests.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use super::heap::{order_of_size, BuddyAllocatorCore, BuddyMemoryInfo};
2222
use super::page::{PageFlags, MAX_ORDER, PAGE_SIZE};
2323
use core::sync::atomic::Ordering;
24+
use alloc::vec::Vec;
2425

2526
// 16 MiB test memory region — adjust based on test harness.
2627
const TEST_MEM_SIZE: usize = 16 * 1024 * 1024;
@@ -145,12 +146,14 @@ mod basic_tests {
145146

146147
// Free one and try again
147148
let pfn = allocated.pop().unwrap();
148-
unsafe { core.free_pages(&mut *core.page_at_mut(pfn), 0) };
149+
let page = unsafe { &mut *core.page_at_mut(pfn) };
150+
unsafe { core.free_pages(page, 0) };
149151
assert!(core.alloc_pages(0).is_some());
150152

151153
// Clean up remaining allocations
152154
for pfn in allocated {
153-
unsafe { core.free_pages(&mut *core.page_at_mut(pfn), 0) };
155+
let page = unsafe { &mut *core.page_at_mut(pfn) };
156+
unsafe { core.free_pages(page, 0) };
154157
}
155158
}
156159
}
@@ -298,7 +301,8 @@ mod aligned_tests {
298301

299302
// Free all
300303
for pfn in allocated {
301-
unsafe { core.free_pages(&mut *core.page_at_mut(pfn), 1) };
304+
let page = unsafe { &mut *core.page_at_mut(pfn) };
305+
unsafe { core.free_pages(page, 1) };
302306
}
303307

304308
let after = core.memory_info().free_pages;
@@ -408,7 +412,8 @@ mod stress_tests {
408412

409413
// Free in reverse order
410414
for (pfn, order) in allocated.into_iter().rev() {
411-
unsafe { core.free_pages(&mut *core.page_at_mut(pfn), order) };
415+
let page = unsafe { &mut *core.page_at_mut(pfn) };
416+
unsafe { core.free_pages(page, order) };
412417
}
413418

414419
let after = core.memory_info().free_pages;

kernel/src/boards/qemu_riscv32/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
// Copyright (c) 2024 - present Microsoft Corporation
2020
// SPDX-License-Identifier: MIT
2121

22-
mod config;
22+
pub mod config;
23+
pub use config::{DRAM_BASE, DRAM_SIZE};
2324
use crate::{
2425
arch,
2526
arch::riscv::{local_irq_enabled, trap_entry, Context},

kernel/src/boards/qemu_riscv64/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
// Copyright (c) 2024 - present Microsoft Corporation
2020
// SPDX-License-Identifier: MIT
2121

22-
mod config;
22+
pub mod config;
23+
pub use config::{DRAM_BASE, DRAM_SIZE};
2324
use crate::{
2425
arch,
2526
arch::riscv::{local_irq_enabled, trap_entry, Context},

kernel/src/boards/qemu_virt64_aarch64/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
pub mod init;
1616
pub use init::*;
17-
mod config;
17+
pub mod config;
18+
pub use config::{DRAM_BASE, DRAM_SIZE};
1819
pub(crate) use config::{MMU_L1_DEVICE_BASES, MMU_L1_NORMAL_BASES};
1920
pub type ClockImpl = crate::devices::clock::gic_generic_timer::QemuGtClk;

kernel/src/boards/rk3568/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
mod config;
15+
pub mod config;
16+
pub use config::{DRAM_BASE, DRAM_SIZE};
1617
use crate::{arch, error::Error, sync::SpinLock, time};
1718
use blueos_driver::uart::ns16x50::Ns16x50Isr;
1819
use blueos_kconfig::CONFIG_NUM_CORES;

0 commit comments

Comments
 (0)