crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Arm/Registers/General/ArmRegister.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:50:58 +0200
changeset 0 818e61de6cd1
permissions -rw-r--r--
Add initial version of Crash Analyser cmdline under EPL

/*
* 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
    }
}