JKRAramHeap and JKRAramPiece (#53)

* renamed func_XXX to _savegpr_XX

* renamed func_XXX to _restgpr_XX

* renamed func_XXX to _savefpr_XX

* renamed func_XXX to _restfpr_XX

* cleanup functions.h and moved intrisics to mwcc.h

* formatting

* cleanup functions.h

* Added include/ar/ARQ.h

* renamed func_XXX to _savegpr_25

* removed JKRAramPiece asm files

* JKRAramHeap OK, JKRAramPiece OK

* formatting

* more formatting

* Added const and removed explicit this->

* fixed merge problems

* changed mMessages[1] to mMessage

* foramatting

Co-authored-by: Julgodis <>
Co-authored-by: Pheenoh <pheenoh@gmail.com>
This commit is contained in:
Jonathan Wase
2021-01-03 11:29:50 +01:00
committed by GitHub
parent 0fdce6c042
commit 112e86f0e8
31 changed files with 32859 additions and 726 deletions
+123 -22
View File
@@ -1,44 +1,145 @@
#include "JSystem/JKernel/JKRAramHeap/JKRAramHeap.h"
#include "global.h"
asm JKRAramHeap::JKRAramHeap(u32, u32) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2E44.s"
#include "JSystem/JKernel/JKRAramBlock/JKRAramBlock.h"
JKRAramHeap::JKRAramHeap(u32 startAddress, u32 size) {
OSInitMutex(&mMutex);
mHeap = JKRHeap::findFromRoot(this);
mSize = ALIGN_PREV(size, 0x20);
mHeadAddress = ALIGN_NEXT(startAddress, 0x20);
mTailAddress = mHeadAddress + mSize;
mGroupId = -1;
JKRAramBlock* block = new (mHeap, 0) JKRAramBlock(mHeadAddress, 0, mSize, -1, false);
lbl_8043430C.append(&block->mBlockLink);
}
asm JKRAramHeap::~JKRAramHeap(void) {
// close match, regalloc problem in the beginning of the while loop
#if NONMATCHING
JKRAramHeap::~JKRAramHeap() {
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list;
while (iterator != list->getEnd()) {
JSUListIterator<JKRAramBlock> prev = iterator;
JKRAramBlock* block = prev.getObject();
delete block;
}
}
#else
asm JKRAramHeap::~JKRAramHeap() {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2F14.s"
}
#endif
asm void JKRAramHeap::alloc(u32, JKRAramHeap::EAllocMode) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D2FBC.s"
JKRAramBlock* JKRAramHeap::alloc(u32 size, JKRAramHeap::EAllocMode allocationMode) {
lock();
JKRAramBlock* block;
if (allocationMode == JKRAramHeap::HEAD) {
block = allocFromHead(size);
} else {
block = allocFromTail(size);
}
unlock();
return block;
}
asm void JKRAramHeap::allocFromHead(u32) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3034.s"
JKRAramBlock* JKRAramHeap::allocFromHead(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u32 bestFreeSize = UINT32_MAX;
JKRAramBlock* bestBlock = NULL;
JSUList<JKRAramBlock>* list = &lbl_8043430C;
for (JSUListIterator<JKRAramBlock> iterator = list; iterator != list->getEnd(); ++iterator) {
JKRAramBlock* block = iterator.getObject();
if (block->mFreeSize < alignedSize)
continue;
if (bestFreeSize <= block->mFreeSize)
continue;
bestFreeSize = block->mFreeSize;
bestBlock = block;
if (block->mFreeSize == alignedSize) {
break;
}
}
if (bestBlock) {
return bestBlock->allocHead(alignedSize, mGroupId, this);
}
return NULL;
}
asm void JKRAramHeap::allocFromTail(u32) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D30BC.s"
JKRAramBlock* JKRAramHeap::allocFromTail(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
JKRAramBlock* tailBlock = NULL;
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list->getLast();
for (; iterator != list->getEnd(); --iterator) {
JKRAramBlock* block = iterator.getObject();
if (block->mFreeSize >= alignedSize) {
tailBlock = block;
break;
}
}
if (tailBlock) {
return tailBlock->allocTail(alignedSize, mGroupId, this);
}
return NULL;
}
asm void JKRAramHeap::getFreeSize(void) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3134.s"
u32 JKRAramHeap::getFreeSize(void) {
u32 maxFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
if (iterator->mFreeSize > maxFreeSize) {
maxFreeSize = iterator->mFreeSize;
}
}
unlock();
return maxFreeSize;
}
asm void JKRAramHeap::getTotalFreeSize(void) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D31AC.s"
u32 JKRAramHeap::getTotalFreeSize(void) {
u32 totalFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
totalFreeSize += iterator->mFreeSize;
}
unlock();
return totalFreeSize;
}
asm void JKRAramHeap::dump(void) {
nofralloc
#include "JSystem/JKernel/JKRAramHeap/asm/func_802D3218.s"
void JKRAramHeap::dump(void) {
lock();
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
// The debug version calls OSReport
}
unlock();
}
#if 0