crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Arm/Registers/General/ArmRegister.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Arm/Registers/General/ArmRegister.cs Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,377 @@
+/*
+* 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.Collections.Generic;
+using System.Text;
+using SymbianUtils.Enum;
+
+namespace SymbianStructuresLib.Arm.Registers
+{
+ public class ArmRegister
+ {
+ #region Delegates & events
+ public delegate void ValueChangedHandler( ArmRegister aReg );
+ public event ValueChangedHandler ValueChanged;
+ #endregion
+
+ #region Constructors
+ public ArmRegister( ArmRegister aCopy )
+ : this( aCopy.OriginalName, aCopy.Value )
+ {
+ }
+
+ public ArmRegister( string aOriginalName )
+ : this( aOriginalName, 0 )
+ {
+ }
+
+ public ArmRegister( TArmRegisterType aType )
+ : this( aType, 0 )
+ {
+ }
+
+ public ArmRegister( TArmRegisterType aType, uint aValue )
+ : this( GetTypeName( aType ), aValue )
+ {
+ }
+
+ public ArmRegister( string aOriginalName, uint aValue )
+ : this( GetTypeByName( aOriginalName ), aOriginalName, aValue )
+ {
+ }
+
+ public ArmRegister( TArmRegisterType aType, string aOriginalName, uint aValue )
+ {
+ Value = aValue;
+
+ // Save original name - used for UI presentation only
+ iOriginalName = aOriginalName;
+
+ // First map the name to a native type (if possible)
+ RegType = aType;
+
+ // Then map that type back onto a name, replacing
+ // what the client originally supplied. This is because
+ // we want to keep names consistent, e.g. R09 everwhere
+ // instead of R9 and R09 depending on client behaviour.
+ Name = GetTypeName( RegType );
+ }
+ #endregion
+
+ #region API
+ public static TArmRegisterType GetTypeByName( string aName )
+ {
+ TArmRegisterType ret = TArmRegisterType.EArmReg_Other;
+ //
+ switch ( aName.ToUpper() )
+ {
+ case "R0":
+ case "R00":
+ ret = TArmRegisterType.EArmReg_00;
+ break;
+ case "R1":
+ case "R01":
+ ret = TArmRegisterType.EArmReg_01;
+ break;
+ case "R2":
+ case "R02":
+ ret = TArmRegisterType.EArmReg_02;
+ break;
+ case "R3":
+ case "R03":
+ ret = TArmRegisterType.EArmReg_03;
+ break;
+ case "R4":
+ case "R04":
+ ret = TArmRegisterType.EArmReg_04;
+ break;
+ case "R5":
+ case "R05":
+ ret = TArmRegisterType.EArmReg_05;
+ break;
+ case "R6":
+ case "R06":
+ ret = TArmRegisterType.EArmReg_06;
+ break;
+ case "R7":
+ case "R07":
+ ret = TArmRegisterType.EArmReg_07;
+ break;
+ case "R8":
+ case "R08":
+ case "R8_FIQ":
+ case "R08_FIQ":
+ ret = TArmRegisterType.EArmReg_08;
+ break;
+ case "R9":
+ case "R09":
+ case "R9_FIQ":
+ case "R09_FIQ":
+ ret = TArmRegisterType.EArmReg_09;
+ break;
+ case "R10":
+ case "R10_FIQ":
+ ret = TArmRegisterType.EArmReg_10;
+ break;
+ case "R11":
+ case "R11_FIQ":
+ ret = TArmRegisterType.EArmReg_11;
+ break;
+ case "R12":
+ case "R12_FIQ":
+ ret = TArmRegisterType.EArmReg_12;
+ break;
+ case "R13":
+ case "R13_USR":
+ case "R13_FIQ":
+ case "R13_SVC":
+ case "R13_SYS":
+ case "R13_IRQ":
+ case "R13_ABT":
+ case "R13_UND":
+ case "SP":
+ ret = TArmRegisterType.EArmReg_SP;
+ break;
+ case "R14":
+ case "R14_USR":
+ case "R14_FIQ":
+ case "R14_SVC":
+ case "R14_IRQ":
+ case "R14_ABT":
+ case "R14_UND":
+ case "R14_SYS":
+ case "LR":
+ ret = TArmRegisterType.EArmReg_LR;
+ break;
+ case "R15":
+ case "R15_USR":
+ case "R15_FIQ":
+ case "R15_SVC":
+ case "R15_IRQ":
+ case "R15_ABT":
+ case "R15_UND":
+ case "R15_SYS":
+ case "PC":
+ ret = TArmRegisterType.EArmReg_PC;
+ break;
+ case "CPSR":
+ ret = TArmRegisterType.EArmReg_CPSR;
+ break;
+ case "SPSR":
+ case "SPSR_USR":
+ case "SPSR_SVC":
+ case "SPSR_IRQ":
+ case "SPSR_FIQ":
+ case "SPSR_ABT":
+ case "SPSR_UND":
+ case "SPSR_SYS":
+ ret = TArmRegisterType.EArmReg_SPSR;
+ break;
+ case "DACR":
+ ret = TArmRegisterType.EArmReg_DACR;
+ break;
+ case "FAR":
+ ret = TArmRegisterType.EArmReg_FAR;
+ break;
+ case "FSR":
+ ret = TArmRegisterType.EArmReg_FSR;
+ break;
+ case "CAR":
+ ret = TArmRegisterType.EArmReg_CAR;
+ break;
+ case "MMUID":
+ ret = TArmRegisterType.EArmReg_MMUID;
+ break;
+ case "MMUCR":
+ ret = TArmRegisterType.EArmReg_MMUCR;
+ break;
+ case "AUXCR":
+ ret = TArmRegisterType.EArmReg_AUXCR;
+ break;
+ case "FPEXC":
+ ret = TArmRegisterType.EArmReg_FPEXC;
+ break;
+ case "CTYPE":
+ ret = TArmRegisterType.EArmReg_CTYPE;
+ break;
+ case "EXC_CODE":
+ ret = TArmRegisterType.EArmReg_EXCCODE;
+ break;
+ case "EXC_PC":
+ ret = TArmRegisterType.EArmReg_EXCPC;
+ break;
+
+ /////////////////////////////////
+ // CO-PROCESSOR SYSTEM CONTROL
+ /////////////////////////////////
+ case "SYSCON_CONTROL":
+ ret = TArmRegisterType.EArmReg_SysCon_Control;
+ break;
+
+ /////////////////////
+ // ETM
+ /////////////////////
+ case "ETM_CONTROL":
+ ret = TArmRegisterType.EArmReg_ETM_Control;
+ break;
+ case "ETM_ID":
+ ret = TArmRegisterType.EArmReg_ETM_Id;
+ break;
+
+ /////////////////////
+ // ETB
+ /////////////////////
+ case "ETB_RAM_DEPTH":
+ ret = TArmRegisterType.EArmReg_ETB_RamDepth;
+ break;
+ case "ETB_RAM_WIDTH":
+ ret = TArmRegisterType.EArmReg_ETB_RamWidth;
+ break;
+ case "ETB_STATUS":
+ ret = TArmRegisterType.EArmReg_ETB_Status;
+ break;
+ case "ETB_RAM_WRITE_POINTER":
+ ret = TArmRegisterType.EArmReg_ETB_RamWritePointer;
+ break;
+ case "ETB_TRIGGER_COUNTER":
+ ret = TArmRegisterType.EArmReg_ETB_TriggerCounter;
+ break;
+ case "ETB_CONTROL":
+ ret = TArmRegisterType.EArmReg_ETB_Control;
+ break;
+ case "ETB_ID":
+ ret = TArmRegisterType.EArmReg_ETB_Id;
+ break;
+
+ /////////////////////
+ // CATCH ALL
+ /////////////////////
+ default:
+ break;
+ }
+ //
+ return ret;
+ }
+
+ public static string GetTypeName( TArmRegisterType aType )
+ {
+ string ret = "??";
+ //
+ try
+ {
+ ret = EnumUtils.ToString( aType );
+ }
+ catch ( Exception )
+ {
+ }
+ //
+ return ret;
+ }
+ #endregion
+
+ #region Properties
+ public uint Value
+ {
+ get { return iValue; }
+ set
+ {
+ if ( iValue != value )
+ {
+ iValue = value;
+
+ if ( ValueChanged != null )
+ {
+ ValueChanged( this );
+ }
+ }
+ }
+ }
+
+ public string Name
+ {
+ get { return iName; }
+ set { iName = value; }
+ }
+
+ public string OriginalName
+ {
+ get { return iOriginalName; }
+ }
+
+ public string TypeName
+ {
+ get { return GetTypeName( RegType ); }
+ }
+
+ public TArmRegisterType RegType
+ {
+ get { return iType; }
+ set { iType = value; }
+ }
+
+ public ArmRegisterCollection Parent
+ {
+ get { return iParent; }
+ set { iParent = value; }
+ }
+
+ public object Tag
+ {
+ get { return iTag; }
+ set { iTag = value; }
+ }
+ #endregion
+
+ #region Operators
+ public static implicit operator ArmRegister( uint aValue )
+ {
+ return new ArmRegister( TArmRegisterType.EArmReg_Other, aValue );
+ }
+
+ public static implicit operator uint( ArmRegister aRegister )
+ {
+ return aRegister.Value;
+ }
+ #endregion
+
+ #region Internal methods
+ #endregion
+
+ #region Internal constants
+ #endregion
+
+ #region From System.Object
+ public override string ToString()
+ {
+ StringBuilder ret = new StringBuilder();
+ //
+ ret.AppendFormat( "{0,-12} = 0x{1:x8}", OriginalName, Value );
+ //
+ return ret.ToString();
+ }
+ #endregion
+
+ #region Data members
+ private readonly string iOriginalName;
+ private uint iValue = 0;
+ private string iName = string.Empty;
+ private TArmRegisterType iType = TArmRegisterType.EArmReg_00;
+ private ArmRegisterCollection iParent = null;
+ private object iTag = null;
+ #endregion
+ }
+}