Start work on malloc.c

This commit is contained in:
gamemasterplc 2023-11-21 20:53:03 -06:00
parent 0b4ae7caba
commit 237bf72a2c
6 changed files with 121 additions and 28 deletions

View file

@ -13,6 +13,15 @@ Sections:
.sdata2 type:rodata .sdata2 type:rodata
.sbss2 type:bss .sbss2 type:bss
game/malloc.c:
.text start:0x8000A558 end:0x8000A938
.data start:0x80121F50 end:0x80121FC8
.bss start:0x80145A80 end:0x80145A98
game/memory.c:
.text start:0x8000A938 end:0x8000AEF0
.data start:0x80121FC8 end:0x80122140
Runtime.PPCEABI.H/global_destructor_chain.c: Runtime.PPCEABI.H/global_destructor_chain.c:
.text start:0x800E2008 end:0x800E2068 .text start:0x800E2008 end:0x800E2068
.dtors start:0x8011DCE8 end:0x8011DCEC .dtors start:0x8011DCE8 end:0x8011DCEC

View file

@ -101,29 +101,29 @@ fn_8000A1A4 = .text:0x8000A1A4; // type:function size:0x6C
fn_8000A210 = .text:0x8000A210; // type:function size:0x254 fn_8000A210 = .text:0x8000A210; // type:function size:0x254
fn_8000A464 = .text:0x8000A464; // type:function size:0x74 fn_8000A464 = .text:0x8000A464; // type:function size:0x74
fn_8000A4D8 = .text:0x8000A4D8; // type:function size:0x80 fn_8000A4D8 = .text:0x8000A4D8; // type:function size:0x80
fn_8000A558 = .text:0x8000A558; // type:function size:0x12C HuMemInitAll = .text:0x8000A558; // type:function size:0x12C
fn_8000A684 = .text:0x8000A684; // type:function size:0x30 HuMemInit = .text:0x8000A684; // type:function size:0x30
fn_8000A6B4 = .text:0x8000A6B4; // type:function size:0x2C HuMemDCFlushAll = .text:0x8000A6B4; // type:function size:0x2C
fn_8000A6E0 = .text:0x8000A6E0; // type:function size:0x54 HuMemDCFlush = .text:0x8000A6E0; // type:function size:0x54
fn_8000A734 = .text:0x8000A734; // type:function size:0x64 HuMemDirectMalloc = .text:0x8000A734; // type:function size:0x64
fn_8000A798 = .text:0x8000A798; // type:function size:0x6C HuMemDirectMallocNum = .text:0x8000A798; // type:function size:0x6C
fn_8000A804 = .text:0x8000A804; // type:function size:0x38 HuMemDirectFree = .text:0x8000A804; // type:function size:0x38
fn_8000A83C = .text:0x8000A83C; // type:function size:0x54 HuMemDirectFreeNum = .text:0x8000A83C; // type:function size:0x54
fn_8000A890 = .text:0x8000A890; // type:function size:0x3C HuMemUsedMallocSizeGet = .text:0x8000A890; // type:function size:0x3C
fn_8000A8CC = .text:0x8000A8CC; // type:function size:0x3C HuMemUsedMallocBlockGet = .text:0x8000A8CC; // type:function size:0x3C
fn_8000A908 = .text:0x8000A908; // type:function size:0x18 HuMemHeapSizeGet = .text:0x8000A908; // type:function size:0x18
fn_8000A920 = .text:0x8000A920; // type:function size:0x18 HuMemHeapPtrGet = .text:0x8000A920; // type:function size:0x18
fn_8000A938 = .text:0x8000A938; // type:function size:0x4C HuMemHeapInit = .text:0x8000A938; // type:function size:0x4C
fn_8000A984 = .text:0x8000A984; // type:function size:0x40 HuMemMemoryAllocNum = .text:0x8000A984; // type:function size:0x40
fn_8000A9C4 = .text:0x8000A9C4; // type:function size:0x3C HuMemMemoryAlloc = .text:0x8000A9C4; // type:function size:0x3C
fn_8000AA00 = .text:0x8000AA00; // type:function size:0x108 HuMemMemoryAlloc2 = .text:0x8000AA00; // type:function size:0x108
fn_8000AB08 = .text:0x8000AB08; // type:function size:0x7C HuMemMemoryFreeNum = .text:0x8000AB08; // type:function size:0x7C
fn_8000AB84 = .text:0x8000AB84; // type:function size:0x12C HuMemMemoryFree = .text:0x8000AB84; // type:function size:0x12C
fn_8000ACB0 = .text:0x8000ACB0; // type:function size:0x48 HuMemUsedMemorySizeGet = .text:0x8000ACB0; // type:function size:0x48
fn_8000ACF8 = .text:0x8000ACF8; // type:function size:0x44 HuMemUsedMemoryBlockGet = .text:0x8000ACF8; // type:function size:0x44
fn_8000AD3C = .text:0x8000AD3C; // type:function size:0xC HuMemMemoryAllocSizeGet = .text:0x8000AD3C; // type:function size:0xC
fn_8000AD48 = .text:0x8000AD48; // type:function size:0x158 HuMemHeapDump = .text:0x8000AD48; // type:function size:0x158
fn_8000AEA0 = .text:0x8000AEA0; // type:function size:0x50 HuMemMemorySizeGet = .text:0x8000AEA0; // type:function size:0x50
fn_8000AEF0 = .text:0x8000AEF0; // type:function size:0x64 fn_8000AEF0 = .text:0x8000AEF0; // type:function size:0x64
fn_8000AF54 = .text:0x8000AF54; // type:function size:0xA0 fn_8000AF54 = .text:0x8000AF54; // type:function size:0xA0
fn_8000AFF4 = .text:0x8000AFF4; // type:function size:0x15C fn_8000AFF4 = .text:0x8000AFF4; // type:function size:0x15C
@ -2053,13 +2053,13 @@ OSCancelAlarm = .text:0x800B5008; // type:function size:0x11C
DecrementerExceptionCallback = .text:0x800B5124; // type:function size:0x230 scope:local DecrementerExceptionCallback = .text:0x800B5124; // type:function size:0x230 scope:local
DecrementerExceptionHandler = .text:0x800B5354; // type:function size:0x50 scope:local DecrementerExceptionHandler = .text:0x800B5354; // type:function size:0x50 scope:local
fn_800B53A4 = .text:0x800B53A4; // type:function size:0xAC fn_800B53A4 = .text:0x800B53A4; // type:function size:0xAC
fn_800B5450 = .text:0x800B5450; // type:function size:0xFC OSAllocFromHeap = .text:0x800B5450; // type:function size:0xFC
fn_800B554C = .text:0x800B554C; // type:function size:0x284 fn_800B554C = .text:0x800B554C; // type:function size:0x284
fn_800B57D0 = .text:0x800B57D0; // type:function size:0x7C fn_800B57D0 = .text:0x800B57D0; // type:function size:0x7C
OSSetCurrentHeap = .text:0x800B584C; // type:function size:0x10 OSSetCurrentHeap = .text:0x800B584C; // type:function size:0x10
OSInitAlloc = .text:0x800B585C; // type:function size:0x70 OSInitAlloc = .text:0x800B585C; // type:function size:0x70
OSCreateHeap = .text:0x800B58CC; // type:function size:0x6C OSCreateHeap = .text:0x800B58CC; // type:function size:0x6C
fn_800B5938 = .text:0x800B5938; // type:function size:0x360 OSCheckHeap = .text:0x800B5938; // type:function size:0x360
fn_800B5C98 = .text:0x800B5C98; // type:function size:0x104 fn_800B5C98 = .text:0x800B5C98; // type:function size:0x104
OSGetArenaHi = .text:0x800B5D9C; // type:function size:0x8 scope:global OSGetArenaHi = .text:0x800B5D9C; // type:function size:0x8 scope:global
OSGetArenaLo = .text:0x800B5DA4; // type:function size:0x8 scope:global OSGetArenaLo = .text:0x800B5DA4; // type:function size:0x8 scope:global
@ -4840,7 +4840,7 @@ lbl_8011FCBE = .data:0x8011FCBE; // type:object size:0x122
lbl_8011FDE0 = .data:0x8011FDE0; // type:object size:0x20 lbl_8011FDE0 = .data:0x8011FDE0; // type:object size:0x20
lbl_8011FE00 = .data:0x8011FE00; // type:object size:0x2000 lbl_8011FE00 = .data:0x8011FE00; // type:object size:0x2000
lbl_80121E00 = .data:0x80121E00; // type:object size:0x150 lbl_80121E00 = .data:0x80121E00; // type:object size:0x150
lbl_80121F50 = .data:0x80121F50; // type:object size:0x78 HeapSizeTbl = .data:0x80121F50; // type:object size:0x78 scope:local
lbl_80121FC8 = .data:0x80121FC8; // type:object size:0x50 lbl_80121FC8 = .data:0x80121FC8; // type:object size:0x50
lbl_80122018 = .data:0x80122018; // type:object size:0x128 lbl_80122018 = .data:0x80122018; // type:object size:0x128
fcoltbl = .data:0x80122140; // type:object size:0x40 fcoltbl = .data:0x80122140; // type:object size:0x40
@ -5356,7 +5356,7 @@ RumbleData = .bss:0x80142810; // type:object size:0x30
ReadDataStat = .bss:0x80142840; // type:object size:0x2E00 data:4byte ReadDataStat = .bss:0x80142840; // type:object size:0x2E00 data:4byte
TextBuffer = .bss:0x80145640; // type:object size:0x400 TextBuffer = .bss:0x80145640; // type:object size:0x400
lbl_80145A40 = .bss:0x80145A40; // type:object size:0x40 lbl_80145A40 = .bss:0x80145A40; // type:object size:0x40
lbl_80145A80 = .bss:0x80145A80; // type:object size:0x18 HeapTbl = .bss:0x80145A80; // type:object size:0x14 scope:local
lbl_80145A98 = .bss:0x80145A98; // type:object size:0x6800 lbl_80145A98 = .bss:0x80145A98; // type:object size:0x6800
lbl_8014C298 = .bss:0x8014C298; // type:object size:0x100 data:byte lbl_8014C298 = .bss:0x8014C298; // type:object size:0x100 data:byte
lbl_8014C398 = .bss:0x8014C398; // type:object size:0xF8 lbl_8014C398 = .bss:0x8014C398; // type:object size:0xF8
@ -5840,7 +5840,7 @@ lbl_801D38B0 = .sdata:0x801D38B0; // type:object size:0x2 data:2byte
lbl_801D38B2 = .sdata:0x801D38B2; // type:object size:0x2 data:2byte lbl_801D38B2 = .sdata:0x801D38B2; // type:object size:0x2 data:2byte
lbl_801D38B4 = .sdata:0x801D38B4; // type:object size:0x2 data:2byte lbl_801D38B4 = .sdata:0x801D38B4; // type:object size:0x2 data:2byte
lbl_801D38B6 = .sdata:0x801D38B6; // type:object size:0x2 data:2byte lbl_801D38B6 = .sdata:0x801D38B6; // type:object size:0x2 data:2byte
lbl_801D38B8 = .sdata:0x801D38B8; // type:object size:0x8 data:4byte __OSCurrHeap = .sdata:0x801D38B8; // type:object size:0x8 data:4byte
__OSArenaLo = .sdata:0x801D38C0; // type:object size:0x4 scope:local data:4byte __OSArenaLo = .sdata:0x801D38C0; // type:object size:0x4 scope:local data:4byte
@32 = .sdata:0x801D38C8; // type:object size:0x2 scope:local data:string @32 = .sdata:0x801D38C8; // type:object size:0x2 scope:local data:string
lbl_801D38D0 = .sdata:0x801D38D0; // type:object size:0x8 data:2byte lbl_801D38D0 = .sdata:0x801D38D0; // type:object size:0x8 data:2byte

View file

@ -177,6 +177,12 @@ cflags_rel = [
"-sdata2 0", "-sdata2 0",
] ]
# Game flags
cflags_game = [
*cflags_base,
"-O0,p",
]
config.linker_version = "GC/2.6" config.linker_version = "GC/2.6"
config.rel_strip_partial = False config.rel_strip_partial = False
config.rel_empty_file = "REL/empty.c" config.rel_empty_file = "REL/empty.c"
@ -210,6 +216,15 @@ NonMatching = False
config.warn_missing_config = True config.warn_missing_config = True
config.warn_missing_source = False config.warn_missing_source = False
config.libs = [ config.libs = [
{
"lib": "Game",
"mw_version": config.linker_version,
"cflags": cflags_game,
"host": False,
"objects": [
Object(NonMatching, "game/malloc.c"),
],
},
{ {
"lib": "Runtime.PPCEABI.H", "lib": "Runtime.PPCEABI.H",
"mw_version": config.linker_version, "mw_version": config.linker_version,

View file

@ -5,6 +5,9 @@
#include "common_structs.h" #include "common_structs.h"
void OSReport(const char * format, ...); void OSReport(const char * format, ...);
void* OSAllocFromHeap(int heap, u32 size);
s32 OSCheckHeap(int heap);
void DCFlushRangeNoSync(void *addr, u32 size);
void* HuPrcCreate(void (*), s32, s32, s32); void* HuPrcCreate(void (*), s32, s32, s32);
void Hu3DBGColorSet(u8, u8, u8); void Hu3DBGColorSet(u8, u8, u8);
void Hu3DCameraCreate(s16); void Hu3DCameraCreate(s16);
@ -18,4 +21,12 @@ void fn_80045F74(s16, s32);
s32 fn_800578E4(void); s32 fn_800578E4(void);
void fn_1_26C(void); void fn_1_26C(void);
void HuMemInitAll(void);
void *HuMemInit(void *ptr, u32 size);
void HuMemDCFlush(int heap);
void *HuMemHeapInit(void *ptr, u32 size);
void *HuMemMemoryAlloc(void *heap_ptr, u32 size, void *retaddr);
#endif #endif

View file

@ -1,6 +1,7 @@
#ifndef _TYPES_H_ #ifndef _TYPES_H_
#define _TYPES_H_ #define _TYPES_H_
#define NULL ((void *)0)
typedef unsigned char u8; typedef unsigned char u8;
typedef unsigned short u16; typedef unsigned short u16;
typedef unsigned long u32; typedef unsigned long u32;

57
src/game/malloc.c Normal file
View file

@ -0,0 +1,57 @@
#include "common.h"
extern int __OSCurrHeap;
static u32 HeapSizeTbl[5] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0x6B1C0 };
static void *HeapTbl[5];
void HuMemInitAll(void)
{
int i;
void *ptr;
u32 free_size;
for(i=0; i<4; i++) {
ptr = OSAllocFromHeap(__OSCurrHeap, HeapSizeTbl[i]);
if(ptr == NULL) {
OSReport("HuMem> Failed OSAlloc Size:%d\n", HeapSizeTbl[i]);
return;
}
HeapTbl[i] = HuMemInit(ptr, HeapSizeTbl[i]);
}
free_size = OSCheckHeap(__OSCurrHeap);
OSReport("HuMem> left memory space %dKB(%d)\n", free_size/1024, free_size);
ptr = OSAllocFromHeap(__OSCurrHeap, free_size);
if(ptr == NULL) {
OSReport("HuMem> Failed OSAlloc left space\n");
return;
}
HeapTbl[4] = HuMemInit(ptr, free_size);
HeapSizeTbl[4] = free_size;
}
void *HuMemInit(void *ptr, u32 size)
{
return HuMemHeapInit(ptr, size);
}
void HuMemDCFlushAll()
{
HuMemDCFlush(2);
HuMemDCFlush(0);
}
void HuMemDCFlush(int heap)
{
DCFlushRangeNoSync(HeapTbl[heap], HeapSizeTbl[heap]);
}
void *HuMemDirectMalloc(int heap, u32 size)
{
register void *retaddr;
asm {
mflr retaddr
}
size = (size+31) & 0xFFFFFFE0;
return HuMemMemoryAlloc(HeapTbl[heap], size, retaddr);
}