stos: pmm: Add pageframe descriptor population
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Page-related definitions
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACHINE_PAGE_H_
|
||||||
|
#define _MACHINE_PAGE_H_ 1
|
||||||
|
|
||||||
|
#define PAGESIZE 4096
|
||||||
|
#define LOG2_PAGESIZE 12
|
||||||
|
|
||||||
|
#endif /* !_MACHINE_PAGE_H_ */
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Chloe M.
|
||||||
|
* Provided under the BSD-3 clause.
|
||||||
|
*
|
||||||
|
* Description: Page-related definitions
|
||||||
|
* Author: Chloe M.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_PAGE_H_
|
||||||
|
#define _HAL_PAGE_H_ 1
|
||||||
|
|
||||||
|
#include <machine/page.h>
|
||||||
|
|
||||||
|
#endif /* !_HAL_PAGE_H_ */
|
||||||
+115
-1
@@ -9,7 +9,12 @@
|
|||||||
#include <ex/trace.h>
|
#include <ex/trace.h>
|
||||||
#include <ke/bpal.h>
|
#include <ke/bpal.h>
|
||||||
#include <mm/pmm.h>
|
#include <mm/pmm.h>
|
||||||
|
#include <mm/vmm.h>
|
||||||
|
#include <hal/page.h>
|
||||||
#include <units.h>
|
#include <units.h>
|
||||||
|
#include <stdef.h>
|
||||||
|
|
||||||
|
#define LOAD_DELAY 128
|
||||||
|
|
||||||
#define DTRACE(Fmt, ...) \
|
#define DTRACE(Fmt, ...) \
|
||||||
TRACE("[ PMM ]: " Fmt, ##__VA_ARGS__)
|
TRACE("[ PMM ]: " Fmt, ##__VA_ARGS__)
|
||||||
@@ -20,6 +25,28 @@
|
|||||||
? TypeTab[(TYPE)] \
|
? TypeTab[(TYPE)] \
|
||||||
: "invalid"
|
: "invalid"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Physical frame descriptor
|
||||||
|
*
|
||||||
|
* @Next: Next PFD in list
|
||||||
|
* @Prev: Previous PFD in list
|
||||||
|
*/
|
||||||
|
typedef struct _MM_PFD {
|
||||||
|
struct _MM_PFD *Next;
|
||||||
|
struct _MM_PFD *Prev;
|
||||||
|
} MM_PFD;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Page frame descriptor list
|
||||||
|
*
|
||||||
|
* @First: First entry in list
|
||||||
|
* @Last: Last entry in list
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
MM_PFD *First;
|
||||||
|
MM_PFD *Last;
|
||||||
|
} MM_PFD_LIST;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory type constant to human readable
|
* Memory type constant to human readable
|
||||||
* string table.
|
* string table.
|
||||||
@@ -38,6 +65,63 @@ static const char *TypeTab[] = {
|
|||||||
|
|
||||||
/* Globals */
|
/* Globals */
|
||||||
static USIZE UsableMemory = 0;
|
static USIZE UsableMemory = 0;
|
||||||
|
static MM_PFD_LIST PfdList;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Append a page frame descriptor to a page frame descriptor list
|
||||||
|
*
|
||||||
|
* @List: PFD list to append to
|
||||||
|
* @Pfd: PFD to append
|
||||||
|
*/
|
||||||
|
static VOID
|
||||||
|
MmPfdAppend(MM_PFD_LIST *List, MM_PFD *Pfd)
|
||||||
|
{
|
||||||
|
MM_PFD *Last;
|
||||||
|
|
||||||
|
if (List == NULL || Pfd == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (List->Last == NULL || List->First == NULL) {
|
||||||
|
List->Last = Pfd;
|
||||||
|
List->First = Pfd;
|
||||||
|
} else {
|
||||||
|
Last = List->Last;
|
||||||
|
Pfd->Prev = Last;
|
||||||
|
Last->Next = Pfd;
|
||||||
|
List->Last = Pfd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pop a page frame descriptor from a page frame descriptor list
|
||||||
|
*
|
||||||
|
* @List: Page frame descriptor list to pop from
|
||||||
|
*
|
||||||
|
* Returns NULL if there are no entries left
|
||||||
|
*/
|
||||||
|
static MM_PFD *
|
||||||
|
MmPfdPop(MM_PFD_LIST *List)
|
||||||
|
{
|
||||||
|
MM_PFD *Last, *Prev;
|
||||||
|
|
||||||
|
if (List == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Last = List->Last;
|
||||||
|
if (Last == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unlink from the list */
|
||||||
|
Prev = Last->Prev;
|
||||||
|
List->Last = List->Last->Prev;
|
||||||
|
Prev->Next = NULL;
|
||||||
|
List->Last = Prev;
|
||||||
|
|
||||||
|
return Last;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print the units of a size in a pretty format
|
* Print the units of a size in a pretty format
|
||||||
@@ -61,13 +145,29 @@ MmPrintUnits(USIZE Length, const CHAR *Title)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a loading status
|
||||||
|
*/
|
||||||
|
static VOID
|
||||||
|
MmLoadUpdate(VOID)
|
||||||
|
{
|
||||||
|
const UCHAR LoadMax = 3;
|
||||||
|
static UCHAR LoadIdx = 0;
|
||||||
|
static CHAR LoadProg[3] = {'/', '-', '\\'};
|
||||||
|
|
||||||
|
TRACE("\x1b[?25l%c \b\b", LoadProg[LoadIdx++]);
|
||||||
|
LoadIdx %= LoadMax;
|
||||||
|
}
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
MmProbeMemory(VOID)
|
MmProbeMemory(VOID)
|
||||||
{
|
{
|
||||||
BPAL_HANDLE BpalHandle;
|
BPAL_HANDLE BpalHandle;
|
||||||
MEMMAP_ENTRY Entry;
|
MEMMAP_ENTRY Entry;
|
||||||
UPTR EntryEnd;
|
UPTR EntryEnd;
|
||||||
USIZE Idx;
|
VOID *Vma, *Base;
|
||||||
|
USIZE Idx, Offset;
|
||||||
|
USIZE EntryCount = 0;
|
||||||
ST_STATUS Status;
|
ST_STATUS Status;
|
||||||
|
|
||||||
KeBpalGetHandle(&BpalHandle);
|
KeBpalGetHandle(&BpalHandle);
|
||||||
@@ -85,9 +185,23 @@ MmProbeMemory(VOID)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Base = PMA_TO_VMA(Entry.Base);
|
||||||
|
for (Offset = 0; Offset < Entry.Length; Offset += PAGESIZE) {
|
||||||
|
Vma = PTR_OFFSET(Base, Offset);
|
||||||
|
MmPfdAppend(&PfdList, Vma);
|
||||||
|
EntryCount++;
|
||||||
|
|
||||||
|
/* Display a little loader as this takes awhile */
|
||||||
|
if ((EntryCount & (LOAD_DELAY - 1)) == 0) {
|
||||||
|
MmLoadUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UsableMemory += Entry.Length;
|
UsableMemory += Entry.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE("\b\x1b[?25h");
|
||||||
|
DTRACE("%d entries populated\n", EntryCount);
|
||||||
MmPrintUnits(UsableMemory, "avl");
|
MmPrintUnits(UsableMemory, "avl");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user