#ifndef __MEMORY_H
#define __MEMORY_H
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct page_pool_t page_pool_t;
struct page_pool_t
{
//! Stack of addresses, describing each page in the pool
addr_t* pages;
//! The number of pages in memory, i.e. memory_top / PAGE_SIZE
unsigned num_pages;
//! The number of free pages in the stack
unsigned free_pages;
};
extern DLLIMPORT page_pool_t pool_all, pool_low;
// pool_low contains all the pages below 1MB
#define NUM_LOW_PAGES (0x100000 >> PAGE_BITS)
bool memInit();
addr_t memAlloc();
void memFree(addr_t block);
addr_t memAllocLow();
void memFreeLow(addr_t block);
addr_t memAllocLowSpan(size_t pages);
bool memMap(dword *PageDir, dword Virt, dword Phys, dword pages, byte Privilege);
dword memTranslate(const dword* pPageDir, const void* pAddress);
#if 0
#undef INTERFACE
#define INTERFACE IPager
//! Implements a method to allow memory to be automatically paged in.
/*!
* \implement If you are writing code which causes data to be loaded by
* being paged in, as opposed to manual loading. Examples include sections
* from executable files, thread stack pages, and the ramdisk.
* \use This interface is only used from within the kernel's page fault
* handler.
*/
DECLARE_INTERFACE(IPager)
{
STDMETHOD(QueryInterface)(THIS_ REFIID iid, void ** ppvObject) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
//! Called by the page fault handler when a memory page was not found,
//! allowing the handler to load the page and make it available.
/*!
* \param virt The virtual address which caused the page fault. Note that
* this is not necessarily on a page boundary.
* \return S_OK if the address is now available, and program execution
* should continue; a failure code if this object does not handle this
* page, or if the page could not be made available.
*/
STDMETHOD(ValidatePage)(THIS_ const void* virt) PURE;
};
// {816B7D51-910A-4187-AEF6-F30EFEFE4AEE}
DEFINE_GUID(IID_IPager,
0x816b7d51, 0x910a, 0x4187, 0xae, 0xf6, 0xf3, 0xe, 0xfe, 0xfe, 0x4a, 0xee);
#endif
#ifdef __cplusplus
}
#endif
#endif