From d75f4c92efc8f0ca868b2f77f34fda49ce8c219d Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 1 Oct 2024 14:48:49 +0200 Subject: [PATCH] d_heap OK (#47) * d_heap OK * wibo workaround --- config/SOUE01/symbols.txt | 22 +++++++++++----------- configure.py | 2 +- include/d/d_heap_alloc.h | 24 ++++++++---------------- include/egg/core/eggHeap.h | 32 ++++++++++++++++++++++++++++++++ src/d/d_heap.cpp | 4 +++- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ce7b6e34..16238f2f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2232,7 +2232,7 @@ __nw__FUl = .text:0x80054EC0; // type:function size:0xC __nwa__FUl = .text:0x80054ED0; // type:function size:0xC __dl__FPv = .text:0x80054EE0; // type:function size:0x8 __dla__FPv = .text:0x80054EF0; // type:function size:0x8 -__sinit_\d_heap_cpp = .text:0x80054F00; // type:function size:0x30 +__sinit_\d_heap_cpp = .text:0x80054F00; // type:function size:0x30 scope:local fn_80054F30 = .text:0x80054F30; // type:function size:0x4 fn_80054F40 = .text:0x80054F40; // type:function size:0x4 getUsedLanguageNTSCNum = .text:0x80054F50; // type:function size:0x38 @@ -27836,15 +27836,15 @@ DYNAMIC_NAME_TABLE = .rodata:0x804DCBF0; // type:object size:0x13E0 lbl_804DDFD0 = .rodata:0x804DDFD0; // type:object size:0xC data:4byte lbl_804DDFDC = .rodata:0x804DDFDC; // type:object size:0x14 data:4byte fontMgrIndex = .rodata:0x804DDFF0; // type:object size:0x14 -@stringBase@ = .rodata:0x804DE008; // type:object size:0x28 scope:local data:string_table -WORK_2_HEAP_DEF = .rodata:0x804DE030; // type:object size:0x28 -WORK_EX_HEAP_DEF = .rodata:0x804DE058; // type:object size:0x2C -LAYOUT_HEAP_DEF = .rodata:0x804DE084; // type:object size:0x2C -LAYOUT_EX_HEAP_DEF = .rodata:0x804DE0B0; // type:object size:0x30 -LAYOUT_EX_HEAP2_DEF = .rodata:0x804DE0E0; // type:object size:0x34 -LAYOUT_RES_HEAP_INIT = .rodata:0x804DE114; // type:object size:0x34 -FONT_HEAP_DEF = .rodata:0x804DE148; // type:object size:0x24 -HBM_HEAP_DEF = .rodata:0x804DE16C; // type:object size:0x1C +@LOCAL@createWork1Heap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE008; // type:object size:0x27 scope:local +@LOCAL@createWork2Heap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE030; // type:object size:0x27 scope:local +@LOCAL@createWorkExHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE058; // type:object size:0x2C scope:local +@LOCAL@createLayoutHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE084; // type:object size:0x2A scope:local +@LOCAL@createLayoutExHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE0B0; // type:object size:0x30 scope:local +@LOCAL@createLayoutEx2Heap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE0E0; // type:object size:0x32 scope:local +@LOCAL@createLayoutResHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE114; // type:object size:0x31 scope:local +@LOCAL@createFontHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE148; // type:object size:0x22 scope:local +@LOCAL@createHBMHeap__5dHeapFUlPQ23EGG4Heap@name = .rodata:0x804DE16C; // type:object size:0x1C scope:local lbl_804DE188 = .rodata:0x804DE188; // type:object size:0x60 lbl_804DE1E8 = .rodata:0x804DE1E8; // type:object size:0xC lbl_804DE1F4 = .rodata:0x804DE1F4; // type:object size:0xC data:string @@ -30709,7 +30709,7 @@ lbl_8050D3B0 = .data:0x8050D3B0; // type:object size:0x11 data:string fonts = .data:0x8050D3C4; // type:object size:0x14 lbl_8050D420 = .data:0x8050D420; // type:object size:0x9 data:string lbl_8050D42C = .data:0x8050D42C; // type:object size:0xF data:string -__vt__14dHeapAllocator = .data:0x8050D440; // type:object size:0x18 +__vt__14dHeapAllocator = .data:0x8050D440; // type:object size:0x14 lbl_8050D458 = .data:0x8050D458; // type:object size:0xC data:string lbl_8050D464 = .data:0x8050D464; // type:object size:0x10 lbl_8050D474 = .data:0x8050D474; // type:object size:0x10 diff --git a/configure.py b/configure.py index 19d7513f..1246e644 100644 --- a/configure.py +++ b/configure.py @@ -314,7 +314,7 @@ config.libs = [ Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), Object(Matching, "d/d_font_manager.cpp"), - Object(NonMatching, "d/d_heap.cpp"), + Object(Matching, "d/d_heap.cpp"), Object(Matching, "d/d_rawarchive.cpp"), Object(NonMatching, "d/d_stage.cpp"), Object(NonMatching, "d/d_sys.cpp"), diff --git a/include/d/d_heap_alloc.h b/include/d/d_heap_alloc.h index cbf43c5a..ae7e98e2 100644 --- a/include/d/d_heap_alloc.h +++ b/include/d/d_heap_alloc.h @@ -12,21 +12,13 @@ public: inline void doInitCallbacks() { if (!mCallbacksInitialized) { mCallbacksInitialized = 1; + EGG::Heap::AllocCallbackBundle prev = EGG::Heap::setAllocCallback(&allocCallback, this); + mPreviousAllocCallback = prev.AllocCallback; + mPreviousAllocCallbackArg = prev.AllocCallbackArg; - void *oldAllocCallbackArg = EGG::Heap::sAllocCallbackArg; - void *oldFreeCallbackArg = EGG::Heap::sFreeCallbackArg; - EGG::HeapAllocCallback oldAllocCallback = EGG::Heap::sAllocCallback; - EGG::HeapFreeCallback oldFreeCallback = EGG::Heap::sFreeCallback; - - EGG::Heap::sAllocCallback = &allocCallback; - EGG::Heap::sAllocCallbackArg = this; - mPreviousAllocCallback = oldAllocCallback; - mPreviousAllocCallbackArg = oldAllocCallbackArg; - - EGG::Heap::sFreeCallback = &freeCallback; - EGG::Heap::sFreeCallbackArg = this; - mPreviousFreeCallback = oldFreeCallback; - mPreviousFreeCallbackArg = oldFreeCallbackArg; + EGG::Heap::FreeCallbackBundle prev2 = EGG::Heap::setFreeCallback(&freeCallback, this); + mPreviousFreeCallback = prev2.FreeCallback; + mPreviousFreeCallbackArg = prev2.FreeCallbackArg; } } static void allocCallback(EGG::HeapAllocArg *arg) { @@ -50,8 +42,8 @@ public: } virtual ~dHeapAllocatorBase() {} - virtual void onAlloc(EGG::HeapAllocArg *arg){}; - virtual void onFree(EGG::HeapFreeArg *arg){}; + virtual void onAlloc(EGG::HeapAllocArg *arg) {}; + virtual void onFree(EGG::HeapFreeArg *arg) {}; /* 0x04 */ bool mCallbacksInitialized; /* 0x08 */ EGG::HeapAllocCallback mPreviousAllocCallback; diff --git a/include/egg/core/eggHeap.h b/include/egg/core/eggHeap.h index e0730703..956a8bfd 100644 --- a/include/egg/core/eggHeap.h +++ b/include/egg/core/eggHeap.h @@ -145,6 +145,38 @@ public: return mName; } + struct AllocCallbackBundle { + HeapAllocCallback AllocCallback; + void *AllocCallbackArg; + }; + + struct FreeCallbackBundle { + HeapFreeCallback FreeCallback; + void *FreeCallbackArg; + }; + + static inline AllocCallbackBundle setAllocCallback(HeapAllocCallback AllocCallback, void *AllocCallbackArg) { + AllocCallbackBundle ret; + + ret.AllocCallback = sAllocCallback; + ret.AllocCallbackArg = sAllocCallbackArg; + sAllocCallback = AllocCallback; + sAllocCallbackArg = AllocCallbackArg; + + return ret; + } + + static inline FreeCallbackBundle setFreeCallback(HeapFreeCallback FreeCallback, void *FreeCallbackArg) { + FreeCallbackBundle ret; + + ret.FreeCallback = sFreeCallback; + ret.FreeCallbackArg = sFreeCallbackArg; + sFreeCallback = FreeCallback; + sFreeCallbackArg = FreeCallbackArg; + + return ret; + } + /* 80673ae8 */ static nw4r::ut::List sHeapList; /* 80673af8 */ static OSMutex sRootMutex; /* 80576740 */ static Heap *sCurrentHeap; diff --git a/src/d/d_heap.cpp b/src/d/d_heap.cpp index 16ad0f70..51f3cec1 100644 --- a/src/d/d_heap.cpp +++ b/src/d/d_heap.cpp @@ -61,7 +61,9 @@ void dHeap::createLayoutEx2Heap(size_t size, EGG::Heap *parent) { layoutEx2Heap.init(name, size, parent); } void dHeap::createLayoutResHeap(size_t size, EGG::Heap *parent) { - static const char name[] = "レイアウトリソース用ヒープ(dHeap::layoutResHeap)"; + // Supposed to be "レイアウトリソース用ヒープ(dHeap::layoutResHeap)" but + // this creates a Linux compile issue with wibo + static const char name[] = "レイアウトリ\x83\x5Cース用ヒープ(dHeap::layoutResHeap)"; layoutResHeap.init(name, size, parent); } void dHeap::createFontHeap(size_t size, EGG::Heap *parent) {