The Pedigree Project 0.1
kernel/core/processor/arm64/PhysicalMemoryManager.h
1#ifndef KERNEL_PROCESSOR_ARM64_PHYSICALMEMORYMANAGER_H
2#define KERNEL_PROCESSOR_ARM64_PHYSICALMEMORYMANAGER_H
3
4#include "pedigree/kernel/BootstrapInfo.h"
5#include "pedigree/kernel/Spinlock.h"
6#include "pedigree/kernel/processor/PhysicalMemoryManager.h"
7
8extern size_t g_AllocedPages;
9extern size_t g_FreePages;
10
12 public:
13 static Arm64PhysicalMemoryManager& instance();
14 void initialise(const BootstrapStruct_t& info);
15
16 physical_uintptr_t allocatePage(size_t constraints = 0) override;
17 physical_uintptr_t tryAllocatePage() override;
18 void freePage(physical_uintptr_t page) override;
19 void pin(physical_uintptr_t page) override;
20 bool copyPhysicalPageToBuffer(physical_uintptr_t page, void* buffer) override;
21 bool copyPhysicalPageFromBuffer(physical_uintptr_t page, const void* buffer) override;
22 MemorySnapshot memorySnapshot() const override;
23 size_t freePageCount() const override;
24 bool allocateRegion(MemoryRegion& region, size_t pages, size_t constraints, size_t flags,
25 physical_uintptr_t start = -1) override;
26
27 private:
29 void freePageUnlocked(physical_uintptr_t page) override;
30 void unmapRegion(MemoryRegion* region) override;
31 bool pageAvailable(size_t page) const;
32 void markPage(size_t page, bool available);
33 size_t pageLimit(size_t constraints) const;
34 physical_uintptr_t allocatePageUnlocked(size_t constraints);
35 physical_uintptr_t allocateContinuousPagesUnlocked(size_t pages, size_t constraints);
36
37 mutable Spinlock m_Lock;
38 Spinlock m_RegionLock;
39 uint16_t* m_References;
40 uint8_t* m_FreeBitmap;
41 size_t m_MaxPage;
42 size_t m_NextPage;
43 size_t m_TotalPages;
44 size_t m_FreePages;
45 uintptr_t m_NextRegion;
46};
47
48#endif
physical_uintptr_t allocatePage(size_t constraints=0) override
void pin(physical_uintptr_t page) override
bool allocateRegion(MemoryRegion &region, size_t pages, size_t constraints, size_t flags, physical_uintptr_t start=-1) override
void freePageUnlocked(physical_uintptr_t page) override
void freePage(physical_uintptr_t page) override
void unmapRegion(MemoryRegion *region) override
Special memory entity in the kernel's virtual address space.