30 lines
1.4 KiB
C
30 lines
1.4 KiB
C
#ifndef VMM_H
|
|
#define VMM_H
|
|
|
|
#include "../common/bootinfo.h"
|
|
#include "types.h"
|
|
|
|
#define PTE_PRESENT (1ULL << 0) // 0 -- not present: page fault when trying to access; 1 -- present, can RW
|
|
#define PTE_RW (1ULL << 1) // 0 -- RO: page fault trying to write; 1 -- RW
|
|
#define PTE_USER (1ULL << 2) // 0 -- Ring 0: R3 get segfault gtrying to access; 1 -- Ring 3
|
|
#define PTE_PWT (1ULL << 3) // 1 -- skip L1/L2 cache when writing to RAM
|
|
#define PTE_PCD (1ULL << 4) // 1 -- cache disabled for page
|
|
#define PTE_ACCESSED (1ULL << 5) // CPU sets it (by itself) to 1 when RW this page
|
|
#define PTE_DIRTY (1ULL << 6) // CPU sets it when writing to this page
|
|
#define PTE_NX (1ULL << 63) // No execute
|
|
|
|
|
|
#define PTE_ADDR_MASK 0x000FFFFFFFFFF000 // mask to get clean physical addres that located at bits 12-51
|
|
|
|
#define PTE_GET_ADDR(entry) ((entry) & PTE_ADDR_MASK) // get physical address
|
|
#define PTE_GET_FLAGS(entry) ((entry) & ~PTE_ADDR_MASK) // get flags
|
|
|
|
#define VMM_PT_INDEX(virt) (((virt) >> 12) & 0x1FF) // Table Index (bits 12-20)
|
|
#define VMM_PD_INDEX(virt) (((virt) >> 21) & 0x1FF) // Page Directory Index (bits 21-29)
|
|
#define VMM_PDPT_INDEX(virt) (((virt) >> 30) & 0x1FF) // PDPT Index (bits 30-38)
|
|
#define VMM_PML4_INDEX(virt) (((virt) >> 39) & 0x1FF) // PML4 Index (bits 39-47): main page
|
|
|
|
void vmm_init(Bootinfo* info);
|
|
void vmm_map_page(u64* pml4, u64 phys, u64 virt, u64 flags);
|
|
|
|
#endif |