#ifndef _NUCLEUS_MEMORY_H #define _NUCLEUS_MEMORY_H #include #include #include #include #include #define PAGE_SIZE 0x1000 #define PAGE_ADDR(pg) ((pg) & 0xFFFFF000) #define PAGE_ATTR(pg) ((pg) & 0x00000FFF) typedef uint32_t page_t; typedef uint32_t page_table_t; typedef uint32_t page_dir_t; /* Page Table Entry flags */ enum PTEFlag { PTE_PRESENT = (1 << 0), PTE_WRITE = (1 << 1), PTE_USER = (1 << 2), PTE_THROUGH = (1 << 3), PTE_NOCACHE = (1 << 4), PTE_ACCESS = (1 << 5), PTE_DIRTY = (1 << 6), PTE_GLOBAL = (1 << 8), }; /* Page Directory Entry flags */ enum PDEFlag { PDE_PRESENT = (1 << 0), PDE_WRITE = (1 << 1), PDE_USER = (1 << 2), PDE_THROUGH = (1 << 3), PDE_NOCACHE = (1 << 4), PDE_ACCESS = (1 << 5), }; extern ObjectType pageType; extern ObjectType virtualMemoryType; extern ObjectType vmRegionType; /* Flush Translation Lookaside Buffer */ static inline void flush_tlb(uintptr_t addr) { asm volatile("invlpg (%0)" :: "r" (addr) : "memory"); } uintptr_t alloc_frame(void); void free_frame(uintptr_t frame); void init_frames(size_t memMapSize, void *memMap); page_t get_page(uintptr_t vaddr); void set_page(uintptr_t vaddr, page_t page); page_dir_t clone_dir(void); void init_paging(void); void cpu_load_paging(void); Page *create_page(ObjectList *cache, page_t frame, off_t offset); Page *find_page(ObjectList *cache, off_t offset); void install_page(uintptr_t addr, Page *page, int prot); void *map_page(Page *page); int verify_access(const void *addr, size_t len, int prot); void switch_to_mm(VirtualMemory *vm); #endif