crashanalysercmd/Libraries/Engine/CrashDebuggerLib/Structures/UserContextTable/UserContextTable.cs
changeset 0 818e61de6cd1
equal deleted inserted replaced
-1:000000000000 0:818e61de6cd1
       
     1 /*
       
     2 * Copyright (c) 2004-2008 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 
       
    18 using System;
       
    19 using System.Collections.Generic;
       
    20 using System.Text;
       
    21 using System.Reflection;
       
    22 using SymbianStructuresLib.Arm.Registers;
       
    23 
       
    24 namespace CrashDebuggerLib.Structures.UserContextTable
       
    25 {
       
    26     internal class UserContextTable : IEnumerable<UserContextTableEntry>
       
    27     {
       
    28         #region Enumerations
       
    29         public enum TArmRegisterIndex
       
    30         {
       
    31             EArmR0 = 0,
       
    32             EArmR1 = 1,
       
    33             EArmR2 = 2,
       
    34             EArmR3 = 3,
       
    35             EArmR4 = 4,
       
    36             EArmR5 = 5,
       
    37             EArmR6 = 6,
       
    38             EArmR7 = 7,
       
    39             EArmR8 = 8,
       
    40             EArmR9 = 9,
       
    41             EArmR10 = 10,
       
    42             EArmR11 = 11,
       
    43             EArmR12 = 12,
       
    44             EArmSp = 13,
       
    45             EArmLr = 14,
       
    46             EArmPc = 15,
       
    47             EArmFlags = 16,
       
    48             EArmDacr = 17
       
    49         }
       
    50         #endregion
       
    51 
       
    52         #region Constructors
       
    53         public UserContextTable( TUserContextType aType )
       
    54         {
       
    55             iType = aType;
       
    56             //
       
    57             List<UserContextTableEntry> entries = new List<UserContextTableEntry>();
       
    58             int count = EntryCount;
       
    59             for ( int i = 0; i < count; i++ )
       
    60             {
       
    61                 UserContextTableEntry entry = new UserContextTableEntry();
       
    62                 entries.Add( entry );
       
    63             }
       
    64             //
       
    65             iEntries = entries.ToArray();
       
    66         }
       
    67         #endregion
       
    68 
       
    69         #region API
       
    70         public static bool IsSupported( TArmRegisterType aType )
       
    71         {
       
    72             bool ret = false;
       
    73             //
       
    74             switch ( aType )
       
    75             {
       
    76             case TArmRegisterType.EArmReg_00:
       
    77             case TArmRegisterType.EArmReg_01:
       
    78             case TArmRegisterType.EArmReg_02:
       
    79             case TArmRegisterType.EArmReg_03:
       
    80             case TArmRegisterType.EArmReg_04:
       
    81             case TArmRegisterType.EArmReg_05:
       
    82             case TArmRegisterType.EArmReg_06:
       
    83             case TArmRegisterType.EArmReg_07:
       
    84             case TArmRegisterType.EArmReg_08:
       
    85             case TArmRegisterType.EArmReg_09:
       
    86             case TArmRegisterType.EArmReg_10:
       
    87             case TArmRegisterType.EArmReg_11:
       
    88             case TArmRegisterType.EArmReg_12:
       
    89             case TArmRegisterType.EArmReg_SP:
       
    90             case TArmRegisterType.EArmReg_LR:
       
    91             case TArmRegisterType.EArmReg_PC:
       
    92             case TArmRegisterType.EArmReg_CPSR:
       
    93             case TArmRegisterType.EArmReg_DACR:
       
    94                 ret = true;
       
    95                 break;
       
    96             default:
       
    97                 break;
       
    98             }
       
    99             //
       
   100             return ret;
       
   101         }
       
   102         #endregion
       
   103 
       
   104         #region Properties
       
   105         public UserContextTableEntry this[ TArmRegisterIndex aIndex ]
       
   106         {
       
   107             get
       
   108             {
       
   109                 int index = (int) aIndex;
       
   110                 UserContextTableEntry ret = iEntries[ index ];
       
   111                 return ret;
       
   112             }
       
   113         }
       
   114 
       
   115         public UserContextTableEntry this[ TArmRegisterType aReg ]
       
   116         {
       
   117             get
       
   118             {
       
   119                 // Have to map to our internal type
       
   120                 TArmRegisterIndex reg = Map( aReg );
       
   121                 return this[ reg ];
       
   122             }
       
   123         }
       
   124 
       
   125         public static int EntryCount
       
   126         {
       
   127             get
       
   128             {
       
   129                 Array vals = Enum.GetValues( typeof( TArmRegisterIndex ) );
       
   130                 int count = vals.Length;
       
   131                 return count;
       
   132             }
       
   133         }
       
   134 
       
   135         public TUserContextType Type
       
   136         {
       
   137             get { return iType; }
       
   138         }
       
   139         #endregion
       
   140 
       
   141         #region From System.Object
       
   142         public override string ToString()
       
   143         {
       
   144             StringBuilder ret = new StringBuilder();
       
   145             //
       
   146             foreach ( UserContextTableEntry entry in iEntries )
       
   147             {
       
   148                 ret.AppendFormat( "[{0:x2}, {1:x2}]", (int) entry.Type, (int) entry.Offset );
       
   149             }
       
   150             //
       
   151             return ret.ToString();
       
   152         }
       
   153         #endregion
       
   154 
       
   155         #region Internal methods
       
   156         private static TArmRegisterIndex Map( TArmRegisterType aReg )
       
   157         {
       
   158             TArmRegisterIndex ret = TArmRegisterIndex.EArmR0;
       
   159             //
       
   160             switch ( aReg )
       
   161             {
       
   162             case TArmRegisterType.EArmReg_00:
       
   163                 ret = TArmRegisterIndex.EArmR0;
       
   164                 break;
       
   165             case TArmRegisterType.EArmReg_01:
       
   166                 ret = TArmRegisterIndex.EArmR1;
       
   167                 break;
       
   168             case TArmRegisterType.EArmReg_02:
       
   169                 ret = TArmRegisterIndex.EArmR2;
       
   170                 break;
       
   171             case TArmRegisterType.EArmReg_03:
       
   172                 ret = TArmRegisterIndex.EArmR3;
       
   173                 break;
       
   174             case TArmRegisterType.EArmReg_04:
       
   175                 ret = TArmRegisterIndex.EArmR4;
       
   176                 break;
       
   177             case TArmRegisterType.EArmReg_05:
       
   178                 ret = TArmRegisterIndex.EArmR5;
       
   179                 break;
       
   180             case TArmRegisterType.EArmReg_06:
       
   181                 ret = TArmRegisterIndex.EArmR6;
       
   182                 break;
       
   183             case TArmRegisterType.EArmReg_07:
       
   184                 ret = TArmRegisterIndex.EArmR7;
       
   185                 break;
       
   186             case TArmRegisterType.EArmReg_08:
       
   187                 ret = TArmRegisterIndex.EArmR8;
       
   188                 break;
       
   189             case TArmRegisterType.EArmReg_09:
       
   190                 ret = TArmRegisterIndex.EArmR9;
       
   191                 break;
       
   192             case TArmRegisterType.EArmReg_10:
       
   193                 ret = TArmRegisterIndex.EArmR10;
       
   194                 break;
       
   195             case TArmRegisterType.EArmReg_11:
       
   196                 ret = TArmRegisterIndex.EArmR11;
       
   197                 break;
       
   198             case TArmRegisterType.EArmReg_12:
       
   199                 ret = TArmRegisterIndex.EArmR12;
       
   200                 break;
       
   201             case TArmRegisterType.EArmReg_SP:
       
   202                 ret = TArmRegisterIndex.EArmSp;
       
   203                 break;
       
   204             case TArmRegisterType.EArmReg_LR:
       
   205                 ret = TArmRegisterIndex.EArmLr;
       
   206                 break;
       
   207             case TArmRegisterType.EArmReg_PC:
       
   208                 ret = TArmRegisterIndex.EArmPc;
       
   209                 break;
       
   210             case TArmRegisterType.EArmReg_CPSR:
       
   211                 ret = TArmRegisterIndex.EArmFlags;
       
   212                 break;
       
   213             case TArmRegisterType.EArmReg_DACR:
       
   214                 ret = TArmRegisterIndex.EArmDacr;
       
   215                 break;
       
   216             default:
       
   217                 throw new NotSupportedException();
       
   218             }
       
   219             //
       
   220             return ret;
       
   221         }
       
   222         #endregion
       
   223 
       
   224         #region From IEnumerable<UserContextTableEntry>
       
   225         public IEnumerator<UserContextTableEntry> GetEnumerator()
       
   226         {
       
   227             foreach ( UserContextTableEntry entry in iEntries )
       
   228             {
       
   229                 yield return entry;
       
   230             }
       
   231         }
       
   232 
       
   233         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
       
   234         {
       
   235             foreach ( UserContextTableEntry entry in iEntries )
       
   236             {
       
   237                 yield return entry;
       
   238             }
       
   239         }
       
   240         #endregion
       
   241 
       
   242         #region Data members
       
   243         private readonly TUserContextType iType;
       
   244         private readonly UserContextTableEntry[] iEntries;
       
   245         #endregion
       
   246     }
       
   247 }