VirtualBox

Ignore:
Timestamp:
Jan 11, 2011 3:17:10 PM (14 years ago)
Author:
vboxsync
Message:

CPUM,Debugger: Registers, still some details left.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/DBGFReg.cpp

    r35470 r35490  
    3030#include <iprt/ctype.h>
    3131#include <iprt/string.h>
     32#include <iprt/uint128.h>
    3233
    3334
     
    156157int dbgfR3RegInit(PVM pVM)
    157158{
    158     return RTSemRWCreate(&pVM->dbgf.s.hRegDbLock);
     159    int rc = VINF_SUCCESS;
     160    if (!pVM->dbgf.s.fRegDbInitialized)
     161    {
     162        rc = RTSemRWCreate(&pVM->dbgf.s.hRegDbLock);
     163        pVM->dbgf.s.fRegDbInitialized = RT_SUCCESS(rc);
     164    }
     165    return rc;
    159166}
    160167
     
    169176    RTSemRWDestroy(pVM->dbgf.s.hRegDbLock);
    170177    pVM->dbgf.s.hRegDbLock = NIL_RTSEMRW;
     178    pVM->dbgf.s.fRegDbInitialized = false;
    171179}
    172180
     
    179187 * @returns true if valid, false if not.
    180188 * @param   pszName             The register name to validate.
    181  */
    182 static bool dbgfR3RegIsNameValid(const char *pszName)
     189 * @param   chDot               Set to '.' if accepted, otherwise 0.
     190 */
     191static bool dbgfR3RegIsNameValid(const char *pszName, char chDot)
    183192{
    184193    const char *psz = pszName;
     
    189198        if (   !RT_C_IS_LOWER(ch)
    190199            && !RT_C_IS_DIGIT(ch)
    191             && ch != '_')
     200            && ch != '_'
     201            && ch != chDot)
    192202            return false;
    193203    if (psz - pszName > DBGF_REG_MAX_NAME)
     
    215225     */
    216226    /* The name components. */
    217     AssertMsgReturn(dbgfR3RegIsNameValid(pszPrefix), ("%s\n", pszPrefix), VERR_INVALID_NAME);
     227    AssertMsgReturn(dbgfR3RegIsNameValid(pszPrefix, 0), ("%s\n", pszPrefix), VERR_INVALID_NAME);
    218228    const char  *psz             = RTStrEnd(pszPrefix, RTSTR_MAX);
    219229    bool const   fNeedUnderscore = RT_C_IS_DIGIT(psz[-1]);
     
    228238    for (iDesc = 0; paRegisters[iDesc].pszName != NULL; iDesc++)
    229239    {
    230         AssertMsgReturn(dbgfR3RegIsNameValid(paRegisters[iDesc].pszName), ("%s (#%u)\n", paRegisters[iDesc].pszName, iDesc), VERR_INVALID_NAME);
     240        AssertMsgReturn(dbgfR3RegIsNameValid(paRegisters[iDesc].pszName, 0), ("%s (#%u)\n", paRegisters[iDesc].pszName, iDesc), VERR_INVALID_NAME);
    231241
    232242        if (enmType == DBGFREGSETTYPE_CPU)
     
    238248        AssertReturn(   paRegisters[iDesc].enmType > DBGFREGVALTYPE_INVALID
    239249                     && paRegisters[iDesc].enmType < DBGFREGVALTYPE_END, VERR_INVALID_PARAMETER);
    240         AssertMsgReturn(paRegisters[iDesc].fFlags & ~DBGFREG_FLAGS_READ_ONLY,
     250        AssertMsgReturn(!(paRegisters[iDesc].fFlags & ~DBGFREG_FLAGS_READ_ONLY),
    241251                        ("%#x (#%u)\n", paRegisters[iDesc].fFlags, iDesc),
    242252                        VERR_INVALID_PARAMETER);
     
    251261            for (; paAliases[iAlias].pszName; iAlias++)
    252262            {
    253                 AssertMsgReturn(dbgfR3RegIsNameValid(paAliases[iAlias].pszName), ("%s (%s)\n", paAliases[iAlias].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
     263                AssertMsgReturn(dbgfR3RegIsNameValid(paAliases[iAlias].pszName, 0), ("%s (%s)\n", paAliases[iAlias].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
    254264                AssertReturn(   paAliases[iAlias].enmType > DBGFREGVALTYPE_INVALID
    255265                             && paAliases[iAlias].enmType < DBGFREGVALTYPE_END, VERR_INVALID_PARAMETER);
     
    264274            for (; paSubFields[iSubField].pszName; iSubField++)
    265275            {
    266                 AssertMsgReturn(dbgfR3RegIsNameValid(paSubFields[iSubField].pszName), ("%s (%s)\n", paSubFields[iSubField].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
     276                AssertMsgReturn(dbgfR3RegIsNameValid(paSubFields[iSubField].pszName, '.'), ("%s (%s)\n", paSubFields[iSubField].pszName, paRegisters[iDesc].pszName), VERR_INVALID_NAME);
    267277                AssertReturn(paSubFields[iSubField].iFirstBit + paSubFields[iSubField].cBits <= 128, VERR_INVALID_PARAMETER);
    268278                AssertReturn(paSubFields[iSubField].cBits + paSubFields[iSubField].cShift <= 128, VERR_INVALID_PARAMETER);
     
    323333        while (RT_SUCCESS(rc))
    324334        {
    325             size_t cchReg = strlen(paRegisters[iDesc].pszName);
    326             memcpy(pszReg, paRegisters[iDesc].pszName, cchReg + 1);
     335            size_t cchReg = strlen(pszRegName);
     336            memcpy(pszReg, pszRegName, cchReg + 1);
    327337            pLookupRec->Core.pszString = MMR3HeapStrDup(pVM, MM_TAG_DBGF_REG, szName);
    328338            if (!pLookupRec->Core.pszString)
     
    332342            pLookupRec->pAlias    = pCurAlias;
    333343            pLookupRec->pSubField = NULL;
     344            pLookupRec++;
    334345
    335346            PCDBGFREGSUBFIELD paSubFields = paRegisters[iDesc].paSubFields;
     
    348359                    pLookupRec->pAlias    = pCurAlias;
    349360                    pLookupRec->pSubField = &paSubFields[iSubField];
     361                    pLookupRec++;
    350362                }
    351363            }
     
    353365            /* next */
    354366            pCurAlias = pNextAlias++;
    355             if (   !pCurAlias
    356                 || !pCurAlias->pszName)
     367            if (!pCurAlias)
    357368                break;
    358369            pszRegName = pCurAlias->pszName;
     370            if (!pszRegName)
     371                break;
    359372        }
    360373    }
     374    Assert(pLookupRec == &pRegSet->paLookupRecs[pRegSet->cLookupRecs]);
    361375
    362376    if (RT_SUCCESS(rc))
     
    406420 *
    407421 * @returns VBox status code.
     422 * @param   pVM             The VM handle.
    408423 * @param   pVCpu           The virtual CPU handle.
    409424 * @param   paRegisters     The register descriptors.
    410425 */
    411 VMMR3_INT_DECL(int) DBGFR3RegRegisterDevice(PVMCPU pVCpu, PCDBGFREGDESC paRegisters)
    412 {
    413     return dbgfR3RegRegisterCommon(pVCpu->pVMR3, paRegisters, DBGFREGSETTYPE_CPU, pVCpu, "cpu", pVCpu->idCpu);
     426VMMR3_INT_DECL(int) DBGFR3RegRegisterCpu(PVM pVM, PVMCPU pVCpu, PCDBGFREGDESC paRegisters)
     427{
     428    if (!pVM->dbgf.s.fRegDbInitialized)
     429    {
     430        int rc = dbgfR3RegInit(pVM);
     431        if (RT_FAILURE(rc))
     432            return rc;
     433    }
     434
     435    return dbgfR3RegRegisterCommon(pVM, paRegisters, DBGFREGSETTYPE_CPU, pVCpu, "cpu", pVCpu->idCpu);
    414436}
    415437
     
    10651087
    10661088/**
    1067  * Performs a left shift on a RTUINT128U value.
    1068  *
    1069  * @returns pVal.
    1070  * @param   pVal                The value to shift (input/output).
    1071  * @param   cBits               The number of bits to shift it.  Negative
    1072  *                              numbers are treated as right shifts.
    1073  */
    1074 static PRTUINT128U dbgfR3RegU128_ShiftLeft(PRTUINT128U pVal, int cBits)
    1075 {
    1076     RTUINT128U const InVal = *pVal;
    1077 
    1078     if (cBits >= 0)
    1079     {
    1080         if (cBits >= 128)
    1081             pVal->s.Lo  = pVal->s.Hi = 0;
    1082         else if (cBits >= 64)
    1083         {
    1084             pVal->s.Lo  = 0;
    1085             pVal->s.Hi  = InVal.s.Lo << (cBits - 64);
    1086         }
    1087         else
    1088         {
    1089             pVal->s.Hi  = InVal.s.Hi << cBits;
    1090             pVal->s.Hi |= InVal.s.Lo >> (64 - cBits);
    1091             pVal->s.Lo  = InVal.s.Lo << cBits;
    1092         }
    1093     }
    1094     else
    1095     {
    1096         /* (right shift) */
    1097         cBits = -cBits;
    1098         if (cBits >= 128)
    1099             pVal->s.Lo  = pVal->s.Hi = 0;
    1100         else if (cBits >= 64)
    1101         {
    1102             pVal->s.Hi  = 0;
    1103             pVal->s.Lo  = InVal.s.Hi >> (cBits - 64);
    1104         }
    1105         else
    1106         {
    1107             pVal->s.Lo  = InVal.s.Lo >> cBits;
    1108             pVal->s.Lo |= InVal.s.Hi << (64 - cBits);
    1109             pVal->s.Hi  = InVal.s.Hi >> cBits;
    1110         }
    1111     }
    1112     return pVal;
    1113 }
    1114 
    1115 
    1116 /**
    1117  * ANDs the RTUINT128U value against a bitmask made up of the first @a cBits
    1118  * bits.
    1119  *
    1120  * @returns pVal.
    1121  * @param   pVal                The value to shift (input/output).
    1122  * @param   cBits               The number of bits in the AND mask.
    1123  */
    1124 static PRTUINT128U dbgfR3RegU128_AndNFirstBits(PRTUINT128U pVal, unsigned cBits)
    1125 {
    1126     if (cBits <= 64)
    1127     {
    1128         pVal->s.Hi  = 0;
    1129         pVal->s.Lo &= RT_BIT_64(cBits) - 1;
    1130     }
    1131     else if (cBits < 128)
    1132         pVal->s.Hi &= RT_BIT_64(cBits - 64) - 1;
    1133     return pVal;
    1134 }
    1135 
    1136 
    1137 /**
    11381089 * On CPU worker for the register queries, used by dbgfR3RegNmQueryWorker.
    11391090 *
     
    11771128                if (RT_SUCCESS(rc))
    11781129                {
    1179                     dbgfR3RegU128_ShiftLeft(&pValue->u128, -pSubField->iFirstBit);
    1180                     dbgfR3RegU128_AndNFirstBits(&pValue->u128, pSubField->cBits);
     1130                    RTUInt128AssignShiftLeft(&pValue->u128, -pSubField->iFirstBit);
     1131                    RTUInt128AssignAndNFirstBits(&pValue->u128, pSubField->cBits);
    11811132                    if (pSubField->cShift)
    1182                         dbgfR3RegU128_ShiftLeft(&pValue->u128, pSubField->cShift);
     1133                        RTUInt128AssignShiftLeft(&pValue->u128, pSubField->cShift);
    11831134                }
    11841135            }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette