1#ifndef KERNEL_PROCESSOR_ARM64_VIRTUALADDRESSSPACE_H
2#define KERNEL_PROCESSOR_ARM64_VIRTUALADDRESSSPACE_H
4#include "pedigree/kernel/Spinlock.h"
5#include "pedigree/kernel/processor/VirtualAddressSpace.h"
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;
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;
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;
57 return ARM64_DIRECT_MAP_BASE;
60 return USERSPACE_VIRTUAL_START;
63 return USERSPACE_DYNAMIC_LINKER_LOCATION;
66 return USERSPACE_DYNAMIC_LINKER_LOCATION;
69 return KERNEL_VIRTUAL_HEAP;
72 return KERNEL_VIRTUAL_HEAP_END;
75 return KERNEL_VIRTUAL_CACHE;
78 return KERNEL_VIRTUAL_CACHE_END;
81 return KERNEL_VIRTUAL_EVENT_BASE;
84 return KERNEL_VIRTUAL_MODULE_BASE;
87 return KERNEL_VIRTUAL_MODULE_END;
90 return KERNEL_VIRTUAL_INFO_BLOCK;
93 return USERSPACE_DYNAMIC_START;
96 return USERSPACE_DYNAMIC_END;
99 physical_uintptr_t root()
const {
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);
114 physical_uintptr_t m_Root;
115 uintptr_t m_StackTop;
uintptr_t getGlobalInfoBlock() const override
uintptr_t getKernelEventBlockStart() const override
uintptr_t getDynamicLinkerAddress() const override
uintptr_t getKernelHeapEnd() const override
uintptr_t getDynamicStart() const override
bool memIsInHeap(void *address) override
uintptr_t getKernelHeapStart() const override
uintptr_t getKernelModulesEnd() const override
bool isMapped(void *address) override
void freeStack(Stack *stack) override
void unmap(void *address) override
void setFlags(void *address, size_t flags) override
Stack * allocateStack() override
uintptr_t getDynamicEnd() const override
uintptr_t getUserReservedStart() const override
bool getMapping(void *address, physical_uintptr_t &physical, size_t &flags) override
uintptr_t getKernelCacheEnd() const override
uintptr_t getKernelCacheStart() const override
bool handleCopyOnWriteFault(void *address, bool userMode) override
void revertToKernelAddressSpace() override
uintptr_t getUserStart() const 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
uintptr_t getKernelStart() const override
bool map(physical_uintptr_t physical, void *address, size_t flags) override
bool isAddressValid(void *address) override
bool memIsInKernelHeap(void *address) override
uintptr_t getKernelModulesStart() const override
void * getEndOfHeap() override
static VirtualAddressSpace * create()
static EXPORTED_PUBLIC VirtualAddressSpace & getKernelAddressSpace()