diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/Libraries/Engine/CrashItemLib/Crash/Registers/Special/CIRegisterFSR.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/Libraries/Engine/CrashItemLib/Crash/Registers/Special/CIRegisterFSR.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,172 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +using System; +using System.Text; +using System.Collections.Generic; +using CrashItemLib.Crash; +using CrashItemLib.Crash.Base; +using CrashItemLib.Crash.Messages; +using CrashItemLib.Crash.Container; +using CrashItemLib.Crash.Threads; +using SymbianStructuresLib.Arm.Registers; + +namespace CrashItemLib.Crash.Registers.Special +{ + public class CIRegisterFSR : CIRegister + { + #region Enumerations + public enum TFaultType + { + EFaultTypeUnknown = -1, + EFaultTypeVectorException = 00, + EFaultTypeAlignmentFault = 01, + EFaultTypeTerminalException = 02, + EFaultTypeAlignmentFault2 = 03, + EFaultTypeExternalAbortOnLinefetchForSectionTranslation = 04, + EFaultTypeSectionTranslationFault = 05, + EFaultTypeExternalAbortOnLineFetchForPageTranslation = 06, + EFaultTypePageTranslationFault = 07, + EFaultTypeExternalAbortOnNonLinefetchForSectionTranslation = 08, + EFaultTypeDomainFaultOnSectionTranslation = 09, + EFaultTypeExternalAbortOnNonLinefetchForPageTranslation = 10, + EFaultTypeDomainFaultOnPageTranslation = 11, + EFaultTypeExternalAbortOnFirstLevelTranslation = 12, + EFaultTypePermissionFaultOnSection = 13, + EFaultTypeExternalAbortOnSecondLevelTranslation = 14, + EFaultTypePermissionFaultOnPage = 15 + } + #endregion + + #region Constructors + public CIRegisterFSR( CIRegisterList aCollection, uint aValue ) + : base( aCollection, TArmRegisterType.EArmReg_FSR, aValue ) + { + PrepareMessage(); + } + #endregion + + #region API + #endregion + + #region Properties + public TFaultType FaultType + { + get + { + uint fsr = System.Convert.ToUInt32( base.Value ); + uint fsrMask = 0xF; // Look at first 4 bits + fsr = fsr & fsrMask; + // + TFaultType type = TFaultType.EFaultTypeUnknown; + if ( fsr >= 0 && fsr < (uint) TFaultType.EFaultTypePermissionFaultOnPage ) + { + type = (TFaultType) fsr; + } + // + return type; + } + } + + public string FaultDescription + { + get + { + string ret = "Unknown"; + // + switch ( FaultType ) + { + default: + case TFaultType.EFaultTypeUnknown: + break; + case TFaultType.EFaultTypeVectorException: + ret = "Vector exception"; + break; + case TFaultType.EFaultTypeAlignmentFault: + ret = "Alignment fault"; + break; + case TFaultType.EFaultTypeTerminalException: + ret = "Terminal exception"; + break; + case TFaultType.EFaultTypeAlignmentFault2: + ret = "Alignment fault"; + break; + case TFaultType.EFaultTypeExternalAbortOnLinefetchForSectionTranslation: + ret = "External abort on linefetch for section translation"; + break; + case TFaultType.EFaultTypeSectionTranslationFault: + ret = "Section translation fault (unmapped virtual address)"; + break; + case TFaultType.EFaultTypeExternalAbortOnLineFetchForPageTranslation: + ret = "External abort on linefetch for page translation"; + break; + case TFaultType.EFaultTypePageTranslationFault: + ret = "Page translation fault (unmapped virtual address)"; + break; + case TFaultType.EFaultTypeExternalAbortOnNonLinefetchForSectionTranslation: + ret = "External abort on non-linefetch for section translation"; + break; + case TFaultType.EFaultTypeDomainFaultOnSectionTranslation: + ret = "Domain fault on section translation (access to invalid domain)"; + break; + case TFaultType.EFaultTypeExternalAbortOnNonLinefetchForPageTranslation: + ret = "External abort on non-linefetch for page translation"; + break; + case TFaultType.EFaultTypeDomainFaultOnPageTranslation: + ret = "Domain fault on page translation (access to invalid domain)"; + break; + case TFaultType.EFaultTypeExternalAbortOnFirstLevelTranslation: + ret = "External abort on first level translation"; + break; + case TFaultType.EFaultTypePermissionFaultOnSection: + ret = "Permission fault on section (no permission to access virtual address)"; + break; + case TFaultType.EFaultTypeExternalAbortOnSecondLevelTranslation: + ret = "External abort on second level translation"; + break; + case TFaultType.EFaultTypePermissionFaultOnPage: + ret = "Permission fault on page (no permission to access virtual address)"; + break; + } + // + return ret; + } + } + #endregion + + #region Operators + public static implicit operator TFaultType( CIRegisterFSR aReg ) + { + return aReg.FaultType; + } + #endregion + + #region Internal methods + private void PrepareMessage() + { + CIMessage message = CIMessage.NewMessage( Container ); + // + message.Title = "Fault Status"; + message.AddLineFormatted( "The FSR (Fault Status Register) indicates that the processor encountered an fault of type [{0}].", FaultDescription ); + // + base.AddChild( message ); + } + #endregion + + #region Data members + #endregion + } +}