Nucleus
Barry Enable paging on all processors 4021434 (3 years, 3 months ago)
#ifndef _NUCLEUS_MEMORY_H
#define _NUCLEUS_MEMORY_H
#include <stdint.h>
#include <stddef.h>
#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),
};
/* 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);
void set_page(uintptr_t vaddr, page_t page);
page_dir_t clone_dir(void);
void init_paging(void);
void cpu_load_paging(void);
void *kmalloc(size_t size);
void kfree(void *addr);
#endif