Пример #1
0
        public static CIRegister New(TArmRegisterType aType, uint aValue, string aName, CIRegisterList aList)
        {
            CIRegister ret = null;

            //
            switch (aType)
            {
            case TArmRegisterType.EArmReg_CPSR:
                ret = new CIRegisterCPSR(aList, aValue);
                break;

            case TArmRegisterType.EArmReg_FSR:
                ret = new CIRegisterFSR(aList, aValue);
                break;

            case TArmRegisterType.EArmReg_EXCCODE:
                ret = new CIRegisterExcCode(aList, aValue);
                break;

            default:
                ret = new CIRegister(aList, aType, aName, aValue);
                break;
            }
            //
            System.Diagnostics.Debug.Assert(ret.Type == aType);
            System.Diagnostics.Debug.Assert(ret.Value == aValue);
            System.Diagnostics.Debug.Assert(ret.Name == aName);
            //
            return(ret);
        }
Пример #2
0
        private void ExtractThreadRegisters(CIThread aThread)
        {
            CIThreadRegisterListCollection threadRegs = aThread.Registers;
            CIRegisterList regListUser = threadRegs[TArmRegisterBank.ETypeUser];
            CIRegisterList regListEXC  = threadRegs[TArmRegisterBank.ETypeException];
            CIRegisterList regListCOP  = threadRegs[TArmRegisterBank.ETypeCoProcessor];
            CIRegisterList regListSVC  = threadRegs[TArmRegisterBank.ETypeSupervisor];

            #region User registers
            foreach (string line in iData[DExcExtractorListType.EListRegistersUser])
            {
                Match m = EM.RegistersUserSet.Match(line);
                if (m.Success)
                {
                    GroupCollection groups   = m.Groups;
                    int             firstReg = int.Parse(groups[1].Value);
                    for (int i = firstReg; i < firstReg + 4; i++)
                    {
                        Group            gp      = groups[2 + (i - firstReg)];
                        uint             value   = uint.Parse(gp.Value, System.Globalization.NumberStyles.HexNumber);
                        TArmRegisterType regType = (TArmRegisterType)i;
                        regListUser[regType].Value = value;
                    }
                }
                else
                {
                    m = EM.RegistersUserCPSR.Match(line);
                    if (m.Success)
                    {
                        // Get CPSR value and set it
                        uint cpsrValue = uint.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
                        threadRegs.CPSR = cpsrValue;
                    }
                }
            }
            #endregion

            #region Exception registers
            foreach (string line in iData[DExcExtractorListType.EListRegistersException])
            {
                Match m = EM.RegistersExceptionSet1.Match(line);
                if (m.Success)
                {
                    GroupCollection groups = m.Groups;
                    //
                    regListEXC[TArmRegisterType.EArmReg_EXCCODE].Value = uint.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
                    regListEXC[TArmRegisterType.EArmReg_EXCPC].Value   = uint.Parse(m.Groups[2].Value, System.Globalization.NumberStyles.HexNumber);
                    //
                    regListCOP[TArmRegisterType.EArmReg_FAR].Value = uint.Parse(m.Groups[3].Value, System.Globalization.NumberStyles.HexNumber);
                    regListCOP[TArmRegisterType.EArmReg_FSR].Value = uint.Parse(m.Groups[4].Value, System.Globalization.NumberStyles.HexNumber);

                    if (regListEXC.Contains(TArmRegisterType.EArmReg_EXCCODE))
                    {
                        CIRegister reg = regListEXC[TArmRegisterType.EArmReg_EXCCODE];
                        System.Diagnostics.Debug.Assert(reg is CIRegisterExcCode);
                        CIRegisterExcCode excReg = (CIRegisterExcCode)reg;
                        //
                        excReg.ExpandToFullExceptionRange();
                    }

                    // It also means it was an exception
                    aThread.ExitInfo.Type = CrashItemLib.Crash.ExitInfo.CIExitInfo.TExitType.EExitTypeException;
                }
                else
                {
                    m = EM.RegistersExceptionSet2.Match(line);
                    if (m.Success)
                    {
                        GroupCollection groups = m.Groups;
                        //
                        regListSVC[TArmRegisterType.EArmReg_SP].Value   = uint.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber);
                        regListSVC[TArmRegisterType.EArmReg_LR].Value   = uint.Parse(m.Groups[2].Value, System.Globalization.NumberStyles.HexNumber);
                        regListSVC[TArmRegisterType.EArmReg_SPSR].Value = uint.Parse(m.Groups[3].Value, System.Globalization.NumberStyles.HexNumber);
                    }
                }
            }
            #endregion
        }