CS350 COS
COS
Loading...
Searching...
No Matches
pmap.h
Go to the documentation of this file.
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
51typedef struct AS
52{
57
58void PMap_Init();
59void PMap_InitAP();
60
61AS* PMap_NewAS();
62void PMap_DestroyAS(AS *space);
64void PMap_LoadAS(AS *space);
65void PMap_Dump(AS *space);
66
68
69// Manipulate User Memory
70bool PMap_Map(AS *as, uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags);
71bool PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags);
72bool PMap_Unmap(AS *as, uint64_t virt, uint64_t pages);
73
74// Manipulate Kernel Memory
75void PMap_SystemLookup(uint64_t va, PageEntry **entry, int size);
76bool PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags);
77bool PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags);
78bool PMap_SystemUnmap(uint64_t virt, uint64_t pages);
79
80#endif /* __PMAP_H__ */
81
uint64_t PageEntry
Definition: amd64.h:52
uint32_t size
Definition: multiboot.h:0
uint64_t len
Definition: multiboot.h:2
uint64_t mappings
Definition: pmap.h:55
AS * PMap_CurrentAS()
Definition: pmap.c:168
bool PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags)
Definition: pmap.c:480
void PMap_Init()
Definition: pmap.c:19
AS * PMap_NewAS()
Definition: pmap.c:80
bool PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
Definition: pmap.c:514
uint64_t tables
Definition: pmap.h:54
bool PMap_Map(AS *as, uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
Definition: pmap.c:355
PageTable * root
Definition: pmap.h:53
void PMap_LoadAS(AS *space)
Definition: pmap.c:182
uintptr_t PMap_Translate(AS *space, uintptr_t va)
Definition: pmap.c:220
bool PMap_SystemUnmap(uint64_t virt, uint64_t pages)
Definition: pmap.c:539
void PMap_Dump(AS *space)
Definition: pmap.c:616
bool PMap_Unmap(AS *as, uint64_t virt, uint64_t pages)
Definition: pmap.c:387
bool PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags)
Definition: pmap.c:423
void PMap_InitAP()
Definition: pmap.c:67
void PMap_DestroyAS(AS *space)
Definition: pmap.c:116
void PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
Definition: pmap.c:460
Definition: pmap.h:52
uint64_t uintptr_t
Definition: types.h:16
unsigned long uint64_t
Definition: types.h:13