crashanalysercmd/Libraries/Engine/CrashItemLib/Crash/Registers/Special/CIRegisterCPSR.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.Text;
       
    19 using System.Collections.Generic;
       
    20 using CrashItemLib.Crash;
       
    21 using CrashItemLib.Crash.Base;
       
    22 using CrashItemLib.Crash.Messages;
       
    23 using CrashItemLib.Crash.Container;
       
    24 using CrashItemLib.Crash.Threads;
       
    25 using SymbianUtils.Range;
       
    26 using SymbianStructuresLib.Arm.Registers;
       
    27 using CrashItemLib.Crash.Registers.Visualization;
       
    28 using CrashItemLib.Crash.Registers.Visualization.Bits;
       
    29 using CrashItemLib.Crash.Registers.Visualization.Utilities;
       
    30 
       
    31 namespace CrashItemLib.Crash.Registers.Special
       
    32 {
       
    33     public class CIRegisterCPSR : CIRegister, ICIRegisterVisualizerVisitor
       
    34 	{
       
    35 		#region Constructors
       
    36         public CIRegisterCPSR( CIRegisterList aCollection, uint aValue )
       
    37             : base( aCollection, TArmRegisterType.EArmReg_CPSR, aValue )
       
    38         {
       
    39             PrepareMessage();
       
    40             //
       
    41             CIRegisterVisualization modeARMv5 = new CIRegisterVisualization( this, this, KVisMode_ARMv5 );
       
    42             this.AddChild( modeARMv5 );
       
    43             modeARMv5.Refresh();
       
    44             //
       
    45             CIRegisterVisualization modeARMv6 = new CIRegisterVisualization( this, this, KVisMode_ARMv6 );
       
    46             this.AddChild( modeARMv6 );
       
    47             modeARMv6.Refresh();
       
    48         }
       
    49         #endregion
       
    50 
       
    51         #region API
       
    52         #endregion
       
    53 
       
    54         #region Properties
       
    55         public TArmRegisterBank ProcessorMode
       
    56         {
       
    57             get
       
    58             {
       
    59                 TArmRegisterBank bank = ArmRegisterBankUtils.ExtractBank( this.Value );
       
    60                 return bank;
       
    61             }
       
    62         }
       
    63         #endregion
       
    64 
       
    65         #region Internal constants
       
    66         private const string KVisMode_ARMv5 = "CPSR (ARMv5)";
       
    67         private const string KVisMode_ARMv6 = "CPSR (ARMv6)";
       
    68         #endregion
       
    69 
       
    70         #region ICIRegisterVisualizerVisitor Members
       
    71         void ICIRegisterVisualizerVisitor.Build( CIRegisterVisualization aVisualization )
       
    72         {
       
    73             aVisualization.Clear();
       
    74             //
       
    75             switch ( aVisualization.Description )
       
    76             {
       
    77             default:
       
    78             case KVisMode_ARMv5:
       
    79                 PrepareVisARMv5( aVisualization );
       
    80                 break;
       
    81             case KVisMode_ARMv6:
       
    82                 PrepareVisARMv6( aVisualization );
       
    83                 break;
       
    84             }
       
    85         }
       
    86         #endregion
       
    87 
       
    88         #region Internal constants
       
    89         private const string KReserved = "Reserved";
       
    90         #endregion
       
    91 
       
    92         #region Internal methods
       
    93         private void PrepareMessage()
       
    94         {
       
    95             CIMessage message = CIMessage.NewMessage( Container );
       
    96             message.Title = "Processor Mode";
       
    97             message.Description = string.Format( "CPSR (Current Processor Status Register) indicates that the processor was in [{0}] mode.",
       
    98                                          ArmRegisterBankUtils.BankAsStringLong( ProcessorMode ) );
       
    99             base.AddChild( message );
       
   100         }
       
   101 
       
   102         private void PrepareVisARMv5( CIRegisterVisualization aVisualization )
       
   103         {
       
   104             AddBits0To8( aVisualization, true );
       
   105             AddEndianness( aVisualization, true );
       
   106            
       
   107             // These bits are always reserved - "########", "########", "111111##", "########"
       
   108             AddReserved( aVisualization, 10, 15 );
       
   109 
       
   110             // GE[3:0] bits - reserved in ARMv5 - "########", "####1111", "########", "########"
       
   111             AddReserved( aVisualization, 16, 19 );
       
   112            
       
   113             // These bits are always reserved - "########", "1111####", "########", "########"
       
   114             AddReserved( aVisualization, 20, 23 );
       
   115 
       
   116             // Jazelle bit
       
   117             AddJazelle( aVisualization, true );
       
   118 
       
   119             // These bits are always reserved - "#####11#", "########", "########", "########"
       
   120             AddReserved( aVisualization, 25, 26 );
       
   121 
       
   122             // Reserved bit - Q flag, ARMv5E only. Indicates "overflow and/or saturation has occurred..."
       
   123             AddQFlag( aVisualization, true );
       
   124 
       
   125             // Condition code flags
       
   126             AddConditionCodeFlags( aVisualization );
       
   127         }
       
   128 
       
   129         private void PrepareVisARMv6( CIRegisterVisualization aVisualization )
       
   130         {
       
   131             AddBits0To8( aVisualization, false );
       
   132             AddEndianness( aVisualization, false );
       
   133 
       
   134             // These bits are always reserved - "########", "########", "111111##", "########"
       
   135             AddReserved( aVisualization, 10, 15 );
       
   136 
       
   137             // GE[3:0] bits - reserved in ARMv5 - "########", "####1111", "########", "########"
       
   138             AddBitRange( aVisualization, 16, 19, "Greater than or Equal (SIMD)" );
       
   139 
       
   140             // These bits are always reserved - "########", "1111####", "########", "########"
       
   141             AddReserved( aVisualization, 20, 23 );
       
   142 
       
   143             // Jazelle bit
       
   144             AddJazelle( aVisualization, false );
       
   145 
       
   146             // These bits are always reserved - "#####11#", "########", "########", "########"
       
   147             AddReserved( aVisualization, 25, 26 );
       
   148 
       
   149             // Reserved bit - Q flag, ARMv5E only. Indicates "overflow and/or saturation has occurred..."
       
   150             AddQFlag( aVisualization, false );
       
   151 
       
   152             // Condition code flags
       
   153             AddConditionCodeFlags( aVisualization );
       
   154         }
       
   155 
       
   156         private void AddBits0To8( CIRegisterVisualization aVisualization, bool aIsIABitReserved )
       
   157         {
       
   158             uint value = aVisualization.Register.Value;
       
   159 
       
   160             // Processor mode
       
   161             CIRegisterVisBitRange rangeProcMode = new CIRegisterVisBitRange( Container, 0, 4, "Processor Mode" );
       
   162             rangeProcMode.Interpretation = ArmRegisterBankUtils.BankAsStringLong( ProcessorMode );
       
   163             rangeProcMode.ExtractBits( value, "########", "########", "########", "###11111" );
       
   164             aVisualization.AddChild( rangeProcMode );
       
   165 
       
   166             // Thumb bit
       
   167             CIRegisterVisBit thumbBit = CreateYesNoBit( aVisualization, 5, "########", "########", "########", "##1#####", false, "Thumb Mode", "T" );
       
   168             aVisualization.AddChild( thumbBit );
       
   169 
       
   170             // FIQ, IRQ bits
       
   171             CIRegisterVisBitGroup gpIRQs = new CIRegisterVisBitGroup( Container, "Interrupt Disabled Bits" );
       
   172             CIRegisterVisBit fiqBit = CreateYesNoBit( aVisualization, 6, "########", "########", "########", "#1######", false, "FIQ Disabled", "F" );
       
   173             gpIRQs.Add( fiqBit );
       
   174             CIRegisterVisBit irqBit = CreateYesNoBit( aVisualization, 7, "########", "########", "########", "1#######", false, "IRQ Disabled", "I" );
       
   175             gpIRQs.Add( irqBit );
       
   176 
       
   177             // Imprecise Abort bit - reserved in non-ARMv5
       
   178             CIRegisterVisBit iaBit = CreateYesNoBit( aVisualization, 8, "########", "########", "#######1", "########", aIsIABitReserved, "Imprecise Aborts", "A" );
       
   179             gpIRQs.Add( iaBit );
       
   180 
       
   181             aVisualization.AddChild( gpIRQs );
       
   182         }
       
   183 
       
   184         private void AddEndianness( CIRegisterVisualization aVisualization, bool aIsReserved )
       
   185         {
       
   186             uint value = aVisualization.Register.Value;
       
   187 
       
   188             CIRegisterVisBit eBit = CreateBitValue( aVisualization, 9, "###1####", "########", "######1#", "########", aIsReserved, "Endianness", "Big", "Little", "B", "L" );
       
   189             aVisualization.AddChild( eBit );
       
   190         }
       
   191 
       
   192         private void AddJazelle( CIRegisterVisualization aVisualization, bool aIsReserved )
       
   193         {
       
   194             CIRegisterVisBit bit = CreateYesNoBit( aVisualization, 24, "#######1", "########", "########", "########", aIsReserved, "Jazelle", "J" );
       
   195             aVisualization.AddChild( bit );
       
   196         }
       
   197 
       
   198         private void AddQFlag( CIRegisterVisualization aVisualization, bool aIsReserved )
       
   199         {
       
   200             CIRegisterVisBit bit = CreateYesNoBit( aVisualization, 27, "####1###", "########", "########", "########", aIsReserved, "Q-Flag (DSP Saturation/Overflow)", "Q" );
       
   201             aVisualization.AddChild( bit );
       
   202         }
       
   203 
       
   204         private void AddConditionCodeFlags( CIRegisterVisualization aVisualization )
       
   205         {
       
   206             uint value = aVisualization.Register.Value;
       
   207 
       
   208             CIRegisterVisBitGroup group = new CIRegisterVisBitGroup( Container );
       
   209 
       
   210             CIRegisterVisBit oBit = CreateYesNoBit( aVisualization, 28, "###1####", "########", "########", "########", false, "Overflow (Condition Code)", "O" );
       
   211             group.Add( oBit );
       
   212             CIRegisterVisBit cBit = CreateYesNoBit( aVisualization, 29, "##1#####", "########", "########", "########", false, "Carry (Condition Code)", "C" );
       
   213             group.Add( cBit );
       
   214             CIRegisterVisBit zBit = CreateYesNoBit( aVisualization, 30, "#1######", "########", "########", "########", false, "Zero (Condition Code)", "Z" );
       
   215             group.Add( zBit );
       
   216             CIRegisterVisBit nBit = CreateYesNoBit( aVisualization, 31, "1#######", "########", "########", "########", false, "Negative (Condition Code)", "N" );
       
   217             group.Add( nBit );
       
   218 
       
   219             aVisualization.AddChild( group );
       
   220         }
       
   221 
       
   222         private CIRegisterVisBitRange AddBitRange( CIRegisterVisualization aVisualization, uint aStart, uint aEnd, string aCategory )
       
   223         {
       
   224             // Make the mask
       
   225             AddressRange range = new AddressRange( aStart, aEnd );
       
   226             StringBuilder mask = new StringBuilder();
       
   227             mask.Append( string.Empty.PadLeft( 32, '#' ) );
       
   228             for ( int i=31; i>=0; i-- )
       
   229             {
       
   230                 if ( range.Contains( i ) )
       
   231                 {
       
   232                     int index = 31 - i;
       
   233                     mask[ index ] = '1';
       
   234                 }
       
   235             }
       
   236 
       
   237             // Reserved
       
   238             uint value = aVisualization.Register.Value;
       
   239 
       
   240             CIRegisterVisBitRange bitRange = new CIRegisterVisBitRange( Container, aStart, aEnd, aCategory );
       
   241             bitRange.ExtractBits( value, mask.ToString() );
       
   242             aVisualization.AddChild( bitRange );
       
   243 
       
   244             return bitRange;
       
   245         }
       
   246 
       
   247         private void AddReserved( CIRegisterVisualization aVisualization, uint aStart, uint aEnd )
       
   248         {
       
   249             CIRegisterVisBitRange range = AddBitRange( aVisualization, aStart, aEnd, KReserved );
       
   250             range.IsReserved = true;
       
   251         }
       
   252 
       
   253         private CIRegisterVisBit CreateBitValue( CIRegisterVisualization aVisualization, int aIndex,
       
   254             string aMaskByte3, string aMaskByte2, string aMaskByte1, string aMaskByte0,
       
   255             bool aReserved, string aCategory, string aInterpretationSet, string aInterpretationClear, string aBitSetCharacter )
       
   256         {
       
   257             CIRegisterVisBit bit = CreateBitValue( aVisualization, aIndex, aMaskByte3, aMaskByte2, aMaskByte1, aMaskByte0, aReserved, aCategory,aInterpretationSet, aInterpretationClear, aBitSetCharacter, string.Empty );
       
   258             return bit;
       
   259         }
       
   260 
       
   261         private CIRegisterVisBit CreateBitValue( CIRegisterVisualization aVisualization, int aIndex, 
       
   262             string aMaskByte3, string aMaskByte2, string aMaskByte1, string aMaskByte0,
       
   263             bool aReserved, string aCategory, string aInterpretationSet, string aInterpretationClear, string aBitSetCharacter, string aBitClearCharacter )
       
   264         {
       
   265             uint value = aVisualization.Register.Value;
       
   266             //
       
   267             CIRegisterVisBit bit = new CIRegisterVisBit( Container, aIndex, VisUtilities.ExtractBit( value, aMaskByte3, aMaskByte2, aMaskByte1, aMaskByte0 ), aCategory, string.Empty );
       
   268             bit.IsReserved = aReserved;
       
   269             bit[ TBit.EBitClear ] = aBitClearCharacter;
       
   270             bit[ TBit.EBitSet ] = aBitSetCharacter;
       
   271             //
       
   272             switch ( bit.Value )
       
   273             {
       
   274             case TBit.EBitSet:
       
   275                 bit.Interpretation = aInterpretationSet;
       
   276                 break;
       
   277             default:
       
   278             case TBit.EBitClear:
       
   279                 bit.Interpretation = aInterpretationClear;
       
   280                 break;
       
   281             }
       
   282             //
       
   283             return bit;
       
   284         }
       
   285 
       
   286         private CIRegisterVisBit CreateYesNoBit( CIRegisterVisualization aVisualization, int aIndex, string aMaskByte3, string aMaskByte2, string aMaskByte1, string aMaskByte0, bool aReserved, string aCategory, string aBitSetCharacter )
       
   287         {
       
   288             CIRegisterVisBit bit = CreateBitValue( aVisualization, aIndex, aMaskByte3, aMaskByte2, aMaskByte1, aMaskByte0, aReserved, aCategory, "Yes", "No", aBitSetCharacter );
       
   289             return bit;
       
   290         }
       
   291         #endregion
       
   292             
       
   293         #region Data members
       
   294         #endregion
       
   295     }
       
   296 }