Copy JKernel (#126)

* start JSystem

* JKRAram and JUTGamePad

* started heap and thread

* more JKernel

* mostly finished JKernel

* delete unused asm

* JKRFileFinder

* delete unused asm and match findNextFile

* format

* fix mtx_vec
This commit is contained in:
lepelog
2021-05-02 20:03:24 -04:00
committed by GitHub
parent 3b7364d481
commit 8fd9f2ab5d
360 changed files with 6646 additions and 12699 deletions
+128 -137
View File
@@ -4,57 +4,9 @@
//
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRAramBlock> */
struct JSUList__template6 {
/* 802D32B0 */ void func_802D32B0(void* _this);
};
struct JKRHeap {
/* 802CE83C */ void findFromRoot(void*);
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
struct JKRAramHeap {
struct EAllocMode {};
/* 802D2E44 */ JKRAramHeap(u32, u32);
/* 802D2F14 */ ~JKRAramHeap();
/* 802D2FBC */ void alloc(u32, JKRAramHeap::EAllocMode);
/* 802D3034 */ void allocFromHead(u32);
/* 802D30BC */ void allocFromTail(u32);
/* 802D3134 */ void getFreeSize();
/* 802D31AC */ void getTotalFreeSize();
/* 802D3218 */ void dump();
static u8 sAramList[12];
};
struct JKRAramBlock {
/* 802D3304 */ JKRAramBlock(u32, u32, u32, u8, bool);
/* 802D3434 */ void allocHead(u32, u8, JKRAramHeap*);
/* 802D34D0 */ void allocTail(u32, u8, JKRAramHeap*);
};
#include "global.h"
//
// Forward References:
@@ -72,10 +24,17 @@ extern "C" void __sinit_JKRAramHeap_cpp();
extern "C" void func_802D32B0(void* _this);
extern "C" u8 sAramList__11JKRAramHeap[12];
extern "C" void* __vt__11JKRAramHeap;
//
// External References:
//
// 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);
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
@@ -87,9 +46,6 @@ extern "C" void allocTail__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void OSInitMutex();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void __register_global_object();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
@@ -98,33 +54,40 @@ extern "C" void _restgpr_29();
// Declarations:
//
/* ############################################################################################## */
/* 803CC168-803CC178 029288 000C+04 2/2 0/0 0/0 .data __vt__11JKRAramHeap */
SECTION_DATA extern void* __vt__11JKRAramHeap[3 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11JKRAramHeapFv,
/* padding */
NULL,
};
/* 80434300-8043430C 061020 000C+00 1/1 0/0 0/0 .bss @297 */
static u8 lit_297[12];
/* 8043430C-80434318 06102C 000C+00 8/8 0/0 0/0 .bss sAramList__11JKRAramHeap */
u8 JKRAramHeap::sAramList[12];
JSUList<JKRAramBlock> JKRAramHeap::sAramList;
/* 802D2E44-802D2F14 2CD784 00D0+00 0/0 1/1 0/0 .text __ct__11JKRAramHeapFUlUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramHeap::JKRAramHeap(u32 param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/__ct__11JKRAramHeapFUlUl.s"
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);
}
#pragma pop
/* 802D2F14-802D2FBC 2CD854 00A8+00 1/0 0/0 0/0 .text __dt__11JKRAramHeapFv */
// close match, regalloc problem in the beginning of the while loop
#ifdef 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
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -133,91 +96,119 @@ asm JKRAramHeap::~JKRAramHeap() {
#include "asm/JSystem/JKernel/JKRAramHeap/__dt__11JKRAramHeapFv.s"
}
#pragma pop
#endif
/* 802D2FBC-802D3034 2CD8FC 0078+00 0/0 5/5 0/0 .text
* alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::alloc(u32 param_0, JKRAramHeap::EAllocMode param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode.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;
}
#pragma pop
/* 802D3034-802D30BC 2CD974 0088+00 1/1 0/0 0/0 .text allocFromHead__11JKRAramHeapFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::allocFromHead(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/allocFromHead__11JKRAramHeapFUl.s"
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;
}
#pragma pop
/* 802D30BC-802D3134 2CD9FC 0078+00 1/1 0/0 0/0 .text allocFromTail__11JKRAramHeapFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::allocFromTail(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/allocFromTail__11JKRAramHeapFUl.s"
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;
}
#pragma pop
/* 802D3134-802D31AC 2CDA74 0078+00 0/0 1/1 0/0 .text getFreeSize__11JKRAramHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::getFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/getFreeSize__11JKRAramHeapFv.s"
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;
}
#pragma pop
/* 802D31AC-802D3218 2CDAEC 006C+00 0/0 2/2 0/0 .text getTotalFreeSize__11JKRAramHeapFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::getTotalFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/getTotalFreeSize__11JKRAramHeapFv.s"
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;
}
#pragma pop
/* 802D3218-802D326C 2CDB58 0054+00 0/0 2/2 0/0 .text dump__11JKRAramHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::dump() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/dump__11JKRAramHeapFv.s"
}
#pragma pop
void JKRAramHeap::dump(void) {
lock();
/* 802D326C-802D32B0 2CDBAC 0044+00 0/0 1/0 0/0 .text __sinit_JKRAramHeap_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRAramHeap_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/__sinit_JKRAramHeap_cpp.s"
}
#pragma pop
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
// The debug version calls OSReport
}
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D326C, __sinit_JKRAramHeap_cpp);
#pragma pop
/* 802D32B0-802D3304 2CDBF0 0054+00 1/1 0/0 0/0 .text __dt__23JSUList<12JKRAramBlock>Fv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D32B0(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/func_802D32B0.s"
unlock();
}
#pragma pop