The Pedigree Project 0.1
kernel/core/processor/arm64/VirtualAddressSpace.h
1#ifndef KERNEL_PROCESSOR_ARM64_VIRTUALADDRESSSPACE_H
2#define KERNEL_PROCESSOR_ARM64_VIRTUALADDRESSSPACE_H
3
4#include "pedigree/kernel/Spinlock.h"
5#include "pedigree/kernel/processor/VirtualAddressSpace.h"
6
7constexpr uintptr_t ARM64_DIRECT_MAP_BASE = 0xffff000000000000ULL;
8constexpr uintptr_t KERNEL_VIRTUAL_HEAP = 0xffff800000000000ULL;
9constexpr uintptr_t KERNEL_VIRTUAL_HEAP_END = 0xffff800100000000ULL;
10constexpr uintptr_t KERNEL_VIRTUAL_CACHE = 0xffff900000000000ULL;
11constexpr uintptr_t KERNEL_VIRTUAL_CACHE_END = 0xffff901000000000ULL;
12constexpr uintptr_t KERNEL_VIRTUAL_MEMORYREGION_ADDRESS = 0xffffa00000000000ULL;
13constexpr uintptr_t KERNEL_VIRTUAL_MEMORYREGION_END = 0xffffa01000000000ULL;
14constexpr uintptr_t KERNEL_VIRTUAL_MODULE_BASE = 0xffffb00000000000ULL;
15constexpr uintptr_t KERNEL_VIRTUAL_MODULE_END = 0xffffb01000000000ULL;
16constexpr uintptr_t KERNEL_VIRTUAL_EVENT_BASE = 0xffffc00000000000ULL;
17constexpr uintptr_t KERNEL_VIRTUAL_INFO_BLOCK = 0xffffd00000000000ULL;
18constexpr uintptr_t KERNEL_VIRTUAL_STACK = 0xffffe00000000000ULL;
19constexpr size_t KERNEL_STACK_SIZE = 0x10000;
20constexpr uintptr_t USERSPACE_VIRTUAL_START = 0x400000;
21constexpr uintptr_t USERSPACE_DYNAMIC_LINKER_LOCATION = 0x4fa00000;
22constexpr uintptr_t USERSPACE_VIRTUAL_HEAP = 0x50000000;
23constexpr uintptr_t USERSPACE_DYNAMIC_START = 0x100000000ULL;
24constexpr uintptr_t USERSPACE_DYNAMIC_END = 0x00007ff000000000ULL;
25constexpr uintptr_t USERSPACE_VIRTUAL_STACK = 0x00007fffffff0000ULL;
26constexpr size_t USERSPACE_VIRTUAL_STACK_SIZE = 0x100000;
27
29 friend class ProcessorBase;
32
33 public:
34 bool isAddressValid(void* address) override;
35 bool isMapped(void* address) override;
36 bool map(physical_uintptr_t physical, void* address, size_t flags) override;
37 bool tryMapUserPage(physical_uintptr_t physical, void* address, size_t flags,
38 size_t* committedTablePages = nullptr) override;
39 bool tryDetachUserPage(void* address, physical_uintptr_t expected) override;
40 bool getMapping(void* address, physical_uintptr_t& physical, size_t& flags) override;
41 bool handleCopyOnWriteFault(void* address, bool userMode) override;
42 void setFlags(void* address, size_t flags) override;
43 bool trySetFlags(void* address, size_t flags) override;
44 void unmap(void* address) override;
45 bool detachMapping(void* address, physical_uintptr_t& physical, size_t& flags,
46 size_t requiredFlags = 0) override;
47 Stack* allocateStack() override;
48 Stack* allocateStack(size_t bytes) override;
49 void freeStack(Stack* stack) override;
50 VirtualAddressSpace* clone(bool copyOnWrite = true) override;
51 void revertToKernelAddressSpace() override;
52 bool memIsInKernelHeap(void* address) override;
53 bool memIsInHeap(void* address) override;
54 void* getEndOfHeap() override;
55
56 uintptr_t getKernelStart() const override {
57 return ARM64_DIRECT_MAP_BASE;
58 }
59 uintptr_t getUserStart() const override {
60 return USERSPACE_VIRTUAL_START;
61 }
62 uintptr_t getUserReservedStart() const override {
63 return USERSPACE_DYNAMIC_LINKER_LOCATION;
64 }
65 uintptr_t getDynamicLinkerAddress() const override {
66 return USERSPACE_DYNAMIC_LINKER_LOCATION;
67 }
68 uintptr_t getKernelHeapStart() const override {
69 return KERNEL_VIRTUAL_HEAP;
70 }
71 uintptr_t getKernelHeapEnd() const override {
72 return KERNEL_VIRTUAL_HEAP_END;
73 }
74 uintptr_t getKernelCacheStart() const override {
75 return KERNEL_VIRTUAL_CACHE;
76 }
77 uintptr_t getKernelCacheEnd() const override {
78 return KERNEL_VIRTUAL_CACHE_END;
79 }
80 uintptr_t getKernelEventBlockStart() const override {
81 return KERNEL_VIRTUAL_EVENT_BASE;
82 }
83 uintptr_t getKernelModulesStart() const override {
84 return KERNEL_VIRTUAL_MODULE_BASE;
85 }
86 uintptr_t getKernelModulesEnd() const override {
87 return KERNEL_VIRTUAL_MODULE_END;
88 }
89 uintptr_t getGlobalInfoBlock() const override {
90 return KERNEL_VIRTUAL_INFO_BLOCK;
91 }
92 uintptr_t getDynamicStart() const override {
93 return USERSPACE_DYNAMIC_START;
94 }
95 uintptr_t getDynamicEnd() const override {
96 return USERSPACE_DYNAMIC_END;
97 }
98
99 physical_uintptr_t root() const {
100 return m_Root;
101 }
102 ~Arm64VirtualAddressSpace() override;
103
104 private:
105 explicit Arm64VirtualAddressSpace(bool kernel);
106 uint64_t* findEntry(uintptr_t address, bool create, size_t* newTables = nullptr);
107 uint64_t* findExistingEntry(uintptr_t address, size_t* level = nullptr) const;
108 bool cloneTable(uint64_t* destination, const uint64_t* source, size_t level, bool copyOnWrite);
109 void freeTable(uint64_t* table, size_t level, bool freeLeaves);
110 static uint64_t pageDescriptor(physical_uintptr_t physical, size_t flags);
111 static size_t descriptorFlags(uint64_t descriptor);
112
113 static Arm64VirtualAddressSpace m_KernelSpace;
114 physical_uintptr_t m_Root;
115 uintptr_t m_StackTop;
116 Spinlock m_Lock;
117};
118
119#endif
bool memIsInHeap(void *address) override
bool isMapped(void *address) override
void freeStack(Stack *stack) override
void unmap(void *address) override
void setFlags(void *address, size_t flags) override
bool getMapping(void *address, physical_uintptr_t &physical, size_t &flags) override
bool handleCopyOnWriteFault(void *address, bool userMode) override
VirtualAddressSpace * clone(bool copyOnWrite=true) override
bool trySetFlags(void *address, size_t flags) override
bool detachMapping(void *address, physical_uintptr_t &physical, size_t &flags, size_t requiredFlags=0) override
bool map(physical_uintptr_t physical, void *address, size_t flags) override
bool isAddressValid(void *address) override
bool memIsInKernelHeap(void *address) override
static VirtualAddressSpace * create()
static EXPORTED_PUBLIC VirtualAddressSpace & getKernelAddressSpace()