crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Arm/Registers/General/ArmRegister.cs
changeset 0 818e61de6cd1
equal deleted inserted replaced
-1:000000000000 0:818e61de6cd1
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 * 
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 using System;
       
    18 using System.Collections.Generic;
       
    19 using System.Text;
       
    20 using SymbianUtils.Enum;
       
    21 
       
    22 namespace SymbianStructuresLib.Arm.Registers
       
    23 {
       
    24     public class ArmRegister
       
    25     {
       
    26         #region Delegates & events
       
    27         public delegate void ValueChangedHandler( ArmRegister aReg );
       
    28         public event ValueChangedHandler ValueChanged;
       
    29         #endregion
       
    30 
       
    31         #region Constructors
       
    32         public ArmRegister( ArmRegister aCopy )
       
    33             : this( aCopy.OriginalName, aCopy.Value )
       
    34         {
       
    35         }
       
    36 
       
    37         public ArmRegister( string aOriginalName )
       
    38             : this( aOriginalName, 0 )
       
    39         {
       
    40         }
       
    41 
       
    42         public ArmRegister( TArmRegisterType aType )
       
    43             : this( aType, 0 )
       
    44         {
       
    45         }
       
    46 
       
    47         public ArmRegister( TArmRegisterType aType, uint aValue )
       
    48             : this( GetTypeName( aType ), aValue )
       
    49         {
       
    50         }
       
    51 
       
    52         public ArmRegister( string aOriginalName, uint aValue )
       
    53             : this( GetTypeByName( aOriginalName ), aOriginalName, aValue )
       
    54         {
       
    55         }
       
    56 
       
    57         public ArmRegister( TArmRegisterType aType, string aOriginalName, uint aValue )
       
    58         {
       
    59             Value = aValue;
       
    60 
       
    61             // Save original name - used for UI presentation only
       
    62             iOriginalName = aOriginalName;
       
    63 
       
    64             // First map the name to a native type (if possible)
       
    65             RegType = aType;
       
    66 
       
    67             // Then map that type back onto a name, replacing
       
    68             // what the client originally supplied. This is because 
       
    69             // we want to keep names consistent, e.g. R09 everwhere
       
    70             // instead of R9 and R09 depending on client behaviour.
       
    71             Name = GetTypeName( RegType );
       
    72         }
       
    73         #endregion
       
    74 
       
    75         #region API
       
    76         public static TArmRegisterType GetTypeByName( string aName )
       
    77         {
       
    78             TArmRegisterType ret = TArmRegisterType.EArmReg_Other;
       
    79             //
       
    80             switch ( aName.ToUpper() )
       
    81             {
       
    82             case "R0":
       
    83             case "R00":
       
    84                 ret = TArmRegisterType.EArmReg_00;
       
    85                 break;
       
    86             case "R1":
       
    87             case "R01":
       
    88                 ret = TArmRegisterType.EArmReg_01;
       
    89                 break;
       
    90             case "R2":
       
    91             case "R02":
       
    92                 ret = TArmRegisterType.EArmReg_02;
       
    93                 break;
       
    94             case "R3":
       
    95             case "R03":
       
    96                 ret = TArmRegisterType.EArmReg_03;
       
    97                 break;
       
    98             case "R4":
       
    99             case "R04":
       
   100                 ret = TArmRegisterType.EArmReg_04;
       
   101                 break;
       
   102             case "R5":
       
   103             case "R05":
       
   104                 ret = TArmRegisterType.EArmReg_05;
       
   105                 break;
       
   106             case "R6":
       
   107             case "R06":
       
   108                 ret = TArmRegisterType.EArmReg_06;
       
   109                 break;
       
   110             case "R7":
       
   111             case "R07":
       
   112                 ret = TArmRegisterType.EArmReg_07;
       
   113                 break;
       
   114             case "R8":
       
   115             case "R08":
       
   116             case "R8_FIQ":
       
   117             case "R08_FIQ":
       
   118                 ret = TArmRegisterType.EArmReg_08;
       
   119                 break;
       
   120             case "R9":
       
   121             case "R09":
       
   122             case "R9_FIQ":
       
   123             case "R09_FIQ":
       
   124                 ret = TArmRegisterType.EArmReg_09;
       
   125                 break;
       
   126             case "R10":
       
   127             case "R10_FIQ":
       
   128                 ret = TArmRegisterType.EArmReg_10;
       
   129                 break;
       
   130             case "R11":
       
   131             case "R11_FIQ":
       
   132                 ret = TArmRegisterType.EArmReg_11;
       
   133                 break;
       
   134             case "R12":
       
   135             case "R12_FIQ":
       
   136                 ret = TArmRegisterType.EArmReg_12;
       
   137                 break;
       
   138             case "R13":
       
   139             case "R13_USR":
       
   140             case "R13_FIQ":
       
   141             case "R13_SVC":
       
   142             case "R13_SYS":
       
   143             case "R13_IRQ":
       
   144             case "R13_ABT":
       
   145             case "R13_UND":
       
   146             case "SP":
       
   147                 ret = TArmRegisterType.EArmReg_SP;
       
   148                 break;
       
   149             case "R14":
       
   150             case "R14_USR":
       
   151             case "R14_FIQ":
       
   152             case "R14_SVC":
       
   153             case "R14_IRQ":
       
   154             case "R14_ABT":
       
   155             case "R14_UND":
       
   156             case "R14_SYS":
       
   157             case "LR":
       
   158                 ret = TArmRegisterType.EArmReg_LR;
       
   159                 break;
       
   160             case "R15":
       
   161             case "R15_USR":
       
   162             case "R15_FIQ":
       
   163             case "R15_SVC":
       
   164             case "R15_IRQ":
       
   165             case "R15_ABT":
       
   166             case "R15_UND":
       
   167             case "R15_SYS":
       
   168             case "PC":
       
   169                 ret = TArmRegisterType.EArmReg_PC;
       
   170                 break;
       
   171             case "CPSR":
       
   172                 ret = TArmRegisterType.EArmReg_CPSR;
       
   173                 break;
       
   174             case "SPSR":
       
   175             case "SPSR_USR":
       
   176             case "SPSR_SVC":
       
   177             case "SPSR_IRQ":
       
   178             case "SPSR_FIQ":
       
   179             case "SPSR_ABT":
       
   180             case "SPSR_UND":
       
   181             case "SPSR_SYS":
       
   182                 ret = TArmRegisterType.EArmReg_SPSR;
       
   183                 break;
       
   184             case "DACR":
       
   185                 ret = TArmRegisterType.EArmReg_DACR;
       
   186                 break;
       
   187             case "FAR":
       
   188                 ret = TArmRegisterType.EArmReg_FAR;
       
   189                 break;
       
   190             case "FSR":
       
   191                 ret = TArmRegisterType.EArmReg_FSR;
       
   192                 break;
       
   193             case "CAR":
       
   194                 ret = TArmRegisterType.EArmReg_CAR;
       
   195                 break;
       
   196             case "MMUID":
       
   197                 ret = TArmRegisterType.EArmReg_MMUID;
       
   198                 break;
       
   199             case "MMUCR":
       
   200                 ret = TArmRegisterType.EArmReg_MMUCR;
       
   201                 break;
       
   202             case "AUXCR":
       
   203                 ret = TArmRegisterType.EArmReg_AUXCR;
       
   204                 break;
       
   205             case "FPEXC":
       
   206                 ret = TArmRegisterType.EArmReg_FPEXC;
       
   207                 break;
       
   208             case "CTYPE":
       
   209                 ret = TArmRegisterType.EArmReg_CTYPE;
       
   210                 break;
       
   211             case "EXC_CODE":
       
   212                 ret = TArmRegisterType.EArmReg_EXCCODE;
       
   213                 break;
       
   214             case "EXC_PC":
       
   215                 ret = TArmRegisterType.EArmReg_EXCPC;
       
   216                 break;
       
   217 
       
   218             /////////////////////////////////
       
   219             // CO-PROCESSOR SYSTEM CONTROL
       
   220             /////////////////////////////////
       
   221             case "SYSCON_CONTROL":
       
   222                 ret = TArmRegisterType.EArmReg_SysCon_Control;
       
   223                 break;
       
   224 
       
   225             /////////////////////
       
   226             // ETM
       
   227             /////////////////////
       
   228             case "ETM_CONTROL":
       
   229                 ret = TArmRegisterType.EArmReg_ETM_Control;
       
   230                 break;
       
   231             case "ETM_ID":
       
   232                 ret = TArmRegisterType.EArmReg_ETM_Id;
       
   233                 break;
       
   234 
       
   235             /////////////////////
       
   236             // ETB
       
   237             /////////////////////
       
   238             case "ETB_RAM_DEPTH":
       
   239                 ret = TArmRegisterType.EArmReg_ETB_RamDepth;
       
   240                 break;
       
   241             case "ETB_RAM_WIDTH":
       
   242                 ret = TArmRegisterType.EArmReg_ETB_RamWidth;
       
   243                 break;
       
   244             case "ETB_STATUS":
       
   245                 ret = TArmRegisterType.EArmReg_ETB_Status;
       
   246                 break;
       
   247             case "ETB_RAM_WRITE_POINTER":
       
   248                 ret = TArmRegisterType.EArmReg_ETB_RamWritePointer;
       
   249                 break;
       
   250             case "ETB_TRIGGER_COUNTER":
       
   251                 ret = TArmRegisterType.EArmReg_ETB_TriggerCounter;
       
   252                 break;
       
   253             case "ETB_CONTROL":
       
   254                 ret = TArmRegisterType.EArmReg_ETB_Control;
       
   255                 break;
       
   256             case "ETB_ID":
       
   257                 ret = TArmRegisterType.EArmReg_ETB_Id;
       
   258                 break;
       
   259 
       
   260             /////////////////////
       
   261             // CATCH ALL
       
   262             /////////////////////
       
   263             default:
       
   264                 break;
       
   265             }
       
   266             //
       
   267             return ret;
       
   268         }
       
   269 
       
   270         public static string GetTypeName( TArmRegisterType aType )
       
   271         {
       
   272             string ret = "??";
       
   273             //
       
   274             try
       
   275             {
       
   276                 ret = EnumUtils.ToString( aType );
       
   277             }
       
   278             catch ( Exception )
       
   279             {
       
   280             }
       
   281             //
       
   282             return ret;
       
   283         }
       
   284         #endregion
       
   285 
       
   286         #region Properties
       
   287         public uint Value
       
   288         {
       
   289             get { return iValue; }
       
   290             set
       
   291             {
       
   292                 if ( iValue != value )
       
   293                 {
       
   294                     iValue = value;
       
   295 
       
   296                     if ( ValueChanged != null )
       
   297                     {
       
   298                         ValueChanged( this );
       
   299                     }
       
   300                 }
       
   301             }
       
   302         }
       
   303 
       
   304         public string Name
       
   305         {
       
   306             get { return iName; }
       
   307             set { iName = value; }
       
   308         }
       
   309 
       
   310         public string OriginalName
       
   311         {
       
   312             get { return iOriginalName; }
       
   313         }
       
   314 
       
   315         public string TypeName
       
   316         {
       
   317             get { return GetTypeName( RegType ); }
       
   318         }
       
   319 
       
   320         public TArmRegisterType RegType
       
   321         {
       
   322             get { return iType; }
       
   323             set { iType = value; }
       
   324         }
       
   325 
       
   326         public ArmRegisterCollection Parent
       
   327         {
       
   328             get { return iParent; }
       
   329             set { iParent = value; }
       
   330         }
       
   331 
       
   332         public object Tag
       
   333         {
       
   334             get { return iTag; }
       
   335             set { iTag = value; }
       
   336         }
       
   337         #endregion
       
   338 
       
   339         #region Operators
       
   340         public static implicit operator ArmRegister( uint aValue )
       
   341         {
       
   342             return new ArmRegister( TArmRegisterType.EArmReg_Other, aValue );
       
   343         }
       
   344 
       
   345         public static implicit operator uint( ArmRegister aRegister )
       
   346         {
       
   347             return aRegister.Value;
       
   348         }
       
   349         #endregion
       
   350 
       
   351         #region Internal methods
       
   352         #endregion
       
   353 
       
   354         #region Internal constants
       
   355         #endregion
       
   356 
       
   357         #region From System.Object
       
   358         public override string ToString()
       
   359         {
       
   360             StringBuilder ret = new StringBuilder();
       
   361             //
       
   362             ret.AppendFormat( "{0,-12} = 0x{1:x8}", OriginalName, Value );
       
   363             //
       
   364             return ret.ToString();
       
   365         }
       
   366         #endregion
       
   367 
       
   368         #region Data members
       
   369         private readonly string iOriginalName;
       
   370         private uint iValue = 0;
       
   371         private string iName = string.Empty;
       
   372         private TArmRegisterType iType = TArmRegisterType.EArmReg_00;
       
   373         private ArmRegisterCollection iParent = null;
       
   374         private object iTag = null;
       
   375         #endregion
       
   376     }
       
   377 }