Skip to content

Commit 516e23f

Browse files
Add midasm hook patching.
1 parent 1f5d7c3 commit 516e23f

3 files changed

Lines changed: 110 additions & 0 deletions

File tree

PowerRecomp/recompiler.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,51 @@ bool Recompiler::Recompile(
325325
}
326326
};
327327

328+
auto midAsmHook = config.midAsmHooks.find(base);
329+
if (midAsmHook != config.midAsmHooks.end())
330+
{
331+
print("\t{}(", midAsmHook->second.name);
332+
for (auto& reg : midAsmHook->second.registers)
333+
{
334+
if (out.back() != '(')
335+
out += ", ";
336+
337+
switch (reg[0])
338+
{
339+
case 'c':
340+
if (reg == "ctr")
341+
out += ctr();
342+
else
343+
out += cr(std::atoi(reg.c_str() + 2));
344+
break;
345+
346+
case 'x':
347+
out += xer();
348+
break;
349+
350+
case 'r':
351+
if (reg == "reserved")
352+
out += reserved();
353+
else
354+
out += r(std::atoi(reg.c_str() + 1));
355+
break;
356+
357+
case 'f':
358+
if (reg == "fpscr")
359+
out += "ctx.fpscr";
360+
else
361+
out += f(std::atoi(reg.c_str() + 1));
362+
break;
363+
364+
case 'v':
365+
out += v(std::atoi(reg.c_str() + 1));
366+
break;
367+
}
368+
}
369+
370+
println(");");
371+
}
372+
328373
int id = insn.opcode->id;
329374

330375
// Handling instructions that don't disassemble correctly for some reason here
@@ -2092,6 +2137,48 @@ bool Recompiler::Recompile(const Function& fn)
20922137
for (auto label : switchTable->second.labels)
20932138
labels.emplace(label);
20942139
}
2140+
2141+
auto midAsmHook = config.midAsmHooks.find(addr);
2142+
if (midAsmHook != config.midAsmHooks.end())
2143+
{
2144+
print("extern void {}(", midAsmHook->second.name);
2145+
for (auto& reg : midAsmHook->second.registers)
2146+
{
2147+
if (out.back() != '(')
2148+
out += ", ";
2149+
2150+
switch (reg[0])
2151+
{
2152+
case 'c':
2153+
if (reg == "ctr")
2154+
print("PPCRegister& ctr");
2155+
else
2156+
print("PPCCRRegister& {}", reg);
2157+
break;
2158+
2159+
case 'x':
2160+
print("PPCXERRegister& xer");
2161+
break;
2162+
2163+
case 'r':
2164+
print("PPCRegister& {}", reg);
2165+
break;
2166+
2167+
case 'f':
2168+
if (reg == "fpscr")
2169+
print("PPCFPSCRRegister& fpscr");
2170+
else
2171+
print("PPCRegister& {}", reg);
2172+
break;
2173+
2174+
case 'v':
2175+
print("PPCVRegister& {}", reg);
2176+
break;
2177+
}
2178+
}
2179+
2180+
println(");\n");
2181+
}
20952182
}
20962183

20972184
auto symbol = image.symbols.find(fn.base);

PowerRecomp/recompiler_config.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,20 @@ void RecompilerConfig::Load(const std::string_view& configFilePath)
7373
}
7474
}
7575
}
76+
77+
if (auto midAsmHookArray = toml["midasm_hook"].as_array())
78+
{
79+
for (auto& entry : *midAsmHookArray)
80+
{
81+
auto& table = *entry.as_table();
82+
83+
RecompilerMidAsmHook midAsmHook;
84+
midAsmHook.name = *table["name"].value<std::string>();
85+
for (auto& reg : *table["registers"].as_array())
86+
{
87+
midAsmHook.registers.push_back(*reg.value<std::string>());
88+
}
89+
midAsmHooks.emplace(*table["address"].value<uint32_t>(), std::move(midAsmHook));
90+
}
91+
}
7692
}

PowerRecomp/recompiler_config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ struct RecompilerSwitchTable
66
std::vector<uint32_t> labels;
77
};
88

9+
struct RecompilerMidAsmHook
10+
{
11+
std::string name;
12+
std::vector<std::string> registers;
13+
};
14+
915
struct RecompilerConfig
1016
{
1117
std::string directoryPath;
@@ -33,6 +39,7 @@ struct RecompilerConfig
3339
uint32_t setJmpAddress = 0;
3440
std::unordered_map<uint32_t, uint32_t> functions;
3541
std::unordered_map<uint32_t, uint32_t> invalidInstructions;
42+
std::unordered_map<uint32_t, RecompilerMidAsmHook> midAsmHooks;
3643

3744
void Load(const std::string_view& configFilePath);
3845
};

0 commit comments

Comments
 (0)