Exemple #1
0
        public static OpCode DecodeOpCode(MemoryManager memory, ulong address, ExecutionMode mode)
        {
            int opCode = memory.ReadInt32((long)address);

            InstDescriptor inst;

            Type type;

            if (mode == ExecutionMode.Aarch64)
            {
                (inst, type) = OpCodeTable.GetInstA64(opCode);
            }
            else
            {
                if (mode == ExecutionMode.Aarch32Arm)
                {
                    (inst, type) = OpCodeTable.GetInstA32(opCode);
                }
                else /* if (mode == ExecutionMode.Aarch32Thumb) */
                {
                    (inst, type) = OpCodeTable.GetInstT32(opCode);
                }
            }

            if (type != null)
            {
                return(MakeOpCode(inst, type, address, opCode));
            }
            else
            {
                return(new OpCode(inst, address, opCode));
            }
        }
Exemple #2
0
        public static OpCode64 DecodeOpCode(CpuThreadState state, MemoryManager memory, long position)
        {
            int opCode = memory.ReadInt32(position);

            Inst inst;

            if (state.ExecutionMode == ExecutionMode.AArch64)
            {
                inst = OpCodeTable.GetInstA64(opCode);
            }
            else
            {
                //TODO: Thumb support.
                inst = OpCodeTable.GetInstA32(opCode);
            }

            OpCode64 decodedOpCode = new OpCode64(Inst.Undefined, position, opCode);

            if (inst.Type != null)
            {
                decodedOpCode = MakeOpCode(inst.Type, inst, position, opCode);
            }

            return(decodedOpCode);
        }
Exemple #3
0
        public static OpCode DecodeOpCode(IMemoryManager memory, ulong address, ExecutionMode mode)
        {
            int opCode = memory.Read <int>(address);

            InstDescriptor inst;

            OpCodeTable.MakeOp makeOp;

            if (mode == ExecutionMode.Aarch64)
            {
                (inst, makeOp) = OpCodeTable.GetInstA64(opCode);
            }
            else
            {
                if (mode == ExecutionMode.Aarch32Arm)
                {
                    (inst, makeOp) = OpCodeTable.GetInstA32(opCode);
                }
                else /* if (mode == ExecutionMode.Aarch32Thumb) */
                {
                    (inst, makeOp) = OpCodeTable.GetInstT32(opCode);
                }
            }

            if (makeOp != null)
            {
                return((OpCode)makeOp(inst, address, opCode));
            }
            else
            {
                return(new OpCode(inst, address, opCode));
            }
        }
Exemple #4
0
        public static OpCode64 DecodeOpCode(MemoryManager memory, long position, ExecutionMode mode)
        {
            int opCode = memory.ReadInt32(position);

            Inst inst;

            if (mode == ExecutionMode.Aarch64)
            {
                inst = OpCodeTable.GetInstA64(opCode);
            }
            else
            {
                if (mode == ExecutionMode.Aarch32Arm)
                {
                    inst = OpCodeTable.GetInstA32(opCode);
                }
                else /* if (mode == ExecutionMode.Aarch32Thumb) */
                {
                    inst = OpCodeTable.GetInstT32(opCode);
                }
            }

            OpCode64 decodedOpCode = new OpCode64(Inst.Undefined, position, opCode);

            if (inst.Type != null)
            {
                decodedOpCode = MakeOpCode(inst.Type, inst, position, opCode);
            }

            return(decodedOpCode);
        }