blob: 4a7888b6b1e32dc10d1fe4cab65052f63f2dcd5e [file] [log] [blame]
#ifndef VM_H
#define VM_H
#include "processor.h"
#include "asm/page.h"
#include "asm/io.h"
void setup_vm();
void setup_5level_page_table();
void *vmalloc(unsigned long size);
void vfree(void *mem);
void *vmap(unsigned long long phys, unsigned long size);
uint64_t virt_to_phys_cr3(void *mem);
struct pte_search {
int level;
unsigned long *pte;
};
static inline bool found_huge_pte(struct pte_search search)
{
return (search.level == 2 || search.level == 3) &&
(*search.pte & PT_PRESENT_MASK) &&
(*search.pte & PT_PAGE_SIZE_MASK);
}
static inline bool found_leaf_pte(struct pte_search search)
{
return search.level == 1 || found_huge_pte(search);
}
struct pte_search find_pte_level(unsigned long *cr3, void *virt,
int lowest_level);
unsigned long *get_pte(unsigned long *cr3, void *virt);
unsigned long *get_pte_level(unsigned long *cr3, void *virt, int pte_level);
unsigned long *install_pte(unsigned long *cr3,
int pte_level,
void *virt,
unsigned long pte,
unsigned long *pt_page);
unsigned long *install_large_page(unsigned long *cr3,unsigned long phys,
void *virt);
unsigned long *install_page(unsigned long *cr3, unsigned long phys, void *virt);
void install_pages(unsigned long *cr3, unsigned long phys, unsigned long len,
void *virt);
bool any_present_pages(unsigned long *cr3, void *virt, unsigned long len);
static inline void *current_page_table(void)
{
return phys_to_virt(read_cr3());
}
#endif