diff options
| author | merry <git@mary.rs> | 2022-02-22 14:11:42 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-22 11:11:42 -0300 |
| commit | dc063eac8330da0b18f0f76c7c9c0e484fa10c56 (patch) | |
| tree | 9207cf611ba077ffeffaddcbc2ec7585dd337e62 /ARMeilleure/Translation | |
| parent | ccf23fc6295dab55bf49823484b34eb1721f6a50 (diff) | |
ARMeilleure: Implement single stepping (#3133)
* Decoder: Implement SingleInstruction decoder mode
* Translator: Implement Step
* DecoderMode: Rename Normal to MultipleBlocks
Diffstat (limited to 'ARMeilleure/Translation')
| -rw-r--r-- | ARMeilleure/Translation/Translator.cs | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/ARMeilleure/Translation/Translator.cs b/ARMeilleure/Translation/Translator.cs index 611716e2..389adf29 100644 --- a/ARMeilleure/Translation/Translator.cs +++ b/ARMeilleure/Translation/Translator.cs @@ -209,6 +209,17 @@ namespace ARMeilleure.Translation return nextAddr; } + public ulong Step(State.ExecutionContext context, ulong address) + { + TranslatedFunction func = Translate(address, context.ExecutionMode, highCq: false, singleStep: true); + + address = func.Execute(context); + + EnqueueForDeletion(address, func); + + return address; + } + internal TranslatedFunction GetOrTranslate(ulong address, ExecutionMode mode) { if (!Functions.TryGetValue(address, out TranslatedFunction func)) @@ -242,7 +253,7 @@ namespace ARMeilleure.Translation } } - internal TranslatedFunction Translate(ulong address, ExecutionMode mode, bool highCq) + internal TranslatedFunction Translate(ulong address, ExecutionMode mode, bool highCq, bool singleStep = false) { var context = new ArmEmitterContext( Memory, @@ -255,7 +266,7 @@ namespace ARMeilleure.Translation Logger.StartPass(PassName.Decoding); - Block[] blocks = Decoder.Decode(Memory, address, mode, highCq, singleBlock: false); + Block[] blocks = Decoder.Decode(Memory, address, mode, highCq, singleStep ? DecoderMode.SingleInstruction : DecoderMode.MultipleBlocks); Logger.EndPass(PassName.Decoding); @@ -285,14 +296,14 @@ namespace ARMeilleure.Translation var options = highCq ? CompilerOptions.HighCq : CompilerOptions.None; - if (context.HasPtc) + if (context.HasPtc && !singleStep) { options |= CompilerOptions.Relocatable; } CompiledFunction compiledFunc = Compiler.Compile(cfg, argTypes, retType, options); - if (context.HasPtc) + if (context.HasPtc && !singleStep) { Hash128 hash = Ptc.ComputeHash(Memory, address, funcSize); |
