The Pedigree Project 0.1
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
X86CommonPhysicalMemoryManager Class Reference

Implementation of the PhysicalMemoryManager for common x86. More...

#include <PhysicalMemoryManager.h>

+ Inheritance diagram for X86CommonPhysicalMemoryManager:
+ Collaboration diagram for X86CommonPhysicalMemoryManager:

Classes

struct  page
 
class  PageHashable
 
class  PageStack
 The Stack of pages (below4GB, below64GB, no constraint). More...
 

Public Member Functions

virtual physical_uintptr_t allocatePage (size_t pageConstraints=0) override
 
physical_uintptr_t tryAllocatePage () override
 
bool copyPhysicalPageToBuffer (physical_uintptr_t page, void *buffer) override
 
bool copyPhysicalPageFromBuffer (physical_uintptr_t page, const void *buffer) override
 
MemorySnapshot memorySnapshot () const override
 
virtual void freePage (physical_uintptr_t page) override
 
virtual bool allocateRegion (MemoryRegion &Region, size_t cPages, size_t pageConstraints, size_t Flags, physical_uintptr_t start=-1) override
 
virtual void pin (physical_uintptr_t page) override
 
void initialise (const BootstrapStruct_t &Info) INITIALISATION_ONLY
 
void initialise64 (const BootstrapStruct_t &Info) INITIALISATION_ONLY
 
void initialisationDone ()
 
void shutdown ()
 
const RangeList< uint64_t > & getAcpiRanges () const
 
virtual size_t freePageCount () const override
 
- Public Member Functions inherited from PhysicalMemoryManager
void allocateMemoryRegionList (Vector< MemoryRegionInfo * > &MemoryRegions)
 
void freeMemoryRegionList (Vector< MemoryRegionInfo * > &MemoryRegions)
 

Static Public Member Functions

static X86CommonPhysicalMemoryManager & instance ()
 
- Static Public Member Functions inherited from PhysicalMemoryManager
static PhysicalMemoryManager & instance ()
 
static constexpr size_t getPageSize () PURE
 

Protected Member Functions

 X86CommonPhysicalMemoryManager () INITIALISATION_ONLY
 
virtual ~X86CommonPhysicalMemoryManager () override
 
- Protected Member Functions inherited from PhysicalMemoryManager
 PhysicalMemoryManager ()
 
virtual ~PhysicalMemoryManager ()
 

Private Types

typedef HashTable< PageHashable, struct page > MetadataTable
 

Private Member Functions

 X86CommonPhysicalMemoryManager (const X86CommonPhysicalMemoryManager &)
 
X86CommonPhysicalMemoryManager & operator= (const X86CommonPhysicalMemoryManager &)
 
void unmapRegion (MemoryRegion *pRegion) override
 
virtual void freePageUnlocked (physical_uintptr_t page) override
 

Private Attributes

PageStack m_PageStack
 
RangeList< uint32_t > m_RangeBelow1MB
 
RangeList< uint32_t > m_RangeBelow16MB
 
RangeList< uint64_t > m_PhysicalRanges
 
RangeList< uint64_t > m_AcpiRanges
 
RangeList< uintptr_t > m_MemoryRegions
 
Spinlock m_Lock
 
Spinlock m_RegionLock
 
HashTable< PageHashable, struct page > m_PageMetadata
 
bool m_PageMetadataReady
 
physical_uintptr_t m_BootstrapPinnedPage
 
size_t m_BootstrapPinnedPageRefcount
 

Static Private Attributes

static X86CommonPhysicalMemoryManager m_Instance
 

Friends

class CacheManager
 
class Cache
 

Additional Inherited Members

- Static Public Attributes inherited from PhysicalMemoryManager
static const size_t continuous = 1 << 0
 
static const size_t nonRamMemory = 1 << 1
 
static const size_t force = 1 << 2
 
static const size_t virtualOnly = 1 << 3
 
static const size_t below1MB = 1 << 4
 
static const size_t below16MB = 1 << 5
 
static const size_t below4GB = 1 << 6
 
static const size_t below64GB = 1 << 7
 
static const size_t addressConstraints = below1MB | below16MB | below4GB | below64GB
 
static const size_t anonymous = 1 << 8
 
- Protected Attributes inherited from PhysicalMemoryManager
Vector< MemoryRegion * > m_MemoryRegions
 

Detailed Description

Implementation of the PhysicalMemoryManager for common x86.

The common x86 implementation of the PhysicalMemoryManager

Definition at line 44 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Member Typedef Documentation

◆ MetadataTable

Constructor & Destructor Documentation

◆ X86CommonPhysicalMemoryManager() [1/2]

X86CommonPhysicalMemoryManager::X86CommonPhysicalMemoryManager ( )
protected

The constructor

Definition at line 824 of file x86_common/PhysicalMemoryManager.cc.

◆ ~X86CommonPhysicalMemoryManager()

X86CommonPhysicalMemoryManager::~X86CommonPhysicalMemoryManager ( )
overrideprotectedvirtual

The destructor

Definition at line 837 of file x86_common/PhysicalMemoryManager.cc.

◆ X86CommonPhysicalMemoryManager() [2/2]

X86CommonPhysicalMemoryManager::X86CommonPhysicalMemoryManager ( const X86CommonPhysicalMemoryManager &  )
private

The copy-constructor

Note
Not implemented (singleton)

Member Function Documentation

◆ allocatePage()

physical_uintptr_t X86CommonPhysicalMemoryManager::allocatePage ( size_t  pageConstraints = 0)
overridevirtual

Allocate a single page with optional constraints.

Returns
physical address of the page or 0 if no page available.

Implements PhysicalMemoryManager.

Definition at line 66 of file x86_common/PhysicalMemoryManager.cc.

References Spinlock::acquire(), X86CommonPhysicalMemoryManager::PageStack::allocate(), MemoryPressureManager::compact(), MemoryPressureManager::compactingForCurrentExecution(), EMIT_IF, ProcessorBase::m_Initialised, m_Lock, m_PageStack, panic(), and Spinlock::release().

Referenced by allocateRegion().

+ Here is the caller graph for this function:

◆ allocateRegion()

bool X86CommonPhysicalMemoryManager::allocateRegion ( MemoryRegion &  Region,
size_t  cPages,
size_t  pageConstraints,
size_t  Flags,
physical_uintptr_t  start = -1 
)
overridevirtual

◆ copyPhysicalPageFromBuffer()

bool X86CommonPhysicalMemoryManager::copyPhysicalPageFromBuffer ( physical_uintptr_t  page,
const void *  buffer 
)
overridevirtual

Reimplemented from PhysicalMemoryManager.

Definition at line 177 of file x86_common/PhysicalMemoryManager.cc.

◆ copyPhysicalPageToBuffer()

bool X86CommonPhysicalMemoryManager::copyPhysicalPageToBuffer ( physical_uintptr_t  page,
void *  buffer 
)
overridevirtual

Reimplemented from PhysicalMemoryManager.

Definition at line 166 of file x86_common/PhysicalMemoryManager.cc.

◆ freePage()

void X86CommonPhysicalMemoryManager::freePage ( physical_uintptr_t  page)
overridevirtual

Free a page allocated with the allocatePage() function

Parameters
[in]pagephysical address of the page

Implements PhysicalMemoryManager.

Definition at line 189 of file x86_common/PhysicalMemoryManager.cc.

References freePageUnlocked(), and m_Lock.

Referenced by allocateRegion(), and unmapRegion().

+ Here is the caller graph for this function:

◆ freePageCount()

size_t X86CommonPhysicalMemoryManager::freePageCount ( ) const
overridevirtual

Specifies the number of pages that remain free on the system.

Reimplemented from PhysicalMemoryManager.

Definition at line 62 of file x86_common/PhysicalMemoryManager.cc.

References m_PageStack.

◆ freePageUnlocked()

void X86CommonPhysicalMemoryManager::freePageUnlocked ( physical_uintptr_t  page)
overrideprivatevirtual

Same as freePage, but without the lock. Will panic if the lock is unlocked.

Note
Use in the wrong place and you die.

Implements PhysicalMemoryManager.

Definition at line 194 of file x86_common/PhysicalMemoryManager.cc.

References X86CommonPhysicalMemoryManager::PageStack::free(), PhysicalMemoryManager::getPageSize(), ProcessorBase::m_Initialised, m_Lock, m_PageMetadata, m_PageMetadataReady, and m_PageStack.

Referenced by freePage().

+ Here is the caller graph for this function:

◆ getAcpiRanges()

const RangeList< uint64_t > & X86CommonPhysicalMemoryManager::getAcpiRanges ( ) const
inline

◆ initialisationDone()

void X86CommonPhysicalMemoryManager::initialisationDone ( )

◆ initialise()

void X86CommonPhysicalMemoryManager::initialise ( const BootstrapStruct_t &  Info)

◆ initialise64()

void X86CommonPhysicalMemoryManager::initialise64 ( const BootstrapStruct_t &  Info)

◆ instance()

static X86CommonPhysicalMemoryManager & X86CommonPhysicalMemoryManager::instance ( )
inlinestatic

Get the X86CommonPhysicalMemoryManager instance

Returns
instance of the X86CommonPhysicalMemoryManager

Definition at line 55 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

References m_Instance.

◆ memorySnapshot()

PhysicalMemoryManager::MemorySnapshot X86CommonPhysicalMemoryManager::memorySnapshot ( ) const
overridevirtual

Reimplemented from PhysicalMemoryManager.

Definition at line 160 of file x86_common/PhysicalMemoryManager.cc.

◆ operator=()

X86CommonPhysicalMemoryManager & X86CommonPhysicalMemoryManager::operator= ( const X86CommonPhysicalMemoryManager &  )
private

The copy-constructor

Note
Not implemented (singleton)

◆ pin()

void X86CommonPhysicalMemoryManager::pin ( physical_uintptr_t  page)
overridevirtual

"Pin" a page, increasing its refcount.

Every time a pinned page is passed to freePage, its refcount is decreased, and the page is only freed once the refcount hits zero.

Note that an unpin function is not provided, as freePage offers the right semantics.

Implements PhysicalMemoryManager.

Definition at line 235 of file x86_common/PhysicalMemoryManager.cc.

References m_Lock, m_PageMetadata, and m_PageMetadataReady.

◆ shutdown()

void X86CommonPhysicalMemoryManager::shutdown ( )

Clean up tracking structures.

Definition at line 442 of file x86_common/PhysicalMemoryManager.cc.

References Vector< T >::clear(), PhysicalMemoryManager::m_MemoryRegions, and m_PageMetadata.

◆ tryAllocatePage()

physical_uintptr_t X86CommonPhysicalMemoryManager::tryAllocatePage ( )
overridevirtual

Reimplemented from PhysicalMemoryManager.

Definition at line 126 of file x86_common/PhysicalMemoryManager.cc.

◆ unmapRegion()

void X86CommonPhysicalMemoryManager::unmapRegion ( MemoryRegion *  pRegion)
overrideprivatevirtual

Friends And Related Symbol Documentation

◆ Cache

friend class Cache
friend

◆ CacheManager

friend class CacheManager
friend

Member Data Documentation

◆ m_AcpiRanges

RangeList<uint64_t> X86CommonPhysicalMemoryManager::m_AcpiRanges
private

RangeList of ACPI memory

Definition at line 209 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by initialise(), and initialise64().

◆ m_BootstrapPinnedPage

physical_uintptr_t X86CommonPhysicalMemoryManager::m_BootstrapPinnedPage
private

◆ m_BootstrapPinnedPageRefcount

size_t X86CommonPhysicalMemoryManager::m_BootstrapPinnedPageRefcount
private

◆ m_Instance

X86CommonPhysicalMemoryManager X86CommonPhysicalMemoryManager::m_Instance
staticprivate

The X86CommonPhysicalMemoryManager class instance

Definition at line 217 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by instance().

◆ m_Lock

Spinlock X86CommonPhysicalMemoryManager::m_Lock
private

To guard against multiprocessor reentrancy.

Definition at line 220 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by allocatePage(), freePage(), freePageUnlocked(), initialise(), and pin().

◆ m_MemoryRegions

RangeList<uintptr_t> X86CommonPhysicalMemoryManager::m_MemoryRegions
private

Virtual-memory available for MemoryRegions

Todo:
rename this member (conflicts with PhysicalMemoryManager::m_MemoryRegions)

Definition at line 214 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by allocateRegion(), initialise(), and unmapRegion().

◆ m_PageMetadata

HashTable<PageHashable, struct page> X86CommonPhysicalMemoryManager::m_PageMetadata
private

Page metadata table

Definition at line 258 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by freePageUnlocked(), initialise(), pin(), and shutdown().

◆ m_PageMetadataReady

bool X86CommonPhysicalMemoryManager::m_PageMetadataReady
private

A shared SLAM zero page is pinned while this table is itself being allocated through SLAM. Keep that one bootstrap reference allocation-free until the table can own it.

Definition at line 265 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by freePageUnlocked(), initialise(), and pin().

◆ m_PageStack

PageStack X86CommonPhysicalMemoryManager::m_PageStack
private

◆ m_PhysicalRanges

RangeList<uint64_t> X86CommonPhysicalMemoryManager::m_PhysicalRanges
private

RangeList of free physical memory

Definition at line 206 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by allocateRegion(), initialise(), initialise64(), and unmapRegion().

◆ m_RangeBelow16MB

RangeList<uint32_t> X86CommonPhysicalMemoryManager::m_RangeBelow16MB
private

RangeList for the usable memory below 16MB

Definition at line 203 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by allocateRegion(), initialisationDone(), initialise(), and unmapRegion().

◆ m_RangeBelow1MB

RangeList<uint32_t> X86CommonPhysicalMemoryManager::m_RangeBelow1MB
private

RangeList for the usable memory below 1MB

Definition at line 201 of file kernel/core/processor/x86_common/PhysicalMemoryManager.h.

Referenced by allocateRegion(), initialise(), and unmapRegion().

◆ m_RegionLock

Spinlock X86CommonPhysicalMemoryManager::m_RegionLock
private

The documentation for this class was generated from the following files: