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
|
||||
case FullCheck:
|
||||
return FastCheck;
|
||||
return FullCheck;
|
||||
|
||||
default:
|
||||
die("Unhandled settings.dynarec.SmcCheckLevel");
|
||||
return FullCheck;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AnalyseBlock(RuntimeBlockInfo* blk);
|
||||
|
|
|
@ -2121,11 +2121,14 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset,
|
|||
case FastCheck: {
|
||||
MOV32(r0,block->addr);
|
||||
u32* ptr=(u32*)GetMemPtr(block->addr,4);
|
||||
MOV32(r2,(u32)ptr);
|
||||
LDR(r2,r2,0);
|
||||
MOV32(r1,*ptr);
|
||||
CMP(r1,r2);
|
||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||
if (ptr != NULL)
|
||||
{
|
||||
MOV32(r2,(u32)ptr);
|
||||
LDR(r2,r2,0);
|
||||
MOV32(r1,*ptr);
|
||||
CMP(r1,r2);
|
||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -2139,24 +2142,30 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset,
|
|||
if (sz > 2)
|
||||
{
|
||||
u32* ptr=(u32*)GetMemPtr(addr,4);
|
||||
MOV32(r2,(u32)ptr);
|
||||
LDR(r2,r2,0);
|
||||
MOV32(r1,*ptr);
|
||||
CMP(r1,r2);
|
||||
if (ptr != NULL)
|
||||
{
|
||||
MOV32(r2,(u32)ptr);
|
||||
LDR(r2,r2,0);
|
||||
MOV32(r1,*ptr);
|
||||
CMP(r1,r2);
|
||||
|
||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||
JUMP((u32)ngen_blockcheckfail, CC_NE);
|
||||
}
|
||||
addr += 4;
|
||||
sz -= 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
u16* ptr = (u16 *)GetMemPtr(addr, 2);
|
||||
MOV32(r2, (u32)ptr);
|
||||
LDRH(r2, r2, 0, AL);
|
||||
MOVW(r1, *ptr, AL);
|
||||
CMP(r1, r2);
|
||||
if (ptr != NULL)
|
||||
{
|
||||
MOV32(r2, (u32)ptr);
|
||||
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;
|
||||
sz -= 2;
|
||||
}
|
||||
|
|
|
@ -1108,12 +1108,12 @@ private:
|
|||
s32 sz=block->sh4_code_size;
|
||||
u32 sa=block->addr;
|
||||
|
||||
mov(call_regs[0], block->addr);
|
||||
|
||||
while (sz > 0)
|
||||
void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
||||
if (ptr)
|
||||
{
|
||||
void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
||||
if (ptr)
|
||||
mov(call_regs[0], block->addr);
|
||||
|
||||
while (sz > 0)
|
||||
{
|
||||
mov(rax, reinterpret_cast<uintptr_t>(ptr));
|
||||
|
||||
|
@ -1136,8 +1136,9 @@ private:
|
|||
sa += 2;
|
||||
}
|
||||
jne(reinterpret_cast<const void*>(&ngen_blockcheckfail));
|
||||
ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue