From dc063eac8330da0b18f0f76c7c9c0e484fa10c56 Mon Sep 17 00:00:00 2001 From: merry Date: Tue, 22 Feb 2022 14:11:42 +0000 Subject: ARMeilleure: Implement single stepping (#3133) * Decoder: Implement SingleInstruction decoder mode * Translator: Implement Step * DecoderMode: Rename Normal to MultipleBlocks --- ARMeilleure/Decoders/Decoder.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'ARMeilleure/Decoders/Decoder.cs') diff --git a/ARMeilleure/Decoders/Decoder.cs b/ARMeilleure/Decoders/Decoder.cs index 46774f41..e4839bf7 100644 --- a/ARMeilleure/Decoders/Decoder.cs +++ b/ARMeilleure/Decoders/Decoder.cs @@ -18,7 +18,7 @@ namespace ARMeilleure.Decoders // For lower code quality translation, we set a lower limit since we're blocking execution. private const int MaxInstsPerFunctionLowCq = 500; - public static Block[] Decode(IMemoryManager memory, ulong address, ExecutionMode mode, bool highCq, bool singleBlock) + public static Block[] Decode(IMemoryManager memory, ulong address, ExecutionMode mode, bool highCq, DecoderMode dMode) { List blocks = new List(); @@ -38,7 +38,7 @@ namespace ARMeilleure.Decoders { block = new Block(blkAddress); - if ((singleBlock && visited.Count >= 1) || opsCount > instructionLimit || !memory.IsMapped(blkAddress)) + if ((dMode != DecoderMode.MultipleBlocks && visited.Count >= 1) || opsCount > instructionLimit || !memory.IsMapped(blkAddress)) { block.Exit = true; block.EndAddress = blkAddress; @@ -96,6 +96,12 @@ namespace ARMeilleure.Decoders } } + if (dMode == DecoderMode.SingleInstruction) + { + // Only read at most one instruction + limitAddress = currBlock.Address + 1; + } + FillBlock(memory, mode, currBlock, limitAddress); opsCount += currBlock.OpCodes.Count; @@ -143,7 +149,7 @@ namespace ARMeilleure.Decoders throw new InvalidOperationException($"Decoded a single empty exit block. Entry point = 0x{address:X}."); } - if (!singleBlock) + if (dMode == DecoderMode.MultipleBlocks) { return TailCallRemover.RunPass(address, blocks); } -- cgit v1.2.3