#include "api/syscall.h" #ifndef _JOVE_x86_64_HAL_PAGING_H #define _JOVE_x86_64_HAL_PAGING_H 1 #include "jove.h" #include typedef union page_table_entry { struct { uint8_t p : 1; uint8_t rw : 1; uint8_t u : 1; uint8_t pwt : 1; uint8_t pcd : 1; uint8_t a : 1; uint8_t d : 1; uint8_t ps : 1; uint8_t g : 1; uint8_t ign_0 : 2; uint8_t r : 1; uint64_t paddr : 35; uint8_t ign_1 : 4; uint8_t pkey : 4; uint8_t xd : 1; }; uint64_t value; } PACKED page_t; #define PAGE_PRESENT 0b1 #define PAGE_WRITEABLE 0b10 #define PAGE_USER 0b100 #define PAGE_WRITETHROUGH 0b1000 #define PAGE_CACHEDISABLE 0b10000 #define PAGE_ACCESSED 0b100000 #define PAGE_DIRTY 0b1000000 #define PAGE_PS 0b10000000 #define PAGE_GLOBAL 0b000000000 #define PAGE_XD (0ULL << 63) extern void *_kernel_physptr; #define PMLI_SHL(l) (12 + (l * 9)) #define PMLI_MASK(l) (~0xFFFFULL << PMLI_SHL(l)) #define PML4I(v) (((v) >> 39) & 0x1FF) #define PML3I(v) (((v) >> 30) & 0x1FF) #define PML2I(v) (((v) >> 21) & 0x1FF) #define PML1I(v) (((v) >> 12) & 0x1FF) #define IDENT_VIRT_BASE 0xFFFF800000000000ULL #define KERNEL_VIRT_BASE 0xFFFFFFFF80000000ULL #define KPTR_TOPHYS(v) (((uintptr_t)v) - KERNEL_VIRT_BASE + (uintptr_t)_kernel_physptr) int pagedir_map_frame(page_t *pml4, uintptr_t pptr, uintptr_t vptr, uintmax_t flags); int pagedir_map_table(page_t *pml4, uintptr_t pptr, uintptr_t vptr); uintptr_t paging_get_pml4(void); void paging_pml4_init(void); #endif