JKRSolidHeap (#69)

* JKRSolidHeap progress

* JKRSolidHeap, added const to virtual functions, and JKRHeap::TState

* fixed braces

* fix function overload

* clang-format

Co-authored-by: Julgodis <>
Co-authored-by: Pheenoh <pheenoh@gmail.com>
This commit is contained in:
Jonathan Wase
2021-01-06 20:33:03 -05:00
committed by GitHub
co-authored by Julgodis <> Pheenoh
parent 0cf65151b3
commit 88fca194f8
65 changed files with 525 additions and 686 deletions
+7 -7
View File
@@ -28,8 +28,8 @@ void JKRAssertHeap::do_destroy(void) {
this->~JKRAssertHeap();
}
u32 JKRAssertHeap::getHeapType(void) {
return 0x41535448; // FOURCC("ASTH")
u32 JKRAssertHeap::getHeapType(void) const {
return 'ASTH';
}
bool JKRAssertHeap::check(void) {
@@ -48,7 +48,7 @@ u8 JKRAssertHeap::do_changeGroupID(u8) {
return 0;
}
u8 JKRAssertHeap::do_getCurrentGroupId(void) {
u8 JKRAssertHeap::do_getCurrentGroupId(void) const {
return 0;
}
@@ -68,18 +68,18 @@ s32 JKRAssertHeap::do_resize(void*, u32) {
return 0;
}
s32 JKRAssertHeap::do_getSize(void*) {
s32 JKRAssertHeap::do_getSize(void*) const {
return 0;
}
s32 JKRAssertHeap::do_getFreeSize(void) {
s32 JKRAssertHeap::do_getFreeSize(void) const {
return 0;
}
void* JKRAssertHeap::do_getMaxFreeBlock(void) {
void* JKRAssertHeap::do_getMaxFreeBlock(void) const {
return NULL;
}
s32 JKRAssertHeap::do_getTotalFreeSize(void) {
s32 JKRAssertHeap::do_getTotalFreeSize(void) const {
return 0;
}
+6 -6
View File
@@ -86,22 +86,22 @@ asm s32 JKRExpHeap::do_resize(void*, u32) {
#include "JSystem/JKernel/JKRExpHeap/asm/func_802CF978.s"
}
asm s32 JKRExpHeap::do_getSize(void*) {
asm s32 JKRExpHeap::do_getSize(void*) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802CFB24.s"
}
asm s32 JKRExpHeap::do_getFreeSize(void) {
asm s32 JKRExpHeap::do_getFreeSize(void) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802CFBA4.s"
}
asm void* JKRExpHeap::do_getMaxFreeBlock(void) {
asm void* JKRExpHeap::do_getMaxFreeBlock(void) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802CFC10.s"
}
asm s32 JKRExpHeap::do_getTotalFreeSize(void) {
asm s32 JKRExpHeap::do_getTotalFreeSize(void) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802CFC84.s"
}
@@ -200,12 +200,12 @@ asm bool JKRExpHeap::state_compare(JKRHeap::TState const&, JKRHeap::TState const
#include "JSystem/JKernel/JKRExpHeap/asm/func_802D09E0.s"
}
asm u32 JKRExpHeap::getHeapType(void) {
asm u32 JKRExpHeap::getHeapType(void) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802D0A10.s"
}
asm u8 JKRExpHeap::do_getCurrentGroupId(void) {
asm u8 JKRExpHeap::do_getCurrentGroupId(void) const {
nofralloc
#include "JSystem/JKernel/JKRExpHeap/asm/func_802D0A1C.s"
}
+33 -8
View File
@@ -5,8 +5,8 @@ JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
: JKRDisposer(), mChildTree(this), mDisposerList() {
OSInitMutex(&mMutex);
mSize = size;
mStart = (u32)data;
mEnd = (u32)data + size;
mStart = (u8*)data;
mEnd = (u8*)data + size;
if (parent == NULL) {
becomeSystemHeap();
@@ -68,6 +68,7 @@ asm JKRHeap::~JKRHeap() {
#include "JSystem/JKernel/JKRHeap/asm/func_802CE264.s"
}
#endif
bool JKRHeap::initArena(char** memory, u32* size, int param_3) {
u32 ram_start;
u32 ram_end;
@@ -176,19 +177,19 @@ s32 JKRHeap::getSize(void* ptr, JKRHeap* heap) {
return heap->getSize(ptr);
}
s32 JKRHeap::getSize(void* ptr) {
s32 JKRHeap::getSize(void* ptr) const {
return do_getSize(ptr);
}
s32 JKRHeap::getFreeSize() {
s32 JKRHeap::getFreeSize() const {
return do_getFreeSize();
}
void* JKRHeap::getMaxFreeBlock() {
void* JKRHeap::getMaxFreeBlock() const {
return do_getMaxFreeBlock();
}
s32 JKRHeap::getTotalFreeSize() {
s32 JKRHeap::getTotalFreeSize() const {
return do_getTotalFreeSize();
}
@@ -198,7 +199,7 @@ u8 JKRHeap::changeGroupID(u8 param_1) {
// "not/nor" instruction in the wrong place
#ifdef NONMATCHING
s32 JKRHeap::getMaxAllocatableSize(int alignment) {
s32 JKRHeap::getMaxAllocatableSize(int alignment) const {
u32 maxFreeBlock = (u32)getMaxFreeBlock();
s32 freeSize = getFreeSize();
@@ -208,7 +209,7 @@ s32 JKRHeap::getMaxAllocatableSize(int alignment) {
return alignedSize;
}
#else
asm s32 JKRHeap::getMaxAllocatableSize(int alignment) {
asm u32 JKRHeap::getMaxAllocatableSize(int alignment) const {
nofralloc
#include "JSystem/JKernel/JKRHeap/asm/func_802CE7DC.s"
}
@@ -412,3 +413,27 @@ void operator delete(void* ptr) {
void operator delete[](void* ptr) {
JKRHeap::free(ptr, NULL);
}
void JKRHeap::state_register(JKRHeap::TState* p, u32 id) const {
JUT_ASSERT(p != 0);
JUT_ASSERT(p->getHeap() == this);
}
bool JKRHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT(r1.getHeap() == r2.getHeap());
return r1.getCheckCode() == r2.getCheckCode();
}
void JKRHeap::state_dump(JKRHeap::TState const& p) const {
LOGF("check-code : 0x%08x", p.getCheckCode());
LOGF("id : 0x%08x", p.getId());
LOGF("used size : %u", p.getUsedSize());
}
u8 JKRHeap::do_changeGroupID(u8 newGroupID) {
return 0;
}
u8 JKRHeap::do_getCurrentGroupId() const {
return 0;
}
+244 -55
View File
@@ -1,112 +1,301 @@
#include "JSystem/JKernel/JKRSolidHeap/JKRSolidHeap.h"
#include "global.h"
asm void JKRSolidHeap::create(unsigned long, JKRHeap*, bool) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0A24.s"
JKRSolidHeap* JKRSolidHeap::create(u32 size, JKRHeap* heap, bool useErrorHandler) {
if (!heap) {
heap = getRootHeap();
}
if (size == 0xffffffff) {
size = heap->getMaxAllocatableSize(0x10);
}
u32 alignedSize = ALIGN_PREV(size, 0x10);
u32 solidHeapSize = ALIGN_NEXT(sizeof(JKRSolidHeap), 0x10);
if (alignedSize < solidHeapSize)
return NULL;
JKRSolidHeap* solidHeap = (JKRSolidHeap*)JKRAllocFromHeap(heap, alignedSize, 0x10);
void* dataPtr = (u8*)solidHeap + solidHeapSize;
if (!solidHeap)
return NULL;
solidHeap =
new (solidHeap) JKRSolidHeap(dataPtr, alignedSize - solidHeapSize, heap, useErrorHandler);
return solidHeap;
}
asm void JKRSolidHeap::do_destroy(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0AD0.s"
void JKRSolidHeap::do_destroy(void) {
JKRHeap* parent = getParent();
if (parent) {
this->~JKRSolidHeap();
JKRFreeToHeap(parent, this);
}
}
asm JKRSolidHeap::JKRSolidHeap(void*, unsigned long, JKRHeap*, bool) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0B30.s"
JKRSolidHeap::JKRSolidHeap(void* start, u32 size, JKRHeap* parent, bool useErrorHandler)
: JKRHeap(start, size, parent, useErrorHandler) {
mFreeSize = mSize;
mSolidHead = (u8*)mStart;
mSolidTail = (u8*)mEnd;
field_0x78 = NULL;
}
asm JKRSolidHeap::~JKRSolidHeap(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0B8C.s"
JKRSolidHeap::~JKRSolidHeap(void) {
dispose();
}
asm void JKRSolidHeap::adjustSize(void) {
#ifdef NONMATCHING
s32 JKRSolidHeap::adjustSize(void) {
JKRHeap* parent = getParent();
if (parent) {
lock();
s32 start = mStart;
s32 newSize = (s32)this->mSolidHead - ALIGN_NEXT(start, 0x20);
s32 newSizeThis = newSize + (start - (s32)this);
s32 actualSize = parent->resize(this, newSizeThis);
if (actualSize != -1) {
mFreeSize = 0;
mSize = newSize;
mEnd = mStart + mSize;
mSolidHead = (void*)mEnd;
mSolidTail = (void*)mEnd;
}
unlock();
return newSizeThis;
}
return -1;
}
#else
asm s32 JKRSolidHeap::adjustSize(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0BF4.s"
}
#endif
asm void* JKRSolidHeap::do_alloc(unsigned long, int) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0CB0.s"
void* JKRSolidHeap::do_alloc(u32 size, int alignment) {
if (alignment != 0) {
JUT_ASSERT(abs(alignment));
JUT_ASSERT(isPower2(alignment));
}
lock();
if (size < 4) {
size = 4;
}
void* ptr;
if (alignment >= 0) {
ptr = allocFromHead(size, alignment < 4 ? 4 : alignment);
} else {
if (-alignment < 4) {
alignment = 4;
} else {
alignment = -alignment;
}
ptr = allocFromTail(size, alignment);
}
unlock();
return ptr;
}
asm void JKRSolidHeap::allocFromHead(unsigned long, int) {
#ifdef NONMATCHING
void* JKRSolidHeap::allocFromHead(u32 size, int alignment) {
void* ptr;
u32 offset;
u32 alignedSize;
u32 alignedStart;
u32 totalSize;
alignedSize = ALIGN_NEXT(size, 0x4);
ptr = NULL;
alignedStart = (alignment - 1 + (u32)mSolidHead) & ~(alignment - 1);
offset = alignedStart - (u32)mSolidHead;
totalSize = alignedSize + offset;
if (totalSize <= mFreeSize) {
ptr = (void*)alignedStart;
mSolidHead += totalSize;
mFreeSize -= totalSize;
} else {
// "allocFromHead: cannot alloc memory (0x%x byte).\n"
const char* format = lbl_8039CE50;
JUTWarningConsole_f(format, totalSize);
if (getErrorFlag() == true) {
callErrorHandler(this, alignedSize, alignment);
}
}
return ptr;
}
#else
asm void* JKRSolidHeap::allocFromHead(u32, int) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0D58.s"
}
#endif
asm void JKRSolidHeap::allocFromTail(unsigned long, int) {
asm void* JKRSolidHeap::allocFromTail(u32, int) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0E20.s"
}
asm void JKRSolidHeap::do_free(void*) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0EE4.s"
void JKRSolidHeap::do_free(void* ptr) {
// "free: cannot free memory block (%08x)\n"
const char* format = lbl_8039CE50 + 0x62;
JUTWarningConsole_f(format, ptr);
}
asm void JKRSolidHeap::do_freeAll(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0F14.s"
void JKRSolidHeap::do_freeAll(void) {
lock();
this->JKRHeap::callAllDisposer();
mFreeSize = mSize;
mSolidHead = (u8*)mStart;
mSolidTail = (u8*)mEnd;
field_0x78 = NULL;
unlock();
}
asm void JKRSolidHeap::do_freeTail(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D0F74.s"
void JKRSolidHeap::do_freeTail(void) {
lock();
if (mSolidTail != mEnd) {
dispose(mSolidTail, mEnd);
}
this->mFreeSize = ((u32)mEnd - (u32)mSolidTail + mFreeSize);
this->mSolidTail = mEnd;
JKRSolidHeap::Unknown* unknown = field_0x78;
while (unknown) {
unknown->field_0xc = mEnd;
unknown = unknown->mNext;
}
unlock();
}
asm void JKRSolidHeap::do_fillFreeArea(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1000.s"
void JKRSolidHeap::do_fillFreeArea(void) {
#if DEBUG
fillMemory(mSolidHead, mEnd - mSolidHead, (uint)DAT_8074a8ba);
#endif
}
asm s32 JKRSolidHeap::do_resize(void*, unsigned long) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1004.s"
s32 JKRSolidHeap::do_resize(void* ptr, u32 newSize) {
// "resize: cannot resize memory block (%08x: %d)\n"
const char* format = lbl_8039CE50 + 0x89;
JUTWarningConsole_f(format, ptr, newSize);
return -1;
}
asm s32 JKRSolidHeap::do_getSize(void*) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1038.s"
s32 JKRSolidHeap::do_getSize(void* ptr) const {
// "getSize: cannot get memory block size (%08x)\n"
const char* format = lbl_8039CE50 + 0xB8;
JUTWarningConsole_f(format, ptr);
return -1;
}
asm bool JKRSolidHeap::check(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D106C.s"
bool JKRSolidHeap::check(void) {
lock();
bool result = true;
u32 calculatedSize =
((u32)mSolidHead - (u32)mStart) + mFreeSize + ((u32)mEnd - (u32)mSolidTail);
u32 availableSize = mSize;
if (calculatedSize != availableSize) {
result = false;
// "check: bad total memory block size (%08X, %08X)\n"
const char* format = lbl_8039CE50 + 0xE6;
JUTWarningConsole_f(format, availableSize, calculatedSize);
}
unlock();
return result;
}
// problem: int -> float conversion creates a temporary value (lbl_80455FA0 = 4.503599627370496E15).
// Because the value is compiler generated the location in the .dol will not be the same as in the
// original .dol file.
#ifdef NONMATCHING
bool JKRSolidHeap::dump(void) {
bool result = check();
lock();
u32 headSize = ((u32)mSolidHead - (u32)mStart);
u32 tailSize = ((u32)mEnd - (u32)mSolidTail);
s32 htSize = headSize + tailSize;
const char* format1 = lbl_8039CE50 + 0x117; // "head %08x: %08x\n"
JUTReportConsole_f(format1, mStart, headSize);
const char* format2 = lbl_8039CE50 + 0x128; // "tail %08x: %08x\n"
JUTReportConsole_f(format2, mSolidTail, ((u32)mEnd - (u32)mSolidTail));
u32 totalSize = mSize;
float percentage = (float)htSize / (float)totalSize * lbl_80455FA8;
const char* format3 = lbl_8039CE50 + 0x139; // "%d / %d bytes (%6.2f%%) used\n"
JUTReportConsole_f(format3, htSize, totalSize, percentage);
unlock();
return result;
}
#else
asm bool JKRSolidHeap::dump(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D10FC.s"
}
#endif
asm void JKRSolidHeap::state_register(JKRHeap::TState*, unsigned long) const {
// full match expect using the wrong register
#ifdef NONMATCHING
void JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const {
JUT_ASSERT(p != 0);
JUT_ASSERT(p->getHeap() == this);
getState_(p);
setState_u32ID_(p, id);
setState_uUsedSize_(p, getUsedSize());
setState_u32CheckCode_(p, (u32)mSolidHead + (u32)mSolidTail * 3);
}
#else
asm void JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D11FC.s"
}
#endif
asm bool JKRSolidHeap::state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1258.s"
bool JKRSolidHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT(r1.getHeap() == r2.getHeap());
bool result = true;
if (r1.getCheckCode() != r2.getCheckCode()) {
result = false;
}
if (r1.getUsedSize() != r2.getUsedSize()) {
result = false;
}
return result;
}
asm u32 JKRSolidHeap::getHeapType(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1288.s"
u32 JKRSolidHeap::getHeapType(void) const {
return 'SLID';
}
asm s32 JKRSolidHeap::do_getFreeSize(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D1294.s"
s32 JKRSolidHeap::do_getFreeSize(void) const {
return mFreeSize;
}
asm void* JKRSolidHeap::do_getMaxFreeBlock(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D129C.s"
void* JKRSolidHeap::do_getMaxFreeBlock(void) const {
return mSolidHead;
}
asm s32 JKRSolidHeap::do_getTotalFreeSize(void) {
nofralloc
#include "JSystem/JKernel/JKRSolidHeap/asm/func_802D12A4.s"
s32 JKRSolidHeap::do_getTotalFreeSize(void) const {
return getFreeSize();
}