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