strat9_kernel/memory/
mod.rs1pub mod address_space;
4pub mod boot_alloc;
5pub mod buddy;
6pub mod cow;
7pub mod frame;
8pub mod heap;
9pub mod paging;
10pub mod userslice;
11pub mod zone;
12
13use crate::{boot::entry::MemoryRegion, sync::IrqDisabledToken};
14use core::sync::atomic::{AtomicU64, Ordering};
15
16static HHDM_OFFSET: AtomicU64 = AtomicU64::new(0);
20
21pub fn set_hhdm_offset(offset: u64) {
23 HHDM_OFFSET.store(offset, Ordering::Relaxed);
24}
25
26pub fn hhdm_offset() -> u64 {
28 HHDM_OFFSET.load(Ordering::Relaxed)
29}
30
31#[inline]
33pub fn phys_to_virt(phys: u64) -> u64 {
34 phys.wrapping_add(HHDM_OFFSET.load(Ordering::Relaxed))
35}
36
37#[inline]
39pub fn virt_to_phys(virt: u64) -> u64 {
40 virt.wrapping_sub(HHDM_OFFSET.load(Ordering::Relaxed))
41}
42
43pub fn init_memory_manager(memory_regions: &[MemoryRegion]) {
45 buddy::init_buddy_allocator(memory_regions);
46}
47
48pub fn init_cow_subsystem(_memory_regions: &[MemoryRegion]) {}
50
51pub use address_space::{kernel_address_space, AddressSpace, VmaFlags, VmaPageSize, VmaType};
53pub use buddy::get_allocator;
54pub use frame::{AllocError, FrameAllocator, PhysFrame};
55pub use userslice::{UserSliceError, UserSliceRead, UserSliceReadWrite, UserSliceWrite};
56pub use crate::sync::with_irqs_disabled;
57
58#[inline]
63pub fn allocate_frames(token: &IrqDisabledToken, order: u8) -> Result<PhysFrame, AllocError> {
64 buddy::alloc(token, order)
65}
66
67#[inline]
71pub fn free_frames(token: &IrqDisabledToken, frame: PhysFrame, order: u8) {
72 buddy::free(token, frame, order);
73}
74
75#[inline]
77pub fn allocate_frame(token: &IrqDisabledToken) -> Result<PhysFrame, AllocError> {
78 allocate_frames(token, 0)
79}
80
81#[inline]
83pub fn free_frame(token: &IrqDisabledToken, frame: PhysFrame) {
84 free_frames(token, frame, 0);
85}
86
87pub fn allocate_dma_frame() -> Option<PhysFrame> {
91 with_irqs_disabled(|token| {
92 let frame = allocate_frame(token).ok()?;
93 let virt = phys_to_virt(frame.start_address.as_u64()) as *mut u8;
95 unsafe {
97 core::ptr::write_bytes(virt, 0, 4096);
98 }
99 Some(frame)
100 })
101}
102
103