| #ifndef VM_H |
| #define VM_H |
| |
| #include "processor.h" |
| |
| #define PAGE_SIZE 4096ul |
| #ifdef __x86_64__ |
| #define LARGE_PAGE_SIZE (512 * PAGE_SIZE) |
| #else |
| #define LARGE_PAGE_SIZE (1024 * PAGE_SIZE) |
| #endif |
| |
| #define PTE_PRESENT (1ull << 0) |
| #define PTE_PSE (1ull << 7) |
| #define PTE_WRITE (1ull << 1) |
| #define PTE_USER (1ull << 2) |
| #define PTE_ADDR (0xffffffffff000ull) |
| |
| void setup_vm(); |
| |
| void *vmalloc(unsigned long size); |
| void vfree(void *mem); |
| void *vmap(unsigned long long phys, unsigned long size); |
| void *alloc_vpage(void); |
| void *alloc_vpages(ulong nr); |
| uint64_t virt_to_phys_cr3(void *mem); |
| |
| unsigned long *get_pte(unsigned long *cr3, void *virt); |
| unsigned long *install_pte(unsigned long *cr3, |
| int pte_level, |
| void *virt, |
| unsigned long pte, |
| unsigned long *pt_page); |
| |
| void *alloc_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); |
| |
| static inline unsigned long virt_to_phys(const void *virt) |
| { |
| return (unsigned long)virt; |
| } |
| |
| static inline void *phys_to_virt(unsigned long phys) |
| { |
| return (void *)phys; |
| } |
| |
| #endif |