mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-06 03:47:44 +00:00
* Add code to flush the ICache, which any self-respecting SMC must do
* Restore registers *after* everything else to avoid any possible side effects This fixes McCat-imp. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10147 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c282f5a380
commit
a59f41fc6c
@ -380,18 +380,21 @@ void JITResolver::CompilationCallback() {
|
||||
// Overwrite it
|
||||
TheJITResolver->insertJumpAtAddr(Target, CodeBegin);
|
||||
|
||||
RestoreRegisters(DoubleFP, FSR, FPRS, CCR);
|
||||
// Flush the I-Cache: FLUSH clears out a doubleword at a given address
|
||||
// Self-modifying code MUST clear out the I-Cache to be portable
|
||||
#if defined(sparc) || defined(__sparc__) || defined(__sparcv9)
|
||||
for (int i = -Offset, e = 32-((int64_t)Offset); i < e; i += 8)
|
||||
__asm__ __volatile__ ("flush %%i7 + %0" : : "r" (i));
|
||||
#endif
|
||||
|
||||
// Change the return address to re-execute the restore, then the jump.
|
||||
// However, we can't just modify %i7 here, because we return to the function
|
||||
// that will restore the floating-point registers for us. Thus, we just return
|
||||
// the value we want it to be, and the parent will take care of setting %i7
|
||||
// correctly.
|
||||
DEBUG(std::cerr << "Callback returning to: 0x"
|
||||
<< std::hex << (CameFrom-Offset-12) << "\n");
|
||||
#if defined(sparc) || defined(__sparc__) || defined(__sparcv9)
|
||||
__asm__ __volatile__ ("sub %%i7, %0, %%i7" : : "r" (Offset+12));
|
||||
#endif
|
||||
|
||||
RestoreRegisters(DoubleFP, FSR, FPRS, CCR);
|
||||
}
|
||||
|
||||
/// emitStubForFunction - This method is used by the JIT when it needs to emit
|
||||
|
Loading…
x
Reference in New Issue
Block a user