36 lines
1,006 B
Rust
36 lines
1,006 B
Rust
use crate::syscall;
|
|
use crate::SELF_VMAS_CAP;
|
|
use linked_list_allocator::LockedHeap;
|
|
|
|
#[global_allocator]
|
|
static ALLOCATOR: LockedHeap = LockedHeap::empty();
|
|
|
|
pub static mut CAN_ALLOC: bool = false;
|
|
|
|
pub fn init_heap() {
|
|
// 1 MiB
|
|
let size = 0x10_0000;
|
|
let mut vmmo_cap = 0;
|
|
let obj_req = syscall::ZMemoryObjectCreateReq {
|
|
size,
|
|
vmmo_cap: &mut vmmo_cap as *mut u64,
|
|
};
|
|
syscall::syscall(syscall::kZionMemoryObjectCreate, &obj_req)
|
|
.expect("Failed to create memory object");
|
|
|
|
unsafe {
|
|
let mut vaddr: u64 = 0;
|
|
let vmas_req = syscall::ZAddressSpaceMapReq {
|
|
vmmo_cap,
|
|
vmas_cap: SELF_VMAS_CAP,
|
|
align: 0x2000,
|
|
vaddr: &mut vaddr as *mut u64,
|
|
vmas_offset: 0,
|
|
};
|
|
|
|
syscall::syscall(syscall::kZionAddressSpaceMap, &vmas_req)
|
|
.expect("Failed to map memory object");
|
|
ALLOCATOR.lock().init(vaddr as *mut u8, size as usize);
|
|
CAN_ALLOC = true;
|
|
}
|
|
}
|