@@ -1320,7 +1320,7 @@ static int malloc_heap_grow(u32 size) {
1320
1320
1321
1321
heap_addr = loadRam32 (A_HEAP_BASE );
1322
1322
heap_end = loadRam32 (A_HEAP_END );
1323
- heap_addr_new = heap_addr + 4 + size ;
1323
+ heap_addr_new = heap_addr + size + 4 ;
1324
1324
if (heap_addr_new >= heap_end )
1325
1325
return -1 ;
1326
1326
storeRam32 (A_HEAP_BASE , heap_addr_new );
@@ -1372,6 +1372,12 @@ static void psxBios_malloc() { // 0x33
1372
1372
break ;
1373
1373
}
1374
1374
// chunk too small
1375
+ if (next_chunk_hdr == ~1 ) {
1376
+ // rm useless last free block
1377
+ storeRam32 (A_HEAP_BASE , chunk + 4 );
1378
+ storeRam32 (chunk , ~1 );
1379
+ continue ;
1380
+ }
1375
1381
if (next_chunk_hdr & 1 ) {
1376
1382
// merge
1377
1383
u32 msize = (chunk_hdr & ~3 ) + 4 + (next_chunk_hdr & ~3 );
@@ -1391,10 +1397,15 @@ static void psxBios_malloc() { // 0x33
1391
1397
}
1392
1398
}
1393
1399
1394
- if (i == limit )
1400
+ if (i == limit ) {
1401
+ PSXBIOS_LOG ("malloc: limit OOM\n" );
1395
1402
ret = 0 ;
1396
- else if (tries == 0 && malloc_heap_grow (size ))
1403
+ }
1404
+ else if (tries == 0 && malloc_heap_grow (size )) {
1405
+ PSXBIOS_LOG ("malloc: grow OOM s=%d end=%08x/%08x\n" ,
1406
+ size , loadRam32 (A_HEAP_BASE ), loadRam32 (A_HEAP_END ));
1397
1407
ret = 0 ;
1408
+ }
1398
1409
else {
1399
1410
u32 chunk = loadRam32 (A_HEAP_CURCHNK );
1400
1411
storeRam32 (chunk , loadRam32 (chunk ) & ~3 );
@@ -1428,9 +1439,8 @@ static void psxBios_calloc() { // 0x37
1428
1439
void psxBios_realloc () { // 0x38
1429
1440
u32 block = a0 ;
1430
1441
u32 size = a1 ;
1431
- #ifdef PSXBIOS_LOG
1432
- PSXBIOS_LOG ("psxBios_%s\n" , biosA0n [0x38 ]);
1433
- #endif
1442
+
1443
+ PSXBIOS_LOG ("psxBios_%s %08x %d\n" , biosA0n [0x38 ], a0 , a1 );
1434
1444
1435
1445
a0 = block ;
1436
1446
/* If "old_buf" is zero, executes malloc(new_size), and returns r2=new_buf (or 0=failed). */
0 commit comments