20#ifndef KERNEL_PROCESSOR_VIRTUALADDRESSSPACE_H
21#define KERNEL_PROCESSOR_VIRTUALADDRESSSPACE_H
22#include "pedigree/kernel/Log.h"
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/processor/UserMemoryPolicy.h"
25#include "pedigree/kernel/processor/types.h"
26#include "pedigree/kernel/utilities/Pointers.h"
27#include "pedigree/kernel/utilities/utility.h"
49 static const size_t Write = 0x02;
68 static const size_t Dirty = 0x1000;
81 return m_RawUserMemory;
83 virtual size_t runtimeMappingPages(uintptr_t,
size_t) {
87 return m_MemoryLockAccount;
90 m_MemoryLockAccount = account;
93 return m_UserMemoryPolicy;
96 m_UserMemoryPolicy = policy;
108 virtual void*
expandHeap(ssize_t incr,
size_t flags);
134 virtual bool tryMapUserPage(physical_uintptr_t physical,
void* address,
size_t flags,
135 size_t* committedTablePages =
nullptr) {
136 if (committedTablePages)
137 *committedTablePages = 0;
142 virtual bool tryDetachUserPage(
void* address, physical_uintptr_t expected) {
152 virtual bool mapHuge(physical_uintptr_t physAddress,
void* virtualAddress,
size_t count,
174 enum class ResidentCopyStatus { Success, Inaccessible, Unsupported };
178 size_t bytes,
bool write) {
183 return ResidentCopyStatus::Unsupported;
204 virtual bool tryReadUserPointer(uintptr_t address, uintptr_t& value) {
220#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
221 using CopyOnWritePreCommitHook = void (*)(
void*);
224 static EXPORTED_PUBLIC
void setCopyOnWritePreCommitHookForTest(CopyOnWritePreCommitHook hook);
231 virtual void setFlags(
void* virtualAddress,
size_t newFlags) = 0;
235 (void)virtualAddress;
243 virtual void unmap(
void* virtualAddress) = 0;
247 virtual bool detachMapping(
void* virtualAddress, physical_uintptr_t& physical,
size_t& flags,
248 size_t requiredFlags = 0) {
254 enum class RemapStatus { Success, InvalidRange, Unsupported, NoMemory, Retry };
255 static constexpr size_t MaximumRemapPages = 65536;
261 uintptr_t source, destination;
262 size_t oldLength, newLength;
265 size_t victimCount = 0;
269 physical_uintptr_t physical;
273 using RemapAdmission = bool (*)(
void* context);
278 virtual RemapStatus
commit(RemapAdmission admission,
void* context) = 0;
280 virtual size_t detachedPageCount()
const = 0;
287 return RemapStatus::Unsupported;
421 Stack(
void* top,
size_t size, uint64_t regionId = 0)
422 : m_Top(top), m_Size(size), m_RegionId(regionId) {}
423 uint64_t regionId()
const {
427 void* getTop()
const {
431 void* getBase()
const {
433 return adjust_pointer(m_Top, -m_Size);
439 size_t getSize()
const {
443 operator void*()
const {
457 bool prepareZeroPage();
458 uint64_t m_HeapRegionId = 0;
463#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
464 static void copyOnWritePreCommitForTest(
void* virtualAddress);
481#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
482 static CopyOnWritePreCommitHook m_CopyOnWritePreCommitHook;
virtual void setFlags(void *virtualAddress, size_t newFlags)=0
static const size_t CopyOnWrite
static VirtualAddressSpace * create()
virtual ~VirtualAddressSpace()
virtual uintptr_t getKernelVirtualPagestackAdd2() const
virtual void setRemapPreparationFailureForTest(ssize_t allocations)
virtual uintptr_t getUserReservedStart() const =0
virtual uintptr_t getKernelCacheEnd() const =0
static const size_t CacheDisable
static const size_t Borrowed
virtual uintptr_t getDynamicLinkerAddress() const =0
virtual uintptr_t getKernelHeapStart() const =0
static const size_t Accessed
virtual uintptr_t getGlobalInfoBlock() const
static physical_uintptr_t m_ZeroPage
virtual void freeStack(Stack *pStack)=0
static const size_t RuntimeMapping
virtual Stack * allocateStack()=0
virtual uintptr_t getDynamicStart() const
virtual bool mapHuge(physical_uintptr_t physAddress, void *virtualAddress, size_t count, size_t flags)
VirtualAddressSpace(const VirtualAddressSpace &)
virtual bool map(physical_uintptr_t physicalAddress, void *virtualAddress, size_t flags)=0
virtual bool tryWriteUser32(uintptr_t address, uint32_t value)
static const size_t Shared
virtual bool tryCompareExchangeUser32(uintptr_t address, uint32_t &expected, uint32_t desired, bool &exchanged)
virtual uintptr_t getKernelCacheStart() const =0
virtual bool isMapped(void *virtualAddress)=0
virtual void revertToKernelAddressSpace()=0
virtual uintptr_t getUserStart() const =0
static const size_t WriteCombine
virtual bool handleCopyOnWriteFault(void *virtualAddress, bool userMode)=0
static const size_t KernelMode
virtual bool memIsInKernelHeap(void *pMem)=0
virtual bool getMapping(void *virtualAddress, physical_uintptr_t &physicalAddress, size_t &flags)=0
static const size_t NoAccess
virtual uintptr_t getKernelVirtualPagestackAdd1() const
static const size_t ClearDirty
static const size_t Write
virtual uintptr_t getKernelModulesEnd() const =0
virtual uintptr_t getDynamicEnd() const
VirtualAddressSpace & operator=(const VirtualAddressSpace &)
virtual Stack * allocateStack(size_t stackSz)
static EXPORTED_PUBLIC VirtualAddressSpace & getKernelAddressSpace()
virtual bool detachMapping(void *virtualAddress, physical_uintptr_t &physical, size_t &flags, size_t requiredFlags=0)
virtual ResidentCopyStatus copyResidentUserPage(uintptr_t userAddress, void *kernelBuffer, size_t bytes, bool write)
static const size_t WriteProtected
VirtualAddressSpace(void *Heap)
virtual RemapStatus prepareRemap(const PageRemapRequest &request, UniquePointer< PreparedPageRemap > &plan)
static const size_t Execute
virtual uintptr_t getKernelHeapEnd() const =0
virtual bool memIsInHeap(void *pMem)=0
static const size_t Dirty
virtual uintptr_t getKernelStart() const =0
virtual MUST_USE_RESULT bool trySetFlags(void *virtualAddress, size_t newFlags)
static const size_t Swapped
void rollbackHeapExpansion(void *virtualAddress, size_t pageCount)
virtual void * getEndOfHeap()=0
virtual void unmap(void *virtualAddress)=0
virtual VirtualAddressSpace * clone(bool copyOnWrite=true)=0
virtual uintptr_t getKernelVirtualPagestack() const
void setHeap(void *heap, void *heapEnd)
virtual void * expandHeap(ssize_t incr, size_t flags)
virtual bool isAddressValid(void *virtualAddress)=0
virtual bool tryReadUser32(uintptr_t address, uint32_t &value)
static const size_t WriteThrough
virtual uintptr_t getKernelModulesStart() const =0
virtual uintptr_t getKernelEventBlockStart() const =0
uintptr_t physicalAddress(physical_uintptr_t address) PURE