mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-10-12 02:08:45 +00:00
IR5900: DUMP_BLOCKS: Symbolize text ptr relative
This commit is contained in:
+113
-78
@@ -121,6 +121,116 @@ static void pauseAAA()
|
||||
|
||||
#ifdef DUMP_BLOCKS
|
||||
static ZydisFormatterFunc s_old_print_address;
|
||||
static ZydisFormatterFunc s_old_print_disp;
|
||||
|
||||
static int Address2Symbol(u64 address, char* buf)
|
||||
{
|
||||
u32 len = 0;
|
||||
|
||||
#define A(x) ((u64)(x))
|
||||
|
||||
if (address >= A(eeMem->Main) && address < A(eeMem->Scratch))
|
||||
{
|
||||
len = sprintf(buf, "eeMem+0x%08X", static_cast<u32>(address - A(eeMem->Main)));
|
||||
}
|
||||
else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM))
|
||||
{
|
||||
len = sprintf(buf, "eeScratchpad+0x%08X", static_cast<u32>(address - A(eeMem->Scratch)));
|
||||
}
|
||||
else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&cpuRegs)) % 16u;
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "cpuRegs.GPR.%s+%u", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u], offset);
|
||||
else
|
||||
len = sprintf(buf, "cpuRegs.GPR.%s", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u]);
|
||||
}
|
||||
else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&cpuRegs.HI)) % 16u;
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "cpuRegs.%s+%u", (address >= A(&cpuRegs.LO) ? "LO" : "HI"), offset);
|
||||
else
|
||||
len = sprintf(buf, "cpuRegs.%s", (address >= A(&cpuRegs.LO) ? "LO" : "HI"));
|
||||
}
|
||||
else if (address == A(&cpuRegs.pc))
|
||||
{
|
||||
len = sprintf(buf, "cpuRegs.pc");
|
||||
}
|
||||
else if (address == A(&cpuRegs.cycle))
|
||||
{
|
||||
len = sprintf(buf, "cpuRegs.cycle");
|
||||
}
|
||||
else if (address == A(&cpuRegs.nextEventCycle))
|
||||
{
|
||||
len = sprintf(buf, "cpuRegs.nextEventCycle");
|
||||
}
|
||||
else if (address >= A(fpuRegs.fpr) && address < A(fpuRegs.fprc))
|
||||
{
|
||||
len = sprintf(buf, "fpuRegs.f%02u", static_cast<u32>(address - A(fpuRegs.fpr)) / 4u);
|
||||
}
|
||||
else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0]))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.VF[0])) % 16u;
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "VU0.VF[%02u]+%u", static_cast<u32>(address - A(&VU0.VF[0])) / 16u, offset);
|
||||
else
|
||||
len = sprintf(buf, "VU0.VF[%02u]", static_cast<u32>(address - A(&VU0.VF[0])) / 16u);
|
||||
}
|
||||
else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.VI[0])) % 16u;
|
||||
const u32 vi = static_cast<u32>(address - A(&VU0.VI[0])) / 16u;
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "VU0.%s+%u", COP2_REG_CTL[vi], offset);
|
||||
else
|
||||
len = sprintf(buf, "VU0.%s", COP2_REG_CTL[vi]);
|
||||
}
|
||||
else if (address >= A(&VU0.ACC) && address < A(&VU0.q))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.ACC));
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "VU0.ACC+%u", offset);
|
||||
else
|
||||
len = sprintf(buf, "VU0.ACC");
|
||||
}
|
||||
else if (address >= A(&VU0.q) && address < A(&VU0.idx))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.q)) % 16u;
|
||||
const char* reg = (address >= A(&VU0.p)) ? "p" : "q";
|
||||
if (offset != 0)
|
||||
len = sprintf(buf, "VU0.%s+%u", reg, offset);
|
||||
else
|
||||
len = sprintf(buf, "VU0.%s", reg);
|
||||
}
|
||||
|
||||
#undef A
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static ZyanStatus ZydisFormatterPrintDisplacement(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
char buf[128];
|
||||
u32 len = 0;
|
||||
u64 address = (u64)R5900_TEXTPTR + context->operand->mem.disp.value;
|
||||
|
||||
// hardcoded RTEXTPTR
|
||||
if (context->operand->mem.base == ZYDIS_REGISTER_RBX) {
|
||||
len = Address2Symbol(address, buf);
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, ZYDIS_TOKEN_SYMBOL));
|
||||
ZyanString* string;
|
||||
ZYAN_CHECK(ZydisFormatterBufferGetString(buffer, &string));
|
||||
return ZyanStringAppendFormat(string, "-%s+&%s", "R5900_TEXTPTR", buf);
|
||||
}
|
||||
|
||||
return s_old_print_disp(formatter, buffer, context);
|
||||
}
|
||||
|
||||
static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
@@ -132,84 +242,7 @@ static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* forma
|
||||
char buf[128];
|
||||
u32 len = 0;
|
||||
|
||||
#define A(x) ((u64)(x))
|
||||
|
||||
if (address >= A(eeMem->Main) && address < A(eeMem->Scratch))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "eeMem+0x%08X", static_cast<u32>(address - A(eeMem->Main)));
|
||||
}
|
||||
else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "eeScratchpad+0x%08X", static_cast<u32>(address - A(eeMem->Scratch)));
|
||||
}
|
||||
else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&cpuRegs)) % 16u;
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s+%u", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u], offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u]);
|
||||
}
|
||||
else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&cpuRegs.HI)) % 16u;
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.%s+%u", (address >= A(&cpuRegs.LO) ? "LO" : "HI"), offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.%s", (address >= A(&cpuRegs.LO) ? "LO" : "HI"));
|
||||
}
|
||||
else if (address == A(&cpuRegs.pc))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.pc");
|
||||
}
|
||||
else if (address == A(&cpuRegs.cycle))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.cycle");
|
||||
}
|
||||
else if (address == A(&cpuRegs.nextEventCycle))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "cpuRegs.nextEventCycle");
|
||||
}
|
||||
else if (address >= A(fpuRegs.fpr) && address < A(fpuRegs.fprc))
|
||||
{
|
||||
len = snprintf(buf, sizeof(buf), "fpuRegs.f%02u", static_cast<u32>(address - A(fpuRegs.fpr)) / 4u);
|
||||
}
|
||||
else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0]))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.VF[0])) % 16u;
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]+%u", static_cast<u32>(address - A(&VU0.VF[0])) / 16u, offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]", static_cast<u32>(address - A(&VU0.VF[0])) / 16u);
|
||||
}
|
||||
else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.VI[0])) % 16u;
|
||||
const u32 vi = static_cast<u32>(address - A(&VU0.VI[0])) / 16u;
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "VU0.%s+%u", COP2_REG_CTL[vi], offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "VU0.%s", COP2_REG_CTL[vi]);
|
||||
}
|
||||
else if (address >= A(&VU0.ACC) && address < A(&VU0.q))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.ACC));
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "VU0.ACC+%u", offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "VU0.ACC");
|
||||
}
|
||||
else if (address >= A(&VU0.q) && address < A(&VU0.idx))
|
||||
{
|
||||
const u32 offset = static_cast<u32>(address - A(&VU0.q)) % 16u;
|
||||
const char* reg = (address >= A(&VU0.p)) ? "p" : "q";
|
||||
if (offset != 0)
|
||||
len = snprintf(buf, sizeof(buf), "VU0.%s+%u", reg, offset);
|
||||
else
|
||||
len = snprintf(buf, sizeof(buf), "VU0.%s", reg);
|
||||
}
|
||||
|
||||
#undef A
|
||||
len = Address2Symbol(address, buf);
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
@@ -2562,6 +2595,8 @@ StartRecomp:
|
||||
|
||||
s_old_print_address = (ZydisFormatterFunc)&ZydisFormatterPrintAddressAbsolute;
|
||||
ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS, (const void**)&s_old_print_address);
|
||||
s_old_print_disp = (ZydisFormatterFunc)&ZydisFormatterPrintDisplacement;
|
||||
ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_DISP, (const void**)&s_old_print_disp);
|
||||
|
||||
#if 0
|
||||
const bool dump_block = (startpc == 0x00000000);
|
||||
|
||||
Reference in New Issue
Block a user