From c7e7e2e76685b54be4f24f5f0a4bed7ce3b20316 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Thu, 20 Apr 2023 09:40:59 +0000 Subject: [PATCH] match m_malloc --- config/rel_slices.yml | 3 +++ config/symbols.yml | 3 ++- include/libc64/__osMalloc.h | 33 ++++++++++++++++++++++---- include/m_malloc.h | 19 +++++++++++++++ rel/m_malloc.c | 46 +++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 include/m_malloc.h create mode 100644 rel/m_malloc.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 85d7649f..72a16e64 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -1,5 +1,8 @@ sys_vimgr.c: .text: [0x803703F8, 0x80370418] +#m_malloc.c: #can't find zelda_arena +# .text: [0x803BC510, 0x803BC70C] +# .bss: [0x81297CA0, 0x81297CD0] m_room_type/mRmTp_FtrItemNo2FtrIdx.c: .text: [0x803E7878, 0x803E78BC] #m_time.c: # unlinked until function callers that reorder local static variables are implemented. diff --git a/config/symbols.yml b/config/symbols.yml index 31e4b4bc..8ca67c7e 100644 --- a/config/symbols.yml +++ b/config/symbols.yml @@ -52430,7 +52430,6 @@ global: 0x81297A68: l_mEnv_electric_light 0x81297B10: S_get_light_list 0x81297B18: light_list_buf - 0x81297CA0: zelda_arena 0x81297D28: l_ml_mail 0x81297E80: Msg_table_rom_start 0x81297E84: Msg_rom_start @@ -58166,6 +58165,8 @@ rel/dataobject.obj: 0x81106D80: rom_train_3_pal rel/irqmgr.c: 0x812F357C: this +rel/m_malloc.c: + 0x81297CA0: zelda_arena foresta.rel: 0x80641254: _ctors 0x80641258: _dtors diff --git a/include/libc64/__osMalloc.h b/include/libc64/__osMalloc.h index 5b8dd744..8fec7734 100644 --- a/include/libc64/__osMalloc.h +++ b/include/libc64/__osMalloc.h @@ -32,11 +32,36 @@ typedef struct ArenaNode { /* 0x28 */ u8 unk_28[0x30-0x28]; // probably padding } ArenaNode; // size = 0x30 -void* __osMalloc(Arena*, size_t); -void __osFree(Arena*, void*); -void __osDisplayArena(Arena*); -void __osGetFreeArena(Arena*, u32*, u32*, u32*); +void setDebugInfo(ArenaNode*, const char*, s32, Arena*); +void arena_lock_init(Arena*); +void arena_lock(Arena*); +void arena_unlock(Arena*); +ArenaNode* get_block_next(ArenaNode*); +ArenaNode* get_block_prev(ArenaNode*); +ArenaNode* search_last_block(Arena*); void __osMallocInit(Arena*, void*, u32); +void __osMallocAddBlock(Arena*, void*, s32); +void destroy_all_block(Arena*); void __osMallocCleanup(Arena*); +BOOL __osMallocIsInitialized(Arena*); +void __osMalloc_FreeBlockTest(Arena*, ArenaNode*); +void* __osMallocALign_NoLock(Arena*, u32, u32); +void* __osMalloc_NoLock(Arena*, u32); +void* __osMallocAlign(Arena*, u32, u32); +void* __osMalloc(Arena*, u32); +void* __osMallocR(Arena*, u32); +void __osFree_NoLock(Arena*, void*); +void __osFree(Arena*, void*); +void* __osRealloc(Arena*, void*, u32); +int __osAnalayzeArena(Arena*, u32*); +void __osGetFreeArena(Arena*, u32*, u32*, u32*); +u32 __osGetTotalFreeSize(Arena*); +u32 __osGetFreeSize(Arena*); +u32 __osGetMemBlockSize(Arena*, void*); +void __osDisplayArena(Arena*); +int __osCheckArena(Arena*); + + + #endif diff --git a/include/m_malloc.h b/include/m_malloc.h new file mode 100644 index 00000000..0b23f960 --- /dev/null +++ b/include/m_malloc.h @@ -0,0 +1,19 @@ +#ifndef M_MALLOC_H +#define M_MALLOC_H +#include "libc64/__osMalloc.h" + +extern Arena zelda_arena; + + +void zelda_malloc_align(u32,u32); +void zelda_malloc(u32); +void zelda_malloc_r(u32); +void zelda_free(void*); +void zelda_GetFreeArena(u32*,u32*,u32*); +u32 zelda_GetTotalFreeSize(void); +u32 zelda_GetMemBlockSize(void*); +void zelda_InitArena(void*, u32); +void zelda_AddBlockArena(void*, u32); +void zelda_CleanupArena(void); +void zelda_MallocIsInitialized(void); +#endif \ No newline at end of file diff --git a/rel/m_malloc.c b/rel/m_malloc.c new file mode 100644 index 00000000..1fd66155 --- /dev/null +++ b/rel/m_malloc.c @@ -0,0 +1,46 @@ +#include "m_malloc.h" + +extern Arena zelda_arena; + +void zelda_malloc_align(u32 size, u32 align){ + __osMallocAlign(&zelda_arena, size, align); +} + +void zelda_malloc(u32 size){ + __osMalloc(&zelda_arena,size); +} + +void zelda_malloc_r(u32 size){ + __osMallocR(&zelda_arena, size); +} + +void zelda_free(void* ptr){ + __osFree(&zelda_arena, ptr); +} + +void zelda_GetFreeArena(size_t* max, size_t* free, size_t* alloc){ + __osGetFreeArena(&zelda_arena,max,free,alloc); +} + +size_t zelda_GetTotalFreeSize(void){ + return __osGetTotalFreeSize(&zelda_arena); +} + +size_t zelda_GetMemBlockSize(void* ptr){ + return __osGetMemBlockSize(&zelda_arena, ptr); +} + +void zelda_InitArena(void* start, u32 size){ + __osMallocInit(&zelda_arena, start, size); +} +void zelda_AddBlockArena(void* start, u32 size){ + __osMallocAddBlock(&zelda_arena,start, size); +} + +void zelda_CleanupArena(void){ + __osMallocCleanup(&zelda_arena); +} + +void zelda_MallocIsInitalized(void){ + __osMallocIsInitalized(&zelda_arena); +} \ No newline at end of file