dynarec: FullCheck was being ignored and FastCheck used instead
Fix crash on arm32 Fix infinite loop on x64
This commit is contained in:
parent
af6993a819
commit
505c5b6c4d
|
@ -167,12 +167,12 @@ SmcCheckEnum DoCheck(u32 pc)
|
||||||
|
|
||||||
// Full Check everything
|
// Full Check everything
|
||||||
case FullCheck:
|
case FullCheck:
|
||||||
return FastCheck;
|
return FullCheck;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
die("Unhandled settings.dynarec.SmcCheckLevel");
|
die("Unhandled settings.dynarec.SmcCheckLevel");
|
||||||
|
return FullCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnalyseBlock(RuntimeBlockInfo* blk);
|
void AnalyseBlock(RuntimeBlockInfo* blk);
|
||||||
|
|
|
@ -2121,11 +2121,14 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset,
|
||||||
case FastCheck: {
|
case FastCheck: {
|
||||||
MOV32(r0,block->addr);
|
MOV32(r0,block->addr);
|
||||||
u32* ptr=(u32*)GetMemPtr(block->addr,4);
|
u32* ptr=(u32*)GetMemPtr(block->addr,4);
|
||||||
MOV32(r2,(u32)ptr);
|
if (ptr != NULL)
|
||||||
LDR(r2,r2,0);
|
{
|
||||||
MOV32(r1,*ptr);
|
MOV32(r2,(u32)ptr);
|
||||||
CMP(r1,r2);
|
LDR(r2,r2,0);
|
||||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
MOV32(r1,*ptr);
|
||||||
|
CMP(r1,r2);
|
||||||
|
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2139,24 +2142,30 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset,
|
||||||
if (sz > 2)
|
if (sz > 2)
|
||||||
{
|
{
|
||||||
u32* ptr=(u32*)GetMemPtr(addr,4);
|
u32* ptr=(u32*)GetMemPtr(addr,4);
|
||||||
MOV32(r2,(u32)ptr);
|
if (ptr != NULL)
|
||||||
LDR(r2,r2,0);
|
{
|
||||||
MOV32(r1,*ptr);
|
MOV32(r2,(u32)ptr);
|
||||||
CMP(r1,r2);
|
LDR(r2,r2,0);
|
||||||
|
MOV32(r1,*ptr);
|
||||||
|
CMP(r1,r2);
|
||||||
|
|
||||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||||
|
}
|
||||||
addr += 4;
|
addr += 4;
|
||||||
sz -= 4;
|
sz -= 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u16* ptr = (u16 *)GetMemPtr(addr, 2);
|
u16* ptr = (u16 *)GetMemPtr(addr, 2);
|
||||||
MOV32(r2, (u32)ptr);
|
if (ptr != NULL)
|
||||||
LDRH(r2, r2, 0, AL);
|
{
|
||||||
MOVW(r1, *ptr, AL);
|
MOV32(r2, (u32)ptr);
|
||||||
CMP(r1, r2);
|
LDRH(r2, r2, 0, AL);
|
||||||
|
MOVW(r1, *ptr, AL);
|
||||||
|
CMP(r1, r2);
|
||||||
|
|
||||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||||
|
}
|
||||||
addr += 2;
|
addr += 2;
|
||||||
sz -= 2;
|
sz -= 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1108,12 +1108,12 @@ private:
|
||||||
s32 sz=block->sh4_code_size;
|
s32 sz=block->sh4_code_size;
|
||||||
u32 sa=block->addr;
|
u32 sa=block->addr;
|
||||||
|
|
||||||
mov(call_regs[0], block->addr);
|
void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
||||||
|
if (ptr)
|
||||||
while (sz > 0)
|
|
||||||
{
|
{
|
||||||
void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
mov(call_regs[0], block->addr);
|
||||||
if (ptr)
|
|
||||||
|
while (sz > 0)
|
||||||
{
|
{
|
||||||
mov(rax, reinterpret_cast<uintptr_t>(ptr));
|
mov(rax, reinterpret_cast<uintptr_t>(ptr));
|
||||||
|
|
||||||
|
@ -1136,8 +1136,9 @@ private:
|
||||||
sa += 2;
|
sa += 2;
|
||||||
}
|
}
|
||||||
jne(reinterpret_cast<const void*>(&ngen_blockcheckfail));
|
jne(reinterpret_cast<const void*>(&ngen_blockcheckfail));
|
||||||
|
ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue