61#define VMM_KERNEL_BINARY_MAX PML_HIGHER_HALF_END
62#define VMM_KERNEL_BINARY_MIN \
63 PML_INDEX_TO_ADDR(PML_INDEX_AMOUNT - 1, PML4)
65#define VMM_KERNEL_STACKS_MAX VMM_KERNEL_BINARY_MIN
66#define VMM_KERNEL_STACKS_MIN PML_INDEX_TO_ADDR(PML_INDEX_AMOUNT - 3, PML4)
68#define VMM_KERNEL_HEAP_MAX VMM_KERNEL_STACKS_MIN
69#define VMM_KERNEL_HEAP_MIN PML_INDEX_TO_ADDR(PML_INDEX_AMOUNT - 5, PML4)
71#define VMM_IDENTITY_MAPPED_MAX VMM_KERNEL_HEAP_MIN
72#define VMM_IDENTITY_MAPPED_MIN PML_HIGHER_HALF_START
74#define VMM_USER_SPACE_MAX PML_LOWER_HALF_END
75#define VMM_USER_SPACE_MIN (0x400000)
83#define VMM_IS_PAGE_ALIGNED(addr) (((uintptr_t)(addr) & (PAGE_SIZE - 1)) == 0)
102#define VMM_MAX_SHOOTDOWN_REQUESTS 16
uintptr_t phys_addr_t
Physical address type.
size_t pfn_t
Page Frame Number type.
void(* space_callback_func_t)(void *data)
Space callback function.
void * vmm_map_pages(space_t *space, void *virtAddr, pfn_t *pfns, size_t amount, pml_flags_t flags, space_callback_func_t func, void *data)
Maps an array of physical pages to virtual memory in a given address space.
void vmm_tlb_shootdown(space_t *space, void *virtAddr, size_t pageAmount)
Performs a TLB shootdown for a region of the address space, and wait for acknowledgements.
void vmm_init(void)
Initializes the Virtual Memory Manager.
space_t * vmm_kernel_space_get(void)
Retrieves the kernel's address space.
void vmm_load(space_t *space)
Loads a virtual address space.
void * vmm_map(space_t *space, void *virtAddr, phys_addr_t physAddr, size_t length, pml_flags_t flags, space_callback_func_t func, void *data)
Maps physical memory to virtual memory in a given address space.
void vmm_kernel_space_load(void)
Loads the kernel's address space into the current CPU.
void * vmm_alloc(space_t *space, void *virtAddr, size_t length, size_t alignment, pml_flags_t pmlFlags, vmm_alloc_flags_t allocFlags)
Allocates and maps virtual memory in a given address space.
#define VMM_MAX_SHOOTDOWN_REQUESTS
Maximum number of shootdown requests that can be queued per CPU.
void * vmm_unmap(space_t *space, void *virtAddr, size_t length)
Unmaps virtual memory from a given address space.
void * vmm_protect(space_t *space, void *virtAddr, size_t length, pml_flags_t flags)
Changes memory protection flags for a virtual memory region in a given address space.
pml_flags_t vmm_prot_to_flags(prot_t prot)
Converts the user space memory protection flags to page table entry flags.
vmm_alloc_flags_t
Flags for vmm_alloc().
@ VMM_ALLOC_ZERO
If set, atomically zero the allocated pages.
@ VMM_ALLOC_OVERWRITE
If any page is already mapped, overwrite the mapping.
@ VMM_ALLOC_FAIL_IF_MAPPED
If set and any page is already mapped, fail and set errno to EEXIST.
prot_t
Memory protection flags.
static const path_flag_t flags[]
A entry in a doubly linked list.
A simple ticket lock implementation.
A entry in a page table without a specified address or callback ID.
Virtual address space structure.
space_t * space
Will only be accessed by the owner CPU, so no lock.