crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Arm/Registers/General/ArmRegister.cs
changeset 0 818e61de6cd1
--- /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
+    }
+}