protected void TwoByteOpcode(TargetReader reader)
        {
            byte opcode = reader.ReadByte();

            if (TwoByte_Has_ModRM [opcode] != 0)
            {
                DecodeModRM(reader);
            }

            if ((opcode >= 0x80) && (opcode <= 0x8f))
            {
                if ((RexPrefix & X86_REX_Prefix.REX_W) != 0)
                {
                    long offset      = reader.BinaryReader.ReadInt32();
                    long long_target = Address.Address + offset + 5;
                    CallTarget = new TargetAddress(
                        Address.Domain, long_target);
                }
                else if ((Prefix & X86_Prefix.ADDR) != 0)
                {
                    short offset       = reader.BinaryReader.ReadInt16();
                    int   short_target = (short)Address.Address + offset + 3;
                    CallTarget = new TargetAddress(
                        Address.Domain, short_target);
                }
                else
                {
                    int offset = reader.BinaryReader.ReadInt32();
                    CallTarget = Address + offset + 5;
                }
                type = Type.ConditionalJump;
            }
        }
Example #2
0
        internal void InitializeThreads(Inferior inferior)
        {
            TargetAddress ptr = inferior.ReadAddress(MonoDebuggerInfo.ThreadTable);

            while (!ptr.IsNull)
            {
                int size;
                if (MonoDebuggerInfo.CheckRuntimeVersion(81, 3))
                {
                    size = 60 + inferior.TargetMemoryInfo.TargetAddressSize;
                }
                else
                {
                    size = 32 + inferior.TargetMemoryInfo.TargetAddressSize;
                }
                TargetReader reader = new TargetReader(inferior.ReadMemory(ptr, size));

                long          tid       = reader.ReadLongInteger();
                TargetAddress lmf_addr  = reader.ReadAddress();
                TargetAddress end_stack = reader.ReadAddress();

                TargetAddress extended_notifications_addr = ptr + 24;

                if (inferior.TargetMemoryInfo.TargetAddressSize == 4)
                {
                    tid &= 0x00000000ffffffffL;
                }

                reader.Offset += 8;
                ptr            = reader.ReadAddress();

                ThreadFlags flags = ThreadFlags.None;
                if (MonoDebuggerInfo.CheckRuntimeVersion(81, 3))
                {
                    reader.Offset = 56 + inferior.TargetAddressSize;
                    flags         = (ThreadFlags)reader.ReadInteger();
                }

                bool found = false;
                foreach (SingleSteppingEngine engine in process.Engines)
                {
                    if (engine.TID != tid)
                    {
                        continue;
                    }

                    engine.SetManagedThreadData(lmf_addr, extended_notifications_addr);
                    engine.OnManagedThreadCreated(end_stack);
                    check_thread_flags(engine, flags);
                    found = true;
                    break;
                }

                if (!found)
                {
                    Report.Error("Cannot find thread {0:x} in {1}",
                                 tid, process.ProcessStart.CommandLine);
                }
            }
        }
Example #3
0
        public MonoMethodSignature GetMethodSignature(MonoLanguageBackend mono,
                                                      TargetMemoryAccess memory,
                                                      TargetAddress signature)
        {
            int count = memory.ReadInteger(signature + 4) & 0x0000ffff;

            int           offset = memory.TargetAddressSize == 8 ? 16 : 12;
            TargetAddress ret    = memory.ReadAddress(signature + offset);

            TargetType ret_type = mono.ReadType(memory, ret);

            if (count == 0)
            {
                return(new MonoMethodSignature(ret_type, new TargetType [0]));
            }

            offset += memory.TargetAddressSize;
            TargetReader reader = new TargetReader(
                memory.ReadMemory(signature + offset, count * memory.TargetAddressSize));

            TargetType[] param_types = new TargetType [count];
            for (int i = 0; i < count; i++)
            {
                param_types [i] = mono.ReadType(memory, reader.ReadAddress());
            }

            return(new MonoMethodSignature(ret_type, param_types));
        }
Example #4
0
        public GenericParamInfo GetGenericParameter(TargetMemoryAccess memory,
                                                    TargetAddress address)
        {
            int addr_size = memory.TargetMemoryInfo.TargetAddressSize;

            TargetReader reader = new TargetReader(
                memory.ReadMemory(address, 4 * addr_size + 4));
            TargetAddress container = reader.ReadAddress();
            TargetAddress klass     = reader.ReadAddress();
            TargetAddress name_addr = reader.ReadAddress();

            reader.BinaryReader.ReadInt16();              /* flags */
            int pos = reader.BinaryReader.ReadInt16();

            string name;

            if (!name_addr.IsNull)
            {
                name = memory.ReadString(name_addr);
            }
            else
            {
                name = String.Format("!{0}", pos);
            }

            return(new GenericParamInfo(container, klass, name, pos));
        }
Example #5
0
        public AppDomainInfo GetAppDomainInfo(MonoLanguageBackend mono, TargetMemoryAccess memory,
                                              TargetAddress address)
        {
            int          addr_size = memory.TargetMemoryInfo.TargetAddressSize;
            TargetReader reader    = new TargetReader(memory.ReadMemory(address, 12 * addr_size));

            return(new AppDomainInfo(mono, memory, reader));
        }
        protected void DecodeModRM(TargetReader reader)
        {
            ModRM = new X86_ModRM(this, reader.ReadByte());

            if (Is64BitMode && (ModRM.Mod == 0) && ((ModRM.R_M & 0x07) == 0x05))
            {
                is_ip_relative = true;
            }
        }
Example #7
0
        //
        // The following API is new in `terrania'.
        //

        public GenericClassInfo GetGenericClass(TargetMemoryAccess memory,
                                                TargetAddress address)
        {
            int addr_size = memory.TargetMemoryInfo.TargetAddressSize;

            TargetReader  reader     = new TargetReader(memory.ReadMemory(address, 5 * addr_size));
            TargetAddress container  = reader.ReadAddress();
            TargetAddress class_inst = reader.ReadAddress();

            reader.ReadAddress();              /* method_inst */
            reader.ReadAddress();
            TargetAddress cached_class = reader.ReadAddress();

            int inst_id   = memory.ReadInteger(class_inst);
            int inst_data = memory.ReadInteger(class_inst + 4);

            TargetAddress inst_argv;

            if (MonoDebuggerInfo.MajorVersion == 80)
            {
                inst_argv = memory.ReadAddress(class_inst + 8);
            }
            else
            {
                inst_argv = class_inst + 8;
            }

            int type_argc = inst_data & 0x3fffff;

            TargetReader argv_reader = new TargetReader(
                memory.ReadMemory(inst_argv, type_argc * addr_size));

            TargetAddress[] type_args = new TargetAddress [type_argc];
            for (int i = 0; i < type_argc; i++)
            {
                type_args [i] = argv_reader.ReadAddress();
            }

            TargetAddress cached_class_ptr = address + 4 * addr_size;

            return(new GenericClassInfo(container, type_args, cached_class_ptr,
                                        cached_class));
        }
        protected void DoDecodeInstruction(TargetMemoryAccess memory,
                                           TargetAddress address)
        {
            TargetReader reader = new TargetReader(
                memory.ReadMemory(address, MaxInstructionLength));

            while (CheckPrefix(reader))
            {
                reader.Offset++;
            }

            byte opcode = reader.ReadByte();

            if (opcode == 0x0f)
            {
                TwoByteOpcode(reader);
            }
            else
            {
                OneByteOpcode(reader, opcode);
            }

            if (InstructionType != Type.Unknown)
            {
                insn_size     = (int)reader.Offset;
                has_insn_size = true;
            }
            else
            {
                insn_size     = Opcodes.Disassembler.GetInstructionSize(memory, address);
                has_insn_size = true;
            }

            if (has_insn_size)
            {
                code = new byte [insn_size];
                Array.Copy(reader.Contents, 0, code, 0, insn_size);
            }
        }
Example #9
0
        public static MonoDebuggerInfo Create(TargetMemoryAccess memory, TargetAddress info)
        {
            TargetBinaryReader header = memory.ReadMemory(info, 24).GetReader();
            long magic = header.ReadInt64();

            if (magic != DynamicMagic)
            {
                Report.Error("`MONO_DEBUGGER__debugger_info' at {0} has unknown magic {1:x}.", info, magic);
                return(null);
            }

            int version = header.ReadInt32();

            if (version < MinDynamicVersion)
            {
                Report.Error("`MONO_DEBUGGER__debugger_info' has version {0}, " +
                             "but expected at least {1}.", version,
                             MonoDebuggerInfo.MinDynamicVersion);
                return(null);
            }
            if (version > MaxDynamicVersion)
            {
                Report.Error("`MONO_DEBUGGER__debugger_info' has version {0}, " +
                             "but expected at most {1}.", version,
                             MonoDebuggerInfo.MaxDynamicVersion);
                return(null);
            }

            header.ReadInt32();              // minor version
            header.ReadInt32();

            int size = header.ReadInt32();

            TargetReader reader = new TargetReader(memory.ReadMemory(info, size));

            return(new MonoDebuggerInfo(memory, reader));
        }
Example #10
0
        protected void OneByteOpcode(TargetReader reader, byte opcode)
        {
            if (OneByte_Has_ModRM [opcode] != 0)
            {
                DecodeModRM(reader);
            }

            if ((opcode >= 0x70) && (opcode <= 0x7f))
            {
                CallTarget = Address + reader.BinaryReader.ReadSByte() + 2;
                type       = Type.ConditionalJump;
            }
            else if ((opcode >= 0xe0) && (opcode <= 0xe3))
            {
                CallTarget = Address + reader.BinaryReader.ReadSByte() + 2;
                type       = Type.ConditionalJump;
            }
            else if ((opcode == 0xe8) || (opcode == 0xe9))
            {
                if ((RexPrefix & X86_REX_Prefix.REX_W) != 0)
                {
                    long offset      = reader.BinaryReader.ReadInt32();
                    long long_target = Address.Address + offset + 5;
                    CallTarget = new TargetAddress(
                        Address.Domain, long_target);
                }
                else if ((Prefix & X86_Prefix.ADDR) != 0)
                {
                    short offset       = reader.BinaryReader.ReadInt16();
                    int   short_target = (short)Address.Address + offset + 3;
                    CallTarget = new TargetAddress(
                        Address.Domain, short_target);
                }
                else
                {
                    int offset = reader.BinaryReader.ReadInt32();
                    CallTarget = Address + offset + 5;
                }
                type = (opcode == 0xe8) ? Type.Call : Type.Jump;
            }
            else if (opcode == 0xeb)
            {
                CallTarget = Address + reader.BinaryReader.ReadSByte() + 2;
                type       = Type.Jump;
            }
            else if (opcode == 0xc3)
            {
                type = Type.Ret;
            }
            else if (opcode == 0x55)                 /* push %rbp */
            {
                type = Type.Interpretable;
            }
            else if (opcode == 0xc2)
            {
                Displacement = reader.BinaryReader.ReadInt16();
                type         = Type.Ret;
            }
            else if (opcode == 0xff)
            {
                DecodeGroup5(reader);
            }
            else if (opcode == 0x90)
            {
                type = Type.Interpretable;
            }
        }
Example #11
0
        bool CheckPrefix(TargetReader reader)
        {
            byte opcode = reader.PeekByte();

            if ((opcode >= 0x40) && (opcode <= 0x4f))
            {
                if (!Is64BitMode)
                {
                    return(false);
                }

                if ((opcode & 0x01) != 0)
                {
                    RexPrefix |= X86_REX_Prefix.REX_B;
                }
                if ((opcode & 0x02) != 0)
                {
                    RexPrefix |= X86_REX_Prefix.REX_X;
                }
                if ((opcode & 0x04) != 0)
                {
                    RexPrefix |= X86_REX_Prefix.REX_R;
                }
                if ((opcode & 0x08) != 0)
                {
                    RexPrefix |= X86_REX_Prefix.REX_W;
                }
                return(true);
            }
            else if (opcode == 0x26)
            {
                Prefix |= X86_Prefix.ES;
                return(true);
            }
            else if (opcode == 0x2e)
            {
                Prefix |= X86_Prefix.CS;
                return(true);
            }
            else if (opcode == 0x36)
            {
                Prefix |= X86_Prefix.SS;
                return(true);
            }
            else if (opcode == 0x3e)
            {
                Prefix |= X86_Prefix.DS;
                return(true);
            }
            else if (opcode == 0x64)
            {
                Prefix |= X86_Prefix.FS;
                return(true);
            }
            else if (opcode == 0x65)
            {
                Prefix |= X86_Prefix.GS;
                return(true);
            }
            else if (opcode == 0x66)
            {
                Prefix |= X86_Prefix.DATA;
                return(true);
            }
            else if (opcode == 0x67)
            {
                Prefix |= X86_Prefix.ADDR;
                return(true);
            }
            else if (opcode == 0xf0)
            {
                Prefix |= X86_Prefix.LOCK;
                return(true);
            }
            else if (opcode == 0xf2)
            {
                Prefix |= X86_Prefix.REPNZ;
                return(true);
            }
            else if (opcode == 0xf3)
            {
                Prefix |= X86_Prefix.REPZ;
                return(true);
            }

            return(false);
        }
Example #12
0
        internal void InitializeThreads(Inferior inferior)
        {
            TargetAddress ptr = inferior.ReadAddress (MonoDebuggerInfo.ThreadTable);
            while (!ptr.IsNull) {
                int size;
                if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3))
                    size = 60 + inferior.TargetMemoryInfo.TargetAddressSize;
                else
                    size = 32 + inferior.TargetMemoryInfo.TargetAddressSize;
                TargetReader reader = new TargetReader (inferior.ReadMemory (ptr, size));

                long tid = reader.ReadLongInteger ();
                TargetAddress lmf_addr = reader.ReadAddress ();
                TargetAddress end_stack = reader.ReadAddress ();

                TargetAddress extended_notifications_addr = ptr + 24;

                if (inferior.TargetMemoryInfo.TargetAddressSize == 4)
                    tid &= 0x00000000ffffffffL;

                reader.Offset += 8;
                ptr = reader.ReadAddress ();

                ThreadFlags flags = ThreadFlags.None;
                if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3)) {
                    reader.Offset = 56 + inferior.TargetAddressSize;
                    flags = (ThreadFlags) reader.ReadInteger ();
                }

                bool found = false;
                foreach (SingleSteppingEngine engine in process.Engines) {
                    if (engine.TID != tid)
                        continue;

                    engine.SetManagedThreadData (lmf_addr, extended_notifications_addr);
                    engine.OnManagedThreadCreated (end_stack);
                    check_thread_flags (engine, flags);
                    found = true;
                    break;
                }

                if (!found)
                    Report.Error ("Cannot find thread {0:x} in {1}",
                              tid, process.ProcessStart.CommandLine);
            }
        }
Example #13
0
        public static MonoDebuggerInfo Create(TargetMemoryAccess memory, TargetAddress info)
        {
            TargetBinaryReader header = memory.ReadMemory (info, 24).GetReader ();
            long magic = header.ReadInt64 ();
            if (magic != DynamicMagic) {
                Report.Error ("`MONO_DEBUGGER__debugger_info' at {0} has unknown magic {1:x}.", info, magic);
                return null;
            }

            int version = header.ReadInt32 ();
            if (version < MinDynamicVersion) {
                Report.Error ("`MONO_DEBUGGER__debugger_info' has version {0}, " +
                          "but expected at least {1}.", version,
                          MonoDebuggerInfo.MinDynamicVersion);
                return null;
            }
            if (version > MaxDynamicVersion) {
                Report.Error ("`MONO_DEBUGGER__debugger_info' has version {0}, " +
                          "but expected at most {1}.", version,
                          MonoDebuggerInfo.MaxDynamicVersion);
                return null;
            }

            header.ReadInt32 (); // minor version
            header.ReadInt32 ();

            int size = header.ReadInt32 ();

            TargetReader reader = new TargetReader (memory.ReadMemory (info, size));
            return new MonoDebuggerInfo (memory, reader);
        }
Example #14
0
            public AppDomainInfo(MonoLanguageBackend mono, TargetMemoryAccess memory, TargetReader reader)
            {
                int addr_size = memory.TargetMemoryInfo.TargetAddressSize;

                reader.Offset         = 2 * addr_size;
                ApplicationBase       = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                ApplicationName       = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                CachePath             = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                ConfigFile            = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                DynamicBase           = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                reader.Offset        += 3 * addr_size;
                ShadowCopyDirectories = MonoStringObject.ReadString(mono, memory, reader.ReadAddress());
                ShadowCopyFiles       = MonoStringObject.ReadString(mono, memory, reader.ReadAddress()) == "true";
            }
Example #15
0
        protected MonoDebuggerInfo(TargetMemoryAccess memory, TargetReader reader)
        {
            reader.Offset = 8;
            MajorVersion  = reader.ReadInteger();
            MinorVersion  = reader.ReadInteger();

            RuntimeFlags = reader.ReadInteger();

            reader.Offset = 24;

            SymbolTableSize     = reader.ReadInteger();
            MonoTrampolineNum   = reader.ReadInteger();
            MonoTrampolineCode  = reader.ReadAddress();
            NotificationAddress = reader.ReadAddress();
            SymbolTable         = reader.ReadAddress();
            MonoMetadataInfo    = reader.ReadAddress();
            DebuggerVersion     = reader.ReadAddress();

            CompileMethod           = reader.ReadAddress();
            GetVirtualMethod        = reader.ReadAddress();
            GetBoxedObjectMethod    = reader.ReadAddress();
            RuntimeInvoke           = reader.ReadAddress();
            ClassGetStaticFieldData = reader.ReadAddress();
            RunFinally = reader.ReadAddress();
            Initialize = reader.ReadAddress();

            CreateString = reader.ReadAddress();
            LookupClass  = reader.ReadAddress();

            InsertMethodBreakpoint = reader.ReadAddress();
            InsertSourceBreakpoint = reader.ReadAddress();
            RemoveBreakpoint       = reader.ReadAddress();

            RegisterClassInitCallback = reader.ReadAddress();
            RemoveClassInitCallback   = reader.ReadAddress();

            ThreadTable = reader.ReadAddress();

            ExecutableCodeBuffer = reader.ReadAddress();
            BreakpointInfo       = reader.ReadAddress();
            BreakpointInfoIndex  = reader.ReadAddress();

            ExecutableCodeBufferSize = reader.ReadInteger();
            BreakpointArraySize      = reader.ReadInteger();

            GetMethodSignature = reader.ReadAddress();
            InitCodeBuffer     = reader.ReadAddress();

            ThreadVTablePtr = reader.ReadAddress();
            ThreadVTable    = reader.ReadAddress();
            EventHandlerPtr = reader.ReadAddress();
            EventHandler    = reader.ReadAddress();

            UsingMonoDebugger   = reader.ReadAddress();
            InterruptionRequest = reader.ReadAddress();

            if (HasAbortRuntimeInvoke)
            {
                AbortRuntimeInvoke = reader.ReadAddress();
            }

            if (HasThreadAbortSignal)
            {
                ThreadAbortSignal = reader.ReadAddress();
            }

            Report.Debug(DebugFlags.JitSymtab, this);
        }
Example #16
0
        protected void DecodeGroup5(TargetReader reader)
        {
            if ((ModRM.Reg == 2) || (ModRM.Reg == 3))
            {
                type = Type.IndirectCall;
            }
            else if ((ModRM.Reg == 4) || (ModRM.Reg == 5))
            {
                type = Type.IndirectJump;
            }
            else
            {
                return;
            }

            int  displacement = 0;
            bool dereference_addr;

            int register;
            int index_register = -1;

            if ((ModRM.R_M == 5) || (ModRM.R_M == 13))
            {
                /* Special meaning in mod == 00 */
                if (ModRM.Mod == 0)
                {
                    if (Is64BitMode)
                    {
                        displacement   = reader.BinaryReader.ReadInt32();
                        register       = -1;
                        is_ip_relative = true;
                    }
                    else
                    {
                        CallTarget = reader.ReadAddress();
                        return;
                    }
                }
                else
                {
                    register = DecodeRegister(ModRM.R_M);
                }
            }
            else if ((ModRM.R_M == 4) || (ModRM.R_M == 12))
            {
                /* Activate SIB byte if mod != 11 */
                if (ModRM.Mod != 3)
                {
                    SIB = new X86_SIB(this, reader.ReadByte());

                    if ((ModRM.Mod == 0) &&
                        ((SIB.Base == 5) || (SIB.Base == 13)))
                    {
                        displacement = reader.BinaryReader.ReadInt32();
                        CallTarget   = new TargetAddress(
                            reader.AddressDomain, displacement);
                        return;
                    }

                    if (SIB.Index != 4)
                    {
                        index_register = DecodeRegister(SIB.Index);
                    }

                    register = DecodeRegister(SIB.Base);
                }
                else
                {
                    register = DecodeRegister(ModRM.R_M);
                }
            }
            else
            {
                register = DecodeRegister(ModRM.R_M);
            }

            if (ModRM.Mod == 0)
            {
                dereference_addr = true;
            }
            else if (ModRM.Mod == 1)
            {
                displacement     = reader.BinaryReader.ReadSByte();
                dereference_addr = true;
            }
            else if (ModRM.Mod == 2)
            {
                displacement     = reader.BinaryReader.ReadInt32();
                dereference_addr = true;
            }
            else if (ModRM.Mod == 3)
            {
                displacement     = 0;
                dereference_addr = false;
            }
            else
            {
                // Can never happen
                throw new InvalidOperationException();
            }

            Register           = register;
            IndexRegister      = index_register;
            Displacement       = displacement;
            DereferenceAddress = dereference_addr;
        }
Example #17
0
        protected MonoDebuggerInfo(TargetMemoryAccess memory, TargetReader reader)
        {
            reader.Offset = 8;
            MajorVersion              = reader.ReadInteger ();
            MinorVersion              = reader.ReadInteger ();

            RuntimeFlags              = reader.ReadInteger ();

            reader.Offset = 24;

            SymbolTableSize           = reader.ReadInteger ();
            MonoTrampolineNum         = reader.ReadInteger ();
            MonoTrampolineCode        = reader.ReadAddress ();
            NotificationAddress       = reader.ReadAddress ();
            SymbolTable               = reader.ReadAddress ();
            MonoMetadataInfo          = reader.ReadAddress ();
            DebuggerVersion           = reader.ReadAddress ();

            CompileMethod             = reader.ReadAddress ();
            GetVirtualMethod          = reader.ReadAddress ();
            GetBoxedObjectMethod      = reader.ReadAddress ();
            RuntimeInvoke             = reader.ReadAddress ();
            ClassGetStaticFieldData   = reader.ReadAddress ();
            RunFinally                = reader.ReadAddress ();
            Initialize                = reader.ReadAddress ();

            CreateString              = reader.ReadAddress ();
            LookupClass               = reader.ReadAddress ();

            InsertMethodBreakpoint    = reader.ReadAddress ();
            InsertSourceBreakpoint    = reader.ReadAddress ();
            RemoveBreakpoint          = reader.ReadAddress ();

            RegisterClassInitCallback = reader.ReadAddress ();
            RemoveClassInitCallback   = reader.ReadAddress ();

            ThreadTable               = reader.ReadAddress ();

            ExecutableCodeBuffer      = reader.ReadAddress ();
            BreakpointInfo            = reader.ReadAddress ();
            BreakpointInfoIndex       = reader.ReadAddress ();

            ExecutableCodeBufferSize  = reader.ReadInteger ();
            BreakpointArraySize       = reader.ReadInteger ();

            GetMethodSignature        = reader.ReadAddress ();
            InitCodeBuffer            = reader.ReadAddress ();

            ThreadVTablePtr           = reader.ReadAddress ();
            ThreadVTable              = reader.ReadAddress ();
            EventHandlerPtr           = reader.ReadAddress ();
            EventHandler              = reader.ReadAddress ();

            UsingMonoDebugger         = reader.ReadAddress ();
            InterruptionRequest       = reader.ReadAddress ();

            if (HasAbortRuntimeInvoke)
                AbortRuntimeInvoke = reader.ReadAddress ();

            if (HasThreadAbortSignal)
                ThreadAbortSignal = reader.ReadAddress ();

            Report.Debug (DebugFlags.JitSymtab, this);
        }
Example #18
0
 public PlayerTarget(TargetReader targetReader, TargetOfTarget targetOfTarget)
 {
     Reader = targetReader;
     Target = targetOfTarget;
 }