1 2 #ifndef __PMAP_H__ 3 #define __PMAP_H__ 4 5 #include <machine/amd64.h> 6 7 /* 8 * +----------------------+ 9 * | Zero Page (Unmapped) | 10 * +----------------------+ 0x00000000_00000100 User Space Start 11 * | | 12 * | User Space | 13 * . 14 * . 15 * . 16 * | | 17 * +----------------------+ 0x00008000_00000000 User Space End 18 * | | 19 * | Non-canonical | 20 * . 21 * . 22 * . 23 * | | 24 * +----------------------+ 0xFFFF8000_00000000 Direct Map 25 * | Direct Map | 26 * +----------------------+ 0xFFFF8100_00000000 XMap Start 27 * | XMap | 28 * +----------------------+ 0xFFFF8120_00000000 XMap Top 29 * 30 * 31 */ 32 #define MEM_USERSPACE_BASE 0x0000000000000000ULL 33 #define MEM_USERSPACE_LEN 0x0000800000000000ULL 34 #define MEM_USERSPACE_TOP (MEM_USERSPACE_BASE + MEM_USERSPACE_LEN) 35 36 #define MEM_USERSPACE_STKBASE 0x0000000070000000ULL 37 #define MEM_USERSPACE_STKLEN 0x0000000000010000ULL 38 #define MEM_USERSPACE_STKTOP (MEM_USERSPACE_STKBASE + MEM_USERSPACE_STKLEN) 39 40 #define MEM_DIRECTMAP_BASE 0xFFFF800000000000ULL 41 #define MEM_DIRECTMAP_LEN 0x0000010000000000ULL 42 #define MEM_XMAP_BASE 0xFFFF810000000000ULL 43 #define MEM_XMAP_LEN 0x0000002000000000ULL 44 45 #define PPN2DMVA(ppn) (((ppn) << PGSIZE) + MEM_DIRECTMAP_BASE) 46 #define DMVA2PPN(dmva) (((dmva) - MEM_DIRECTMAP_BASE) >> PGSIZE) 47 #define DMVA2PA(dmva) ((dmva) - MEM_DIRECTMAP_BASE) 48 #define DMPA2VA(pa) ((pa) + MEM_DIRECTMAP_BASE) 49 #define VA2PA(va) PMap_Translate(PMap_CurrentAS(), va) 50 51 typedef struct AS 52 { 53 PageTable *root; 54 uint64_t tables; 55 uint64_t mappings; 56 } AS; 57 58 void PMap_Init(); 59 void PMap_InitAP(); 60 61 AS* PMap_NewAS(); 62 void PMap_DestroyAS(AS *space); 63 AS* PMap_CurrentAS(); 64 void PMap_LoadAS(AS *space); 65 void PMap_Dump(AS *space); 66 67 uintptr_t PMap_Translate(AS *space, uintptr_t va); 68 69 // Manipulate User Memory 70 bool PMap_Map(AS *as, uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags); 71 bool PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags); 72 bool PMap_Unmap(AS *as, uint64_t virt, uint64_t pages); 73 74 // Manipulate Kernel Memory 75 void PMap_SystemLookup(uint64_t va, PageEntry **entry, int size); 76 bool PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags); 77 bool PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags); 78 bool PMap_SystemUnmap(uint64_t virt, uint64_t pages); 79 80 #endif /* __PMAP_H__ */ 81 82