BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / blob / master / include / nucleus / memory.h

// Related

Nucleus

Barry Kernel threads + threads share address space 6217f0d (3 years, 1 month ago)
#ifndef _NUCLEUS_MEMORY_H
#define _NUCLEUS_MEMORY_H

#include <stddef.h>
#include <stdint.h>
#include <sys/mman.h>
#include <nucleus/object.h>
#include <nucleus/types.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),
};

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