|
|
|
#ifndef _VMM_H_
|
|
|
|
#define _VMM_H_
|
|
|
|
|
|
|
|
#include "riscv.h"
|
|
|
|
#include "process.h"
|
|
|
|
|
|
|
|
/* --- utility functions for virtual address mapping --- */
|
|
|
|
int map_pages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm);
|
|
|
|
// permission codes.
|
|
|
|
enum VMPermision {
|
|
|
|
PROT_NONE = 0,
|
|
|
|
PROT_READ = 1,
|
|
|
|
PROT_WRITE = 2,
|
|
|
|
PROT_EXEC = 4,
|
|
|
|
};
|
|
|
|
|
|
|
|
uint64 prot_to_type(int prot, int user);
|
|
|
|
pte_t *page_walk(pagetable_t pagetable, uint64 va, int alloc);
|
|
|
|
uint64 lookup_pa(pagetable_t pagetable, uint64 va);
|
|
|
|
|
|
|
|
/* --- kernel page table --- */
|
|
|
|
// pointer to kernel page directory
|
|
|
|
extern pagetable_t g_kernel_pagetable;
|
|
|
|
|
|
|
|
void kern_vm_map(pagetable_t page_dir, uint64 va, uint64 pa, uint64 sz, int perm);
|
|
|
|
|
|
|
|
// Initialize the kernel pagetable
|
|
|
|
void kern_vm_init(void);
|
|
|
|
|
|
|
|
/* --- user page table --- */
|
|
|
|
void *user_va_to_pa(pagetable_t page_dir, void *va);
|
|
|
|
void user_vm_map(pagetable_t page_dir, uint64 va, uint64 size, uint64 pa, int perm);
|
|
|
|
void user_vm_unmap(pagetable_t page_dir, uint64 va, uint64 size, int free);
|
|
|
|
void print_proc_vmspace(process* proc);
|
|
|
|
|
|
|
|
#endif
|