misc modifications
This commit is contained in:
parent
d13472712d
commit
69b0a65a0f
|
@ -42,7 +42,7 @@ typedef struct AllocatedPage_t{
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
ulong MmAllocPageFrame(void **frameListPtr, size_t *pageNumber, size_t size, bool contiguous);
|
ulong MmAllocPageFrame(void ***frameListPtr, size_t *pageNumber, size_t size, bool contiguous);
|
||||||
void MmFreePageFrame(ulong id);
|
void MmFreePageFrame(ulong id);
|
||||||
|
|
||||||
error_t MmTestBusyPage(void);
|
error_t MmTestBusyPage(void);
|
||||||
|
|
|
@ -105,7 +105,8 @@ static error_t InitMemoryMap(void)
|
||||||
return EOK;
|
return EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t MmGetAvailZoneSize(void *start) {
|
size_t MmGetAvailZoneSize(void *start)
|
||||||
|
{
|
||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
// Because the kernel is the kernel
|
// Because the kernel is the kernel
|
||||||
|
@ -129,7 +130,8 @@ size_t MmGetAvailZoneSize(void *start) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MmIsFailingZoneSize(void *start) {
|
bool MmIsFailingZoneSize(void *start)
|
||||||
|
{
|
||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
// Because the kernel is the kernel
|
// Because the kernel is the kernel
|
||||||
|
@ -153,7 +155,8 @@ bool MmIsFailingZoneSize(void *start) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *MmGetFirstAvailZone(void *start) {
|
void *MmGetFirstAvailZone(void *start)
|
||||||
|
{
|
||||||
uint i;
|
uint i;
|
||||||
void *current = 0;
|
void *current = 0;
|
||||||
|
|
||||||
|
@ -194,7 +197,8 @@ void *MmGetFirstAvailZone(void *start) {
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmPrintMemoryMap(void) {
|
void MmPrintMemoryMap(void)
|
||||||
|
{
|
||||||
char avStr[15];
|
char avStr[15];
|
||||||
extern int shcol;
|
extern int shcol;
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,11 @@ static bool isPageBusy(void *phyPageAddr)
|
||||||
AllocatedPage_t *busyPage = &busyPagesList;
|
AllocatedPage_t *busyPage = &busyPagesList;
|
||||||
bool isBusy = false;
|
bool isBusy = false;
|
||||||
|
|
||||||
|
// In case of NVS, ACPI or BADRAM zone, considered busy
|
||||||
|
if (!MmGetAvailZoneSize(phyPageAddr))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Search in the busylist if the phy addr is here
|
||||||
while(busyPage->next) {
|
while(busyPage->next) {
|
||||||
busyPage = busyPage->next;
|
busyPage = busyPage->next;
|
||||||
if (phyPageAddr == busyPage->phyAddress) {
|
if (phyPageAddr == busyPage->phyAddress) {
|
||||||
|
@ -62,10 +67,15 @@ static bool isPageBusy(void *phyPageAddr)
|
||||||
static void printBusyPages(void)
|
static void printBusyPages(void)
|
||||||
{
|
{
|
||||||
AllocatedPage_t *busyPage = &busyPagesList;
|
AllocatedPage_t *busyPage = &busyPagesList;
|
||||||
|
|
||||||
|
if (!busyPage->next) {
|
||||||
|
KernLog("No busy page\n");
|
||||||
|
} else {
|
||||||
while(busyPage->next) {
|
while(busyPage->next) {
|
||||||
busyPage = busyPage->next;
|
busyPage = busyPage->next;
|
||||||
KernLog("Busy page at %p\n", busyPage->phyAddress);
|
KernLog("Busy page at %p\n", busyPage->phyAddress);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addPageToBusyList(void *phyPageAddr, ulong id)
|
static void addPageToBusyList(void *phyPageAddr, ulong id)
|
||||||
|
@ -102,12 +112,12 @@ static void removePageFromBusyList(void *phyPageAddr)
|
||||||
//
|
//
|
||||||
// Returns an id to identify a page frame allocated (kernel)
|
// Returns an id to identify a page frame allocated (kernel)
|
||||||
//
|
//
|
||||||
ulong MmAllocPageFrame(void **frameListPtr, size_t *pageNumber, size_t size, bool contiguous)
|
ulong MmAllocPageFrame(void ***frameListPtr, size_t *pageNumber, size_t size, bool contiguous)
|
||||||
{
|
{
|
||||||
static ulong id = 0;
|
static ulong id = 0;
|
||||||
*pageNumber = (((ulong)size - 1) / KPAGESIZE) + 1;
|
*pageNumber = (((ulong)size - 1) / KPAGESIZE) + 1;
|
||||||
|
|
||||||
frameListPtr = (void**)malloc(sizeof(void*)*(*pageNumber));
|
*frameListPtr = (void**)malloc(sizeof(void*)*(*pageNumber));
|
||||||
size_t curNumber = 0;
|
size_t curNumber = 0;
|
||||||
bool inBlock = false;
|
bool inBlock = false;
|
||||||
|
|
||||||
|
@ -121,7 +131,7 @@ ulong MmAllocPageFrame(void **frameListPtr, size_t *pageNumber, size_t size, boo
|
||||||
|
|
||||||
for (void *curPage = (void*)MmPhysLastKernAddress; curPage < (void*)phRamSize; curPage += KPAGESIZE) {
|
for (void *curPage = (void*)MmPhysLastKernAddress; curPage < (void*)phRamSize; curPage += KPAGESIZE) {
|
||||||
if (!isPageBusy(curPage)) {
|
if (!isPageBusy(curPage)) {
|
||||||
frameListPtr[curNumber] = curPage;
|
(*frameListPtr)[curNumber] = curPage;
|
||||||
inBlock = true;
|
inBlock = true;
|
||||||
//DebugLog("Select page : %p\n", curPage);
|
//DebugLog("Select page : %p\n", curPage);
|
||||||
if (++curNumber >= *pageNumber) {
|
if (++curNumber >= *pageNumber) {
|
||||||
|
@ -136,8 +146,8 @@ ulong MmAllocPageFrame(void **frameListPtr, size_t *pageNumber, size_t size, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < *pageNumber; i++) {
|
for (size_t i = 0; i < *pageNumber; i++) {
|
||||||
addPageToBusyList(frameListPtr[i], id);
|
addPageToBusyList((*frameListPtr)[i], id);
|
||||||
//DebugLog("Allocating page : %p\n", frameListPtr[i]);
|
//DebugLog("Allocating page : %p\n", *frameListPtr[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
|
@ -164,53 +174,64 @@ error_t MmTestBusyPage(void)
|
||||||
DebugLog("\nBusy pages\n");
|
DebugLog("\nBusy pages\n");
|
||||||
printBusyPages();
|
printBusyPages();
|
||||||
|
|
||||||
DebugLog("\nAlloc 6677 bytes\n");
|
|
||||||
void **ptr = NULL;
|
void **ptr = NULL;
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
ulong id1 = MmAllocPageFrame (ptr, &n, 6677, NORMAL);
|
ulong id1 = MmAllocPageFrame(&ptr, &n, 6677, NORMAL);
|
||||||
|
DebugLog("\nAlloc 6677 bytes : %p, %d pages, first at %p\n", ptr, n, ptr[0]);
|
||||||
|
|
||||||
DebugLog("\nAlloc 9045 bytes\n");
|
|
||||||
void **ptr2 = NULL;
|
void **ptr2 = NULL;
|
||||||
size_t n2 = 0;
|
size_t n2 = 0;
|
||||||
ulong id2 = MmAllocPageFrame (ptr2, &n2, 9045, NORMAL);
|
ulong id2 = MmAllocPageFrame(&ptr2, &n2, 9045, NORMAL);
|
||||||
|
DebugLog("\nAlloc 9045 bytes: %p, %d pages, first at %p\n", ptr2, n2, ptr2[0]);
|
||||||
|
|
||||||
DebugLog("\nAlloc 1200 bytes\n");
|
|
||||||
void **ptr3 = NULL;
|
void **ptr3 = NULL;
|
||||||
size_t n3 = 0;
|
size_t n3 = 0;
|
||||||
ulong id3 = MmAllocPageFrame (ptr3, &n3, 1200, NORMAL);
|
ulong id3 = MmAllocPageFrame(&ptr3, &n3, 1200, NORMAL);
|
||||||
|
DebugLog("\nAlloc 1200 bytes: %p, %d pages, first at %p\n", ptr3, n3, ptr3[0]);
|
||||||
|
|
||||||
DebugLog("\nAlloc 4096 bytes\n");
|
|
||||||
void **ptr4 = NULL;
|
void **ptr4 = NULL;
|
||||||
size_t n4 = 0;
|
size_t n4 = 0;
|
||||||
ulong id4 = MmAllocPageFrame (ptr3, &n3, 4096, NORMAL);
|
ulong id4 = MmAllocPageFrame(&ptr4, &n4, 4096, NORMAL);
|
||||||
|
DebugLog("\nAlloc 4096 bytes: %p, %d pages, first at %p\n", ptr4, n4, ptr4[0]);
|
||||||
DebugLog("\nAlloc 4097 bytes\n");
|
|
||||||
void **ptr5 = NULL;
|
void **ptr5 = NULL;
|
||||||
size_t n5 = 0;
|
size_t n5 = 0;
|
||||||
ulong id5 = MmAllocPageFrame (ptr3, &n3, 4097, NORMAL);
|
ulong id5 = MmAllocPageFrame(&ptr5, &n5, 4097, NORMAL);
|
||||||
|
DebugLog("\nAlloc 4097 bytes: %p, %d pages, first at %p\n", ptr5, n5, ptr5[0]);
|
||||||
|
|
||||||
printBusyPages();
|
printBusyPages();
|
||||||
|
|
||||||
DebugLog("\nFree 6677 and 1200 bytes\n");
|
|
||||||
MmFreePageFrame(id1);
|
MmFreePageFrame(id1);
|
||||||
MmFreePageFrame(id3);
|
MmFreePageFrame(id3);
|
||||||
|
DebugLog("\nFree 6677 and 1200 bytes\n");
|
||||||
|
|
||||||
DebugLog("\nAlloc 10000 bytes\n");
|
|
||||||
void **ptr6 = NULL;
|
void **ptr6 = NULL;
|
||||||
size_t n6 = 0;
|
size_t n6 = 0;
|
||||||
ulong id6 = MmAllocPageFrame (ptr3, &n3, 10000, NORMAL);
|
ulong id6 = MmAllocPageFrame(&ptr6, &n6, 10000, NORMAL);
|
||||||
|
DebugLog("\nAlloc 10000 bytes: %p, %d pages, first at %p\n", ptr6, n6, ptr6[0]);
|
||||||
|
|
||||||
printBusyPages();
|
printBusyPages();
|
||||||
|
|
||||||
DebugLog("\nFree 10000 bytes\n");
|
|
||||||
MmFreePageFrame(id6);
|
MmFreePageFrame(id6);
|
||||||
|
DebugLog("\nFree 10000 bytes\n");
|
||||||
|
|
||||||
printBusyPages();
|
printBusyPages();
|
||||||
|
|
||||||
DebugLog("\nAlloc 10000 bytes contiguous\n");
|
|
||||||
void **ptr7 = NULL;
|
void **ptr7 = NULL;
|
||||||
size_t n7 = 0;
|
size_t n7 = 0;
|
||||||
ulong id7 = MmAllocPageFrame (ptr3, &n3, 10000, CONTIGUOUS);
|
ulong id7 = MmAllocPageFrame(&ptr7, &n7, 10000, CONTIGUOUS);
|
||||||
|
DebugLog("\nAlloc 10000 bytes contiguous: %p, %d pages, first at %p\n", ptr7, n7, ptr7[0]);
|
||||||
|
|
||||||
|
printBusyPages();
|
||||||
|
|
||||||
|
MmFreePageFrame(id1);
|
||||||
|
MmFreePageFrame(id2);
|
||||||
|
MmFreePageFrame(id3);
|
||||||
|
MmFreePageFrame(id4);
|
||||||
|
MmFreePageFrame(id5);
|
||||||
|
MmFreePageFrame(id6);
|
||||||
|
MmFreePageFrame(id7);
|
||||||
|
DebugLog("\nFree all bytes\n");
|
||||||
|
|
||||||
printBusyPages();
|
printBusyPages();
|
||||||
|
|
||||||
|
|
|
@ -254,11 +254,6 @@ error_t CmdPageUnmap(int argc, char **argv, char *cmdline)
|
||||||
|
|
||||||
error_t CmdPageBlock(int argc, char **argv, char *cmdline)
|
error_t CmdPageBlock(int argc, char **argv, char *cmdline)
|
||||||
{
|
{
|
||||||
size_t size = (size_t)atoi(argv[1]);
|
|
||||||
bool usermode = (bool)atoi(argv[2]);
|
|
||||||
|
|
||||||
size_t pageNum = 0;
|
|
||||||
|
|
||||||
error_t err = MmTestBusyPage();
|
error_t err = MmTestBusyPage();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue