Files
CervusOS/kernel/include/memory/paging.h
T
alexvoste 1a9fd27a31 push
2026-05-07 02:22:25 +03:00

44 lines
1.9 KiB
C

#ifndef PAGING_H
#define PAGING_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "vmm.h"
#include "../include/interrupts/interrupts.h"
#define PAGING_PRESENT VMM_PRESENT
#define PAGING_WRITE VMM_WRITE
#define PAGING_USER VMM_USER
#define PAGING_NOEXEC VMM_NOEXEC
#define PAGING_KERNEL (PAGING_PRESENT | PAGING_WRITE)
#define PAGING_USER_RW (PAGING_PRESENT | PAGING_WRITE | PAGING_USER)
#define PAGING_USER_RO (PAGING_PRESENT | PAGING_USER)
#define PAGING_USER_NOEXEC (PAGING_PRESENT | PAGING_USER | PAGING_NOEXEC)
#define PAGING_LARGE_PAGE_SIZE 0x200000
#define PAGING_HUGE_PAGE_SIZE 0x40000000
typedef struct {
uintptr_t virtual_start;
uintptr_t virtual_end;
uintptr_t physical_start;
uint64_t flags;
size_t page_count;
bool allocated;
} paging_region_t;
void paging_init(void);
bool paging_map_range(vmm_pagemap_t* pagemap, uintptr_t virt_start, uintptr_t phys_start, size_t page_count, uint64_t flags);
bool paging_unmap_range(vmm_pagemap_t* pagemap, uintptr_t virt_start, size_t page_count);
bool paging_change_flags(vmm_pagemap_t* pagemap, uintptr_t virt_start, size_t page_count, uint64_t new_flags);
paging_region_t* paging_create_region(vmm_pagemap_t* pagemap, uintptr_t virt_start, size_t size, uint64_t flags);
bool paging_destroy_region(vmm_pagemap_t* pagemap, paging_region_t* region);
void* paging_alloc_pages(vmm_pagemap_t* pagemap, size_t page_count, uint64_t flags, uintptr_t preferred_virt);
void paging_free_pages(vmm_pagemap_t* pagemap, void* virt_addr, size_t page_count);
bool paging_reserve_range(vmm_pagemap_t* pagemap, uintptr_t virt_start, uintptr_t virt_end);
bool paging_is_range_free(vmm_pagemap_t* pagemap, uintptr_t virt_start, uintptr_t virt_end);
void paging_print_stats(vmm_pagemap_t* pagemap);
void paging_dump_range(vmm_pagemap_t* pagemap, uintptr_t virt_start, uintptr_t virt_end);
#endif