The Pedigree Project 0.1
kernel/core/processor/armv7/VirtualAddressSpace.h
1#ifndef KERNEL_PROCESSOR_ARMV7_VIRTUALADDRESSSPACE_H
2#define KERNEL_PROCESSOR_ARMV7_VIRTUALADDRESSSPACE_H
3
4#include "pedigree/kernel/Spinlock.h"
5#include "pedigree/kernel/processor/VirtualAddressSpace.h"
6
7#include "AddressLayout.h"
8
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;
17
19 friend class ProcessorBase;
22
23 public:
24 bool isAddressValid(void* address) override;
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;
31 bool handleCopyOnWriteFault(void* address, bool userMode) 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;
37 Stack* allocateStack() override;
38 Stack* allocateStack(size_t bytes) override;
39 void freeStack(Stack* stack) override;
40 VirtualAddressSpace* clone(bool copyOnWrite = true) override;
41 void revertToKernelAddressSpace() override;
42 bool memIsInKernelHeap(void* address) override;
43 bool memIsInHeap(void* address) override;
44 void* getEndOfHeap() override;
45
46 uintptr_t getKernelStart() const override {
47 return ARMV7_DIRECT_MAP_BASE;
48 }
49 uintptr_t getUserStart() const override {
50 return USERSPACE_VIRTUAL_START;
51 }
52 uintptr_t getUserReservedStart() const override {
53 return USERSPACE_DYNAMIC_LINKER_LOCATION;
54 }
55 uintptr_t getDynamicLinkerAddress() const override {
56 return USERSPACE_DYNAMIC_LINKER_LOCATION;
57 }
58 uintptr_t getKernelHeapStart() const override {
59 return KERNEL_VIRTUAL_HEAP;
60 }
61 uintptr_t getKernelHeapEnd() const override {
62 return KERNEL_VIRTUAL_HEAP_END;
63 }
64 uintptr_t getKernelCacheStart() const override {
65 return KERNEL_VIRTUAL_CACHE;
66 }
67 uintptr_t getKernelCacheEnd() const override {
68 return KERNEL_VIRTUAL_CACHE_END;
69 }
70 uintptr_t getKernelEventBlockStart() const override {
71 return KERNEL_VIRTUAL_EVENT_BASE;
72 }
73 uintptr_t getKernelModulesStart() const override {
74 return KERNEL_VIRTUAL_MODULE_BASE;
75 }
76 uintptr_t getKernelModulesEnd() const override {
77 return KERNEL_VIRTUAL_MODULE_END;
78 }
79 uintptr_t getGlobalInfoBlock() const override {
80 return KERNEL_VIRTUAL_INFO_BLOCK;
81 }
82 uintptr_t getDynamicStart() const override {
83 return USERSPACE_DYNAMIC_START;
84 }
85 uintptr_t getDynamicEnd() const override {
86 return USERSPACE_DYNAMIC_END;
87 }
88
89 physical_uintptr_t root() const {
90 return m_Root;
91 }
93
94 private:
95 explicit Armv7VirtualAddressSpace(bool kernel);
96 uint32_t* findEntry(uintptr_t address, bool create, size_t* newTables = nullptr);
97 uint32_t* findExistingEntry(uintptr_t address, bool* section = nullptr) const;
98 bool cloneUserTables(Armv7VirtualAddressSpace& destination, bool copyOnWrite);
99 void freeUserTables();
100 static uint32_t pageDescriptor(physical_uintptr_t physical, size_t flags);
101
102 static Armv7VirtualAddressSpace m_KernelSpace;
103 physical_uintptr_t m_Root;
104 uintptr_t m_StackTop;
105 Spinlock m_Lock;
106};
107
108#endif
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
VirtualAddressSpace * clone(bool copyOnWrite=true) override
bool trySetFlags(void *address, size_t flags) override
bool isMapped(void *address) override
bool map(physical_uintptr_t physical, void *address, size_t flags) override
bool memIsInHeap(void *address) override
bool handleCopyOnWriteFault(void *address, bool userMode) override
void freeStack(Stack *stack) override
bool isAddressValid(void *address) override
static VirtualAddressSpace * create()
static EXPORTED_PUBLIC VirtualAddressSpace & getKernelAddressSpace()