diff options
Diffstat (limited to 'ChocolArm64/Decoder')
| -rw-r--r-- | ChocolArm64/Decoder/ADecoder.cs | 39 | ||||
| -rw-r--r-- | ChocolArm64/Decoder/AOpCode.cs | 8 |
2 files changed, 32 insertions, 15 deletions
diff --git a/ChocolArm64/Decoder/ADecoder.cs b/ChocolArm64/Decoder/ADecoder.cs index 2375c185..32a68ad3 100644 --- a/ChocolArm64/Decoder/ADecoder.cs +++ b/ChocolArm64/Decoder/ADecoder.cs @@ -1,5 +1,6 @@ using ChocolArm64.Instruction; using ChocolArm64.Memory; +using ChocolArm64.State; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -19,21 +20,23 @@ namespace ChocolArm64.Decoder } public static ABlock DecodeBasicBlock( - ATranslator Translator, - AMemory Memory, - long Start) + AThreadState State, + ATranslator Translator, + AMemory Memory, + long Start) { ABlock Block = new ABlock(Start); - FillBlock(Memory, Block); + FillBlock(State, Memory, Block); return Block; } public static (ABlock[] Graph, ABlock Root) DecodeSubroutine( - ATranslator Translator, - AMemory Memory, - long Start) + AThreadState State, + ATranslator Translator, + AMemory Memory, + long Start) { Dictionary<long, ABlock> Visited = new Dictionary<long, ABlock>(); Dictionary<long, ABlock> VisitedEnd = new Dictionary<long, ABlock>(); @@ -60,7 +63,7 @@ namespace ChocolArm64.Decoder { ABlock Current = Blocks.Dequeue(); - FillBlock(Memory, Current); + FillBlock(State, Memory, Current); //Set child blocks. "Branch" is the block the branch instruction //points to (when taken), "Next" is the block at the next address, @@ -148,7 +151,7 @@ namespace ChocolArm64.Decoder return (Graph, Root); } - private static void FillBlock(AMemory Memory, ABlock Block) + private static void FillBlock(AThreadState State, AMemory Memory, ABlock Block) { long Position = Block.Position; @@ -156,7 +159,9 @@ namespace ChocolArm64.Decoder do { - OpCode = DecodeOpCode(Memory, Position); + //TODO: This needs to be changed to support both AArch32 and AArch64, + //once JIT support is introduced on AArch32 aswell. + OpCode = DecodeOpCode(State, Memory, Position); Block.OpCodes.Add(OpCode); @@ -180,11 +185,21 @@ namespace ChocolArm64.Decoder OpCode.Emitter == AInstEmit.Und; } - public static AOpCode DecodeOpCode(AMemory Memory, long Position) + public static AOpCode DecodeOpCode(AThreadState State, AMemory Memory, long Position) { int OpCode = Memory.ReadInt32(Position); - AInst Inst = AOpCodeTable.GetInst(OpCode); + AInst Inst; + + if (State.ExecutionMode == AExecutionMode.AArch64) + { + Inst = AOpCodeTable.GetInstA64(OpCode); + } + else + { + //TODO: Thumb support. + Inst = AOpCodeTable.GetInstA32(OpCode); + } AOpCode DecodedOpCode = new AOpCode(AInst.Undefined, Position, OpCode); diff --git a/ChocolArm64/Decoder/AOpCode.cs b/ChocolArm64/Decoder/AOpCode.cs index 5d127593..bdc8f13a 100644 --- a/ChocolArm64/Decoder/AOpCode.cs +++ b/ChocolArm64/Decoder/AOpCode.cs @@ -9,8 +9,9 @@ namespace ChocolArm64.Decoder public long Position { get; private set; } public int RawOpCode { get; private set; } - public AInstEmitter Emitter { get; protected set; } - public ARegisterSize RegisterSize { get; protected set; } + public AInstEmitter Emitter { get; protected set; } + public AInstInterpreter Interpreter { get; protected set; } + public ARegisterSize RegisterSize { get; protected set; } public AOpCode(AInst Inst, long Position, int OpCode) { @@ -19,7 +20,8 @@ namespace ChocolArm64.Decoder RegisterSize = ARegisterSize.Int64; - Emitter = Inst.Emitter; + Emitter = Inst.Emitter; + Interpreter = Inst.Interpreter; } public int GetBitsCount() |
