mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 06:51:26 +12:00
libmixer fix
This commit is contained in:
parent
c1786df2a6
commit
152feb898e
7 changed files with 19 additions and 130 deletions
|
@ -209,85 +209,3 @@ void Module::PushNewFuncSub(SFunc* func)
|
|||
{
|
||||
Emu.GetSFuncManager().push_back(func);
|
||||
}
|
||||
|
||||
void fix_import(Module* module, u32 nid, u32 addr)
|
||||
{
|
||||
using namespace PPU_instr;
|
||||
|
||||
vm::ptr<u32> ptr = vm::ptr<u32>::make(addr);
|
||||
|
||||
u32 index;
|
||||
|
||||
if (auto func = get_ps3_func_by_nid(nid, &index))
|
||||
{
|
||||
*ptr++ = HACK(index);
|
||||
*ptr++ = BLR();
|
||||
}
|
||||
else
|
||||
{
|
||||
module->Error("Unimplemented function 0x%x (0x%x)", nid, addr);
|
||||
}
|
||||
|
||||
//*ptr++ = ADDIS(11, 0, func >> 16);
|
||||
//*ptr++ = ORI(11, 11, func & 0xffff);
|
||||
//*ptr++ = NOP();
|
||||
//++ptr;
|
||||
//*ptr++ = SC(0);
|
||||
//*ptr++ = BLR();
|
||||
//*ptr++ = NOP();
|
||||
//*ptr++ = NOP();
|
||||
}
|
||||
|
||||
void fix_relocs(Module* module, u32 lib, u32 start, u32 end, u32 seg2)
|
||||
{
|
||||
// start of table:
|
||||
// addr = (u64) addr - seg2, (u32) 1, (u32) 1, (u64) ptr
|
||||
// addr = (u64) addr - seg2, (u32) 0x101, (u32) 1, (u64) ptr - seg2 (???)
|
||||
// addr = (u64) addr, (u32) 0x100, (u32) 1, (u64) ptr - seg2 (???)
|
||||
// addr = (u64) addr, (u32) 0, (u32) 1, (u64) ptr (???)
|
||||
|
||||
for (u32 i = lib + start; i < lib + end; i += 24)
|
||||
{
|
||||
u64 addr = vm::read64(i) + lib;
|
||||
const u64 flag = vm::read64(i + 8);
|
||||
|
||||
if ((u32)addr != addr || (u32)(addr + seg2) != (addr + seg2))
|
||||
{
|
||||
module->Error("fix_relocs(): invalid address (0x%llx)", addr);
|
||||
}
|
||||
else if (flag == 0x10100000001ull)
|
||||
{
|
||||
addr = addr + seg2;
|
||||
u32 value = vm::read32((u32)addr);
|
||||
assert(value == vm::read64(i + 16) + seg2);
|
||||
vm::write32((u32)addr, value + lib);
|
||||
}
|
||||
else if (flag == 0x100000001ull)
|
||||
{
|
||||
addr = addr + seg2;
|
||||
u32 value = vm::read32((u32)addr);
|
||||
assert(value == vm::read64(i + 16));
|
||||
vm::write32((u32)addr, value + lib);
|
||||
}
|
||||
else if (flag == 0x10000000001ull)
|
||||
{
|
||||
u32 value = vm::read32((u32)addr);
|
||||
assert(value == vm::read64(i + 16) + seg2);
|
||||
vm::write32((u32)addr, value + lib);
|
||||
}
|
||||
else if (flag == 1)
|
||||
{
|
||||
u32 value = vm::read32((u32)addr);
|
||||
assert(value == vm::read64(i + 16));
|
||||
vm::write32((u32)addr, value + lib);
|
||||
}
|
||||
else if (flag == 0x10000000004ull || flag == 0x10000000006ull)
|
||||
{
|
||||
// seems to be instruction modifiers for imports (done in other way in FIX_IMPORT)
|
||||
}
|
||||
else
|
||||
{
|
||||
module->Notice("fix_relocs(): 0x%x : 0x%llx", i - lib, flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue