Files
tp/libs/JSystem/JKernel/JKRAramHeap.cpp
T

215 lines
6.1 KiB
C++
Raw Normal View History

2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Generated By: dol2asm
// Translation Unit: JKRAramHeap
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
#include "JSystem/JKernel/JKRAramHeap.h"
2021-05-03 02:03:24 +02:00
#include "JSystem/JKernel/JKRHeap.h"
2021-03-28 22:49:05 +02:00
#include "dol2asm.h"
2021-05-03 02:03:24 +02:00
#include "global.h"
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Forward References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
extern "C" void __ct__11JKRAramHeapFUlUl();
extern "C" void __dt__11JKRAramHeapFv();
extern "C" void alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode();
extern "C" void allocFromHead__11JKRAramHeapFUl();
extern "C" void allocFromTail__11JKRAramHeapFUl();
extern "C" void getFreeSize__11JKRAramHeapFv();
extern "C" void getTotalFreeSize__11JKRAramHeapFv();
extern "C" void dump__11JKRAramHeapFv();
extern "C" void __sinit_JKRAramHeap_cpp();
extern "C" void func_802D32B0(void* _this);
2021-04-08 01:47:05 +02:00
extern "C" u8 sAramList__11JKRAramHeap[12];
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
extern "C" void* __vt__11JKRAramHeap;
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// External References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
// TODO: move to JKRHeap
void* operator new(u32 size);
void* operator new(u32 size, int alignment);
void* operator new(u32 size, JKRHeap* heap, int alignment);
2021-03-28 22:49:05 +02:00
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __ct__11JKRDisposerFv();
extern "C" void __dt__11JKRDisposerFv();
extern "C" void __ct__12JKRAramBlockFUlUlUlUcb();
extern "C" void allocHead__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void allocTail__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void __register_global_object();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Declarations:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 80434300-8043430C 061020 000C+00 1/1 0/0 0/0 .bss @297 */
2021-03-28 22:49:05 +02:00
static u8 lit_297[12];
2021-04-06 18:00:35 +02:00
/* 8043430C-80434318 06102C 000C+00 8/8 0/0 0/0 .bss sAramList__11JKRAramHeap */
2021-05-03 02:03:24 +02:00
JSUList<JKRAramBlock> JKRAramHeap::sAramList;
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802D2E44-802D2F14 2CD784 00D0+00 0/0 1/1 0/0 .text __ct__11JKRAramHeapFUlUl */
2021-05-03 02:03:24 +02:00
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);
sAramList.append(&block->mBlockLink);
2021-01-31 15:33:34 -05:00
}
2021-01-03 11:29:50 +01:00
2021-04-06 18:00:35 +02:00
/* 802D2F14-802D2FBC 2CD854 00A8+00 1/0 0/0 0/0 .text __dt__11JKRAramHeapFv */
2021-05-03 02:03:24 +02:00
// close match, regalloc problem in the beginning of the while loop
#ifdef NONMATCHING
JKRAramHeap::~JKRAramHeap() {
2022-12-19 11:06:32 -08:00
JSUList<JKRAramBlock>* list = &sAramList;
2021-05-03 02:03:24 +02:00
JSUListIterator<JKRAramBlock> iterator = list;
while (iterator != list->getEnd()) {
JSUListIterator<JKRAramBlock> prev = iterator;
JKRAramBlock* block = prev.getObject();
delete block;
}
}
#else
2021-03-28 22:49:05 +02:00
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
2021-01-03 11:29:50 +01:00
asm JKRAramHeap::~JKRAramHeap() {
2021-04-01 02:07:58 +02:00
nofralloc
2021-03-28 22:49:05 +02:00
#include "asm/JSystem/JKernel/JKRAramHeap/__dt__11JKRAramHeapFv.s"
2020-12-06 21:02:25 +01:00
}
2021-03-28 22:49:05 +02:00
#pragma pop
2021-05-03 02:03:24 +02:00
#endif
2020-12-06 21:02:25 +01:00
2021-04-06 18:00:35 +02:00
/* 802D2FBC-802D3034 2CD8FC 0078+00 0/0 5/5 0/0 .text
2021-04-01 02:07:58 +02:00
* alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode */
2021-05-03 02:03:24 +02:00
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;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D3034-802D30BC 2CD974 0088+00 1/1 0/0 0/0 .text allocFromHead__11JKRAramHeapFUl */
2021-05-03 02:03:24 +02:00
JKRAramBlock* JKRAramHeap::allocFromHead(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u32 bestFreeSize = UINT32_MAX;
JKRAramBlock* bestBlock = NULL;
JSUList<JKRAramBlock>* list = &sAramList;
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;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D30BC-802D3134 2CD9FC 0078+00 1/1 0/0 0/0 .text allocFromTail__11JKRAramHeapFUl */
2021-05-03 02:03:24 +02:00
JKRAramBlock* JKRAramHeap::allocFromTail(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
JKRAramBlock* tailBlock = NULL;
JSUList<JKRAramBlock>* list = &sAramList;
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;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D3134-802D31AC 2CDA74 0078+00 0/0 1/1 0/0 .text getFreeSize__11JKRAramHeapFv */
2021-05-03 02:03:24 +02:00
u32 JKRAramHeap::getFreeSize(void) {
u32 maxFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
if (iterator->mFreeSize > maxFreeSize) {
maxFreeSize = iterator->mFreeSize;
}
}
unlock();
return maxFreeSize;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D31AC-802D3218 2CDAEC 006C+00 0/0 2/2 0/0 .text getTotalFreeSize__11JKRAramHeapFv
*/
2021-05-03 02:03:24 +02:00
u32 JKRAramHeap::getTotalFreeSize(void) {
u32 totalFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
totalFreeSize += iterator->mFreeSize;
}
unlock();
return totalFreeSize;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D3218-802D326C 2CDB58 0054+00 0/0 2/2 0/0 .text dump__11JKRAramHeapFv */
2021-05-03 02:03:24 +02:00
void JKRAramHeap::dump(void) {
lock();
2020-12-06 21:02:25 +01:00
2021-05-03 02:03:24 +02:00
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
// The debug version calls OSReport
}
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
unlock();
2021-03-28 22:49:05 +02:00
}