forked from Mirror/Ryujinx
Don't decode blocks starting outside mapped memory & undefined instead of throw on invalid sysreg coprocessor (#964)
* Don't decode blocks in invalid memory locations. * Emit undefined instruction on invalid coprocessor ...rather than throwing. * Call undefined instruction directly.
This commit is contained in:
parent
25c3b8b356
commit
d9ed827696
2 changed files with 7 additions and 4 deletions
|
@ -47,7 +47,7 @@ namespace ARMeilleure.Decoders
|
||||||
{
|
{
|
||||||
if (!visited.TryGetValue(blkAddress, out Block block))
|
if (!visited.TryGetValue(blkAddress, out Block block))
|
||||||
{
|
{
|
||||||
if (opsCount > MaxInstsPerFunction)
|
if (opsCount > MaxInstsPerFunction || !memory.IsMapped((long)blkAddress))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,8 @@ namespace ARMeilleure.Instructions
|
||||||
|
|
||||||
if (op.Coproc != 15)
|
if (op.Coproc != 15)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException($"Unknown MRC Coprocessor ID 0x{op.Coproc:X16} at 0x{op.Address:X16}.");
|
InstEmit.Und(context);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op.Opc1 != 0)
|
if (op.Opc1 != 0)
|
||||||
|
@ -70,7 +71,8 @@ namespace ARMeilleure.Instructions
|
||||||
|
|
||||||
if (op.Coproc != 15)
|
if (op.Coproc != 15)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException($"Unknown MRC Coprocessor ID 0x{op.Coproc:X16} at 0x{op.Address:X16}.");
|
InstEmit.Und(context);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op.Opc1 != 0)
|
if (op.Opc1 != 0)
|
||||||
|
@ -119,7 +121,8 @@ namespace ARMeilleure.Instructions
|
||||||
|
|
||||||
if (op.Coproc != 15)
|
if (op.Coproc != 15)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException($"Unknown MRC Coprocessor ID 0x{op.Coproc:X16} at 0x{op.Address:X16}.");
|
InstEmit.Und(context);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var opc = op.MrrcOp;
|
var opc = op.MrrcOp;
|
||||||
|
|
Loading…
Reference in a new issue