dynarec: FullCheck was being ignored and FastCheck used instead

Fix crash on arm32
Fix infinite loop on x64
This commit is contained in:
Flyinghead 2019-03-30 10:06:19 +01:00
parent af6993a819
commit 505c5b6c4d
3 changed files with 33 additions and 23 deletions

View File

@ -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);

View File

@ -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;
} }

View File

@ -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;