1#ifndef KERNEL_PROCESSOR_ARMV7_VIRTUALADDRESSSPACE_H
2#define KERNEL_PROCESSOR_ARMV7_VIRTUALADDRESSSPACE_H
4#include "pedigree/kernel/Spinlock.h"
5#include "pedigree/kernel/processor/VirtualAddressSpace.h"
7#include "AddressLayout.h"
9constexpr size_t KERNEL_STACK_SIZE = 0x8000;
10constexpr uintptr_t USERSPACE_VIRTUAL_START = 0x10000;
11constexpr uintptr_t USERSPACE_DYNAMIC_LINKER_LOCATION = 0x3f000000;
12constexpr uintptr_t USERSPACE_VIRTUAL_HEAP = 0x40000000;
13constexpr uintptr_t USERSPACE_DYNAMIC_START = 0x48000000;
14constexpr uintptr_t USERSPACE_DYNAMIC_END = 0x7e000000;
15constexpr uintptr_t USERSPACE_VIRTUAL_STACK = 0x7ff00000;
16constexpr size_t USERSPACE_VIRTUAL_STACK_SIZE = 0x100000;
25 bool isMapped(
void* address)
override;
26 bool map(physical_uintptr_t physical,
void* address,
size_t flags)
override;
27 bool tryMapUserPage(physical_uintptr_t physical,
void* address,
size_t flags,
28 size_t* committedTablePages =
nullptr)
override;
29 bool tryDetachUserPage(
void* address, physical_uintptr_t expected)
override;
30 bool getMapping(
void* address, physical_uintptr_t& physical,
size_t& flags)
override;
32 void setFlags(
void* address,
size_t flags)
override;
33 bool trySetFlags(
void* address,
size_t flags)
override;
34 void unmap(
void* address)
override;
35 bool detachMapping(
void* address, physical_uintptr_t& physical,
size_t& flags,
36 size_t requiredFlags = 0)
override;
47 return ARMV7_DIRECT_MAP_BASE;
50 return USERSPACE_VIRTUAL_START;
53 return USERSPACE_DYNAMIC_LINKER_LOCATION;
56 return USERSPACE_DYNAMIC_LINKER_LOCATION;
59 return KERNEL_VIRTUAL_HEAP;
62 return KERNEL_VIRTUAL_HEAP_END;
65 return KERNEL_VIRTUAL_CACHE;
68 return KERNEL_VIRTUAL_CACHE_END;
71 return KERNEL_VIRTUAL_EVENT_BASE;
74 return KERNEL_VIRTUAL_MODULE_BASE;
77 return KERNEL_VIRTUAL_MODULE_END;
80 return KERNEL_VIRTUAL_INFO_BLOCK;
83 return USERSPACE_DYNAMIC_START;
86 return USERSPACE_DYNAMIC_END;
89 physical_uintptr_t root()
const {
96 uint32_t* findEntry(uintptr_t address,
bool create,
size_t* newTables =
nullptr);
97 uint32_t* findExistingEntry(uintptr_t address,
bool* section =
nullptr)
const;
99 void freeUserTables();
100 static uint32_t pageDescriptor(physical_uintptr_t physical,
size_t flags);
103 physical_uintptr_t m_Root;
104 uintptr_t m_StackTop;
bool detachMapping(void *address, physical_uintptr_t &physical, size_t &flags, size_t requiredFlags=0) override
void unmap(void *address) override
bool memIsInKernelHeap(void *address) override
void setFlags(void *address, size_t flags) override
bool getMapping(void *address, physical_uintptr_t &physical, size_t &flags) override
uintptr_t getKernelHeapEnd() const override
uintptr_t getDynamicStart() const override
VirtualAddressSpace * clone(bool copyOnWrite=true) override
bool trySetFlags(void *address, size_t flags) override
uintptr_t getKernelCacheEnd() const override
bool isMapped(void *address) override
uintptr_t getKernelEventBlockStart() const override
uintptr_t getUserStart() const override
void revertToKernelAddressSpace() override
uintptr_t getDynamicLinkerAddress() const override
uintptr_t getKernelCacheStart() const override
uintptr_t getGlobalInfoBlock() const override
uintptr_t getUserReservedStart() const override
bool map(physical_uintptr_t physical, void *address, size_t flags) override
uintptr_t getKernelModulesStart() const override
uintptr_t getKernelStart() const override
bool memIsInHeap(void *address) override
uintptr_t getKernelHeapStart() const override
uintptr_t getKernelModulesEnd() const override
void * getEndOfHeap() override
bool handleCopyOnWriteFault(void *address, bool userMode) override
void freeStack(Stack *stack) override
bool isAddressValid(void *address) override
Stack * allocateStack() override
uintptr_t getDynamicEnd() const override
static VirtualAddressSpace * create()
static EXPORTED_PUBLIC VirtualAddressSpace & getKernelAddressSpace()