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); }
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 }