feat: ps2 stub cleanup

This commit is contained in:
Ran-j
2025-04-17 18:08:07 -03:00
parent 57dd63e736
commit 2468f5c95d
+44 -56
View File
@@ -10,18 +10,6 @@
#include <filesystem>
#include <mutex>
// --- Memory management ---
namespace
{
constexpr size_t STUB_HEAP_SIZE = 8 * 1024 * 1024; // 8 MB simple heap
std::vector<uint8_t> g_stub_heap(STUB_HEAP_SIZE);
size_t g_stub_heap_ptr = 0;
std::unordered_map<uint32_t, size_t> g_allocations;
constexpr uint32_t STUB_HEAP_BASE_ADDR = 0x0F000000; // Unused area in PS2 RAM
}
// --- File I/O ---
namespace
{
std::unordered_map<uint32_t, FILE *> g_file_map;
@@ -99,7 +87,7 @@ namespace
namespace ps2_stubs
{
void ps2_stubs::malloc(uint8_t *rdram, R5900Context *ctx)
void malloc(uint8_t *rdram, R5900Context *ctx)
{
size_t size = getRegU32(ctx, 4); // $a0
uint32_t handle = 0;
@@ -121,10 +109,10 @@ namespace ps2_stubs
}
}
// returns handle (0 if size=0 or allocation failed)
setReturnU32(ctx, handle);
setReturnU32(ctx, handle);
}
void ps2_stubs::free(uint8_t *rdram, R5900Context *ctx)
void free(uint8_t *rdram, R5900Context *ctx)
{
uint32_t handle = getRegU32(ctx, 4); // $a0
@@ -150,7 +138,7 @@ namespace ps2_stubs
// free dont have return
}
void ps2_stubs::calloc(uint8_t *rdram, R5900Context *ctx)
void calloc(uint8_t *rdram, R5900Context *ctx)
{
size_t num = getRegU32(ctx, 4); // $a0
size_t size = getRegU32(ctx, 5); // $a1
@@ -177,7 +165,7 @@ namespace ps2_stubs
setReturnU32(ctx, handle);
}
void ps2_stubs::realloc(uint8_t *rdram, R5900Context *ctx)
void realloc(uint8_t *rdram, R5900Context *ctx)
{
uint32_t old_handle = getRegU32(ctx, 4); // $a0
size_t new_size = getRegU32(ctx, 5); // $a1
@@ -259,7 +247,7 @@ namespace ps2_stubs
setReturnU32(ctx, new_handle);
}
void ps2_stubs::memcpy(uint8_t *rdram, R5900Context *ctx)
void memcpy(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -284,7 +272,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::memset(uint8_t *rdram, R5900Context *ctx)
void memset(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
int value = (int)(getRegU32(ctx, 5) & 0xFF); // $a1 (char value)
@@ -305,7 +293,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::memmove(uint8_t *rdram, R5900Context *ctx)
void memmove(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -330,7 +318,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::memcmp(uint8_t *rdram, R5900Context *ctx)
void memcmp(uint8_t *rdram, R5900Context *ctx)
{
uint32_t ptr1Addr = getRegU32(ctx, 4); // $a0
uint32_t ptr2Addr = getRegU32(ctx, 5); // $a1
@@ -358,7 +346,7 @@ namespace ps2_stubs
setReturnS32(ctx, result);
}
void ps2_stubs::strcpy(uint8_t *rdram, R5900Context *ctx)
void strcpy(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -382,7 +370,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::strncpy(uint8_t *rdram, R5900Context *ctx)
void strncpy(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -406,7 +394,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::strlen(uint8_t *rdram, R5900Context *ctx)
void strlen(uint8_t *rdram, R5900Context *ctx)
{
uint32_t strAddr = getRegU32(ctx, 4); // $a0
const char *hostStr = reinterpret_cast<const char *>(getConstMemPtr(rdram, strAddr));
@@ -423,7 +411,7 @@ namespace ps2_stubs
setReturnU32(ctx, (uint32_t)len);
}
void ps2_stubs::strcmp(uint8_t *rdram, R5900Context *ctx)
void strcmp(uint8_t *rdram, R5900Context *ctx)
{
uint32_t str1Addr = getRegU32(ctx, 4); // $a0
uint32_t str2Addr = getRegU32(ctx, 5); // $a1
@@ -450,7 +438,7 @@ namespace ps2_stubs
setReturnS32(ctx, result);
}
void ps2_stubs::strncmp(uint8_t *rdram, R5900Context *ctx)
void strncmp(uint8_t *rdram, R5900Context *ctx)
{
uint32_t str1Addr = getRegU32(ctx, 4); // $a0
uint32_t str2Addr = getRegU32(ctx, 5); // $a1
@@ -477,7 +465,7 @@ namespace ps2_stubs
setReturnS32(ctx, result);
}
void ps2_stubs::strcat(uint8_t *rdram, R5900Context *ctx)
void strcat(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -501,7 +489,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::strncat(uint8_t *rdram, R5900Context *ctx)
void strncat(uint8_t *rdram, R5900Context *ctx)
{
uint32_t destAddr = getRegU32(ctx, 4); // $a0
uint32_t srcAddr = getRegU32(ctx, 5); // $a1
@@ -526,7 +514,7 @@ namespace ps2_stubs
ctx->r[2] = ctx->r[4];
}
void ps2_stubs::strchr(uint8_t *rdram, R5900Context *ctx)
void strchr(uint8_t *rdram, R5900Context *ctx)
{
uint32_t strAddr = getRegU32(ctx, 4); // $a0
int char_code = (int)(getRegU32(ctx, 5) & 0xFF); // $a1 (char value)
@@ -552,7 +540,7 @@ namespace ps2_stubs
setReturnU32(ctx, resultAddr);
}
void ps2_stubs::strrchr(uint8_t *rdram, R5900Context *ctx)
void strrchr(uint8_t *rdram, R5900Context *ctx)
{
uint32_t strAddr = getRegU32(ctx, 4); // $a0
int char_code = (int)(getRegU32(ctx, 5) & 0xFF); // $a1 (char value)
@@ -578,7 +566,7 @@ namespace ps2_stubs
setReturnU32(ctx, resultAddr);
}
void ps2_stubs::strstr(uint8_t *rdram, R5900Context *ctx)
void strstr(uint8_t *rdram, R5900Context *ctx)
{
uint32_t haystackAddr = getRegU32(ctx, 4); // $a0
uint32_t needleAddr = getRegU32(ctx, 5); // $a1
@@ -608,7 +596,7 @@ namespace ps2_stubs
setReturnU32(ctx, resultAddr);
}
void ps2_stubs::printf(uint8_t *rdram, R5900Context *ctx)
void printf(uint8_t *rdram, R5900Context *ctx)
{
uint32_t format_addr = getRegU32(ctx, 4); // $a0
const char *format = reinterpret_cast<const char *>(getConstMemPtr(rdram, format_addr));
@@ -630,7 +618,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::sprintf(uint8_t *rdram, R5900Context *ctx)
void sprintf(uint8_t *rdram, R5900Context *ctx)
{
uint32_t str_addr = getRegU32(ctx, 4); // $a0
uint32_t format_addr = getRegU32(ctx, 5); // $a1
@@ -657,7 +645,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::snprintf(uint8_t *rdram, R5900Context *ctx)
void snprintf(uint8_t *rdram, R5900Context *ctx)
{
uint32_t str_addr = getRegU32(ctx, 4); // $a0
size_t size = getRegU32(ctx, 5); // $a1
@@ -691,7 +679,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::puts(uint8_t *rdram, R5900Context *ctx)
void puts(uint8_t *rdram, R5900Context *ctx)
{
uint32_t strAddr = getRegU32(ctx, 4); // $a0
const char *hostStr = reinterpret_cast<const char *>(getConstMemPtr(rdram, strAddr));
@@ -711,7 +699,7 @@ namespace ps2_stubs
setReturnS32(ctx, result >= 0 ? 0 : -1); // PS2 might expect 0/-1 rather than EOF
}
void ps2_stubs::fopen(uint8_t *rdram, R5900Context *ctx)
void fopen(uint8_t *rdram, R5900Context *ctx)
{
uint32_t pathAddr = getRegU32(ctx, 4); // $a0
uint32_t modeAddr = getRegU32(ctx, 5); // $a1
@@ -749,7 +737,7 @@ namespace ps2_stubs
setReturnU32(ctx, file_handle);
}
void ps2_stubs::fclose(uint8_t *rdram, R5900Context *ctx)
void fclose(uint8_t *rdram, R5900Context *ctx)
{
uint32_t file_handle = getRegU32(ctx, 4); // $a0
int ret = EOF; // Default to error
@@ -779,7 +767,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::fread(uint8_t *rdram, R5900Context *ctx)
void fread(uint8_t *rdram, R5900Context *ctx)
{
uint32_t ptrAddr = getRegU32(ctx, 4); // $a0 (buffer)
uint32_t size = getRegU32(ctx, 5); // $a1 (element size)
@@ -805,7 +793,7 @@ namespace ps2_stubs
setReturnU32(ctx, (uint32_t)items_read);
}
void ps2_stubs::fwrite(uint8_t *rdram, R5900Context *ctx)
void fwrite(uint8_t *rdram, R5900Context *ctx)
{
uint32_t ptrAddr = getRegU32(ctx, 4); // $a0 (buffer)
uint32_t size = getRegU32(ctx, 5); // $a1 (element size)
@@ -831,7 +819,7 @@ namespace ps2_stubs
setReturnU32(ctx, (uint32_t)items_written);
}
void ps2_stubs::fprintf(uint8_t *rdram, R5900Context *ctx)
void fprintf(uint8_t *rdram, R5900Context *ctx)
{
uint32_t file_handle = getRegU32(ctx, 4); // $a0
uint32_t format_addr = getRegU32(ctx, 5); // $a1
@@ -856,7 +844,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::fseek(uint8_t *rdram, R5900Context *ctx)
void fseek(uint8_t *rdram, R5900Context *ctx)
{
uint32_t file_handle = getRegU32(ctx, 4); // $a0
long offset = (long)getRegU32(ctx, 5); // $a1 (Note: might need 64-bit for large files?)
@@ -886,7 +874,7 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::ftell(uint8_t *rdram, R5900Context *ctx)
void ftell(uint8_t *rdram, R5900Context *ctx)
{
uint32_t file_handle = getRegU32(ctx, 4); // $a0
long ret = -1L;
@@ -913,7 +901,7 @@ namespace ps2_stubs
}
}
void ps2_stubs::fflush(uint8_t *rdram, R5900Context *ctx)
void fflush(uint8_t *rdram, R5900Context *ctx)
{
uint32_t file_handle = getRegU32(ctx, 4); // $a0
int ret = EOF; // Default error
@@ -939,81 +927,81 @@ namespace ps2_stubs
setReturnS32(ctx, ret);
}
void ps2_stubs::sqrt(uint8_t *rdram, R5900Context *ctx)
void sqrt(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::sqrtf(arg);
}
void ps2_stubs::sin(uint8_t *rdram, R5900Context *ctx)
void sin(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::sinf(arg);
}
void ps2_stubs::cos(uint8_t *rdram, R5900Context *ctx)
void cos(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::cosf(arg);
}
void ps2_stubs::tan(uint8_t *rdram, R5900Context *ctx)
void tan(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::tanf(arg);
}
void ps2_stubs::atan2(uint8_t *rdram, R5900Context *ctx)
void atan2(uint8_t *rdram, R5900Context *ctx)
{
float y = ctx->f[12];
float x = ctx->f[14];
ctx->f[0] = ::atan2f(y, x);
}
void ps2_stubs::pow(uint8_t *rdram, R5900Context *ctx)
void pow(uint8_t *rdram, R5900Context *ctx)
{
float base = ctx->f[12];
float exp = ctx->f[14];
ctx->f[0] = ::powf(base, exp);
}
void ps2_stubs::exp(uint8_t *rdram, R5900Context *ctx)
void exp(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::expf(arg);
}
void ps2_stubs::log(uint8_t *rdram, R5900Context *ctx)
void log(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::logf(arg);
}
void ps2_stubs::log10(uint8_t *rdram, R5900Context *ctx)
void log10(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::log10f(arg);
}
void ps2_stubs::ceil(uint8_t *rdram, R5900Context *ctx)
void ceil(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::ceilf(arg);
}
void ps2_stubs::floor(uint8_t *rdram, R5900Context *ctx)
void floor(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::floorf(arg);
}
void ps2_stubs::fabs(uint8_t *rdram, R5900Context *ctx)
void fabs(uint8_t *rdram, R5900Context *ctx)
{
float arg = ctx->f[12];
ctx->f[0] = ::fabsf(arg);
}
void ps2_stubs::TODO(uint8_t *rdram, R5900Context *ctx)
void TODO(uint8_t *rdram, R5900Context *ctx)
{
uint32_t stub_num = getRegU32(ctx, 2); // $v0 often holds stub num *before* call
uint32_t caller_ra = getRegU32(ctx, 31); // $ra