void WriteFuncStub(u32 stubAddr, u32 symAddr) { // Note that this should be J not JAL, as otherwise control will return to the stub.. Memory::Write_U32(MIPS_MAKE_J(symAddr), stubAddr); // Note: doing that, we can't trace external module calls, so maybe something else should be done to debug more efficiently // Perhaps a syscall here (and verify support in jit), marking the module by uid (debugIdentifier)? Memory::Write_U32(MIPS_MAKE_NOP(), stubAddr + 4); }
void WriteSyscall(const char *moduleName, u32 nib, u32 address) { if (nib == 0) { Memory::Write_U32(MIPS_MAKE_JR_RA(), address); //patched out? Memory::Write_U32(MIPS_MAKE_NOP(), address+4); //patched out? return; } Memory::Write_U32(MIPS_MAKE_JR_RA(), address); // jr ra Memory::Write_U32(GetSyscallOp(moduleName, nib), address + 4); }
HLEHelperThread::HLEHelperThread(const char *threadName, u32 instructions[], u32 instrCount, u32 prio, int stacksize) { u32 instrBytes = instrCount * sizeof(u32); u32 totalBytes = instrBytes + sizeof(u32) * 2; AllocEntry(totalBytes); Memory::Memcpy(entry_, instructions, instrBytes); // Just to simplify things, we add the return here. Memory::Write_U32(MIPS_MAKE_JR_RA(), entry_ + instrBytes + 0); Memory::Write_U32(MIPS_MAKE_NOP(), entry_ + instrBytes + 4); Create(threadName, prio, stacksize); }
bool WriteSyscall(const char *moduleName, u32 nib, u32 address) { if (nib == 0) { WARN_LOG_REPORT(HLE, "Wrote patched out nid=0 syscall (%s)", moduleName); Memory::Write_U32(MIPS_MAKE_JR_RA(), address); //patched out? Memory::Write_U32(MIPS_MAKE_NOP(), address+4); //patched out? return true; } int modindex = GetModuleIndex(moduleName); if (modindex != -1) { Memory::Write_U32(MIPS_MAKE_JR_RA(), address); // jr ra Memory::Write_U32(GetSyscallOp(moduleName, nib), address + 4); return true; } else { ERROR_LOG_REPORT(HLE, "Unable to write unknown syscall: %s/%08x", moduleName, nib); return false; } }