VirtualBox

Changeset 35502 in vbox


Ignore:
Timestamp:
Jan 12, 2011 11:19:30 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
69385
Message:

MachineDebugger::GetRegister: Initial implementation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp

    r35466 r35502  
    10431043}
    10441044
     1045/**
     1046 * Formats a register value.
     1047 *
     1048 * This is used by both register getter methods.
     1049 *
     1050 * @returns
     1051 * @param   a_pbstr             The output Bstr variable.
     1052 * @param   a_pValue            The value to format.
     1053 * @param   a_enmType           The type of the value.
     1054 */
     1055static HRESULT formatRegisterValue(Bstr *a_pbstr, PCDBGFREGVAL a_pValue, DBGFREGVALTYPE a_enmType)
     1056{
     1057    char szHex[128]; /* Must be big because RTStrFormatNumber is unsafe. */
     1058
     1059    switch (a_enmType)
     1060    {
     1061        case DBGFREGVALTYPE_U8:
     1062            RTStrFormatNumber(szHex, a_pValue->u8,  16,  2+2, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_8BIT);
     1063            *a_pbstr = szHex;
     1064            return S_OK;
     1065
     1066        case DBGFREGVALTYPE_U16:
     1067            RTStrFormatNumber(szHex, a_pValue->u16, 16,  2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT);
     1068            *a_pbstr = szHex;
     1069            return S_OK;
     1070
     1071        case DBGFREGVALTYPE_U32:
     1072            RTStrFormatNumber(szHex, a_pValue->u32, 16,  2+8, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_32BIT);
     1073            *a_pbstr = szHex;
     1074            return S_OK;
     1075
     1076        case DBGFREGVALTYPE_U64:
     1077            RTStrFormatNumber(szHex, a_pValue->u64, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
     1078            *a_pbstr = szHex;
     1079            return S_OK;
     1080
     1081        case DBGFREGVALTYPE_U128:
     1082            RTStrFormatNumber(szHex, a_pValue->au64[1], 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
     1083            RTStrFormatNumber(&szHex[2+16], a_pValue->au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
     1084            *a_pbstr = szHex;
     1085            return S_OK;
     1086
     1087        case DBGFREGVALTYPE_LRD:
     1088            /** @todo long double -> string conversion. */
     1089            /** @todo long double == double on MSC. Stupid, stupid,
     1090             *        microsoft! */
     1091            RTStrFormatNumber(szHex, a_pValue->au16[5], 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT);
     1092            RTStrFormatNumber(&szHex[2+4], a_pValue->au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
     1093            *a_pbstr = szHex;
     1094            return S_OK;
     1095
     1096        case DBGFREGVALTYPE_DTR:
     1097            RTStrFormatNumber(szHex, a_pValue->dtr.u64Base, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
     1098            szHex[2+16] = ':';
     1099            RTStrFormatNumber(&szHex[2+16+1], a_pValue->dtr.u32Limit, 16, 4, 0, RTSTR_F_ZEROPAD | RTSTR_F_32BIT);
     1100            *a_pbstr = szHex;
     1101            return S_OK;
     1102
     1103        case DBGFREGVALTYPE_INVALID:
     1104        case DBGFREGVALTYPE_END:
     1105        case DBGFREGVALTYPE_32BIT_HACK:
     1106            break;
     1107        /* no default */
     1108    }
     1109
     1110    return E_UNEXPECTED;
     1111}
     1112
    10451113STDMETHODIMP MachineDebugger::GetRegister(ULONG a_idCpu, IN_BSTR a_bstrName, BSTR *a_pbstrValue)
    10461114{
    1047     ReturnComNotImplemented();
    1048 }
    1049 
    1050 STDMETHODIMP MachineDebugger::GetRegisters(ULONG a_idCpu, ComSafeArrayOut(BSTR, a_bstrNames), ComSafeArrayOut(BSTR, a_bstrValues))
    1051 {
     1115    /*
     1116     * Validate and convert input.
     1117     */
     1118    CheckComArgStrNotEmptyOrNull(a_bstrName);
     1119    CheckComArgNotNull(a_pbstrValue);
     1120    Utf8Str strName;
     1121    try
     1122    {
     1123        strName = a_bstrName;
     1124    }
     1125    catch (std::bad_alloc)
     1126    {
     1127        return E_OUTOFMEMORY;
     1128    }
     1129
    10521130    /*
    10531131     * The prologue.
     
    10661144             * Real work.
    10671145             */
     1146            DBGFREGVAL      Value;
     1147            DBGFREGVALTYPE  enmType;
     1148            int vrc = DBGFR3RegNmQuery(ptrVM.raw(), a_idCpu, strName.c_str(), &Value, &enmType);
     1149            if (RT_SUCCESS(vrc))
     1150            {
     1151                try
     1152                {
     1153                    Bstr bstrValue;
     1154                    hrc = formatRegisterValue(&bstrValue, &Value, enmType);
     1155                    if (SUCCEEDED(hrc))
     1156                        bstrValue.detachTo(a_pbstrValue);
     1157                }
     1158                catch (std::bad_alloc)
     1159                {
     1160                    hrc = E_OUTOFMEMORY;
     1161                }
     1162            }
     1163        }
     1164    }
     1165
     1166    return hrc;
     1167}
     1168
     1169STDMETHODIMP MachineDebugger::GetRegisters(ULONG a_idCpu, ComSafeArrayOut(BSTR, a_bstrNames), ComSafeArrayOut(BSTR, a_bstrValues))
     1170{
     1171    /*
     1172     * The prologue.
     1173     */
     1174    LogFlowThisFunc(("\n"));
     1175    AutoCaller autoCaller(this);
     1176    HRESULT hrc = autoCaller.rc();
     1177    if (SUCCEEDED(hrc))
     1178    {
     1179        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1180        Console::SafeVMPtr ptrVM(mParent);
     1181        hrc = ptrVM.rc();
     1182        if (SUCCEEDED(hrc))
     1183        {
     1184            /*
     1185             * Real work.
     1186             */
     1187            /** @todo query all registers. */
    10681188            DBGFREGENTRY aRegs[DBGFREG_ALL_COUNT];
    10691189            int vrc = DBGFR3RegCpuQueryAll(ptrVM.raw(), a_idCpu, aRegs, RT_ELEMENTS(aRegs));
     
    10781198                    {
    10791199                        char szHex[128];
    1080 
    1081                         szHex[0] = '\0';
    1082                         switch (aRegs[iReg].enmType)
    1083                         {
    1084                             case DBGFREGVALTYPE_U8:
    1085                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.u8,  16,  2+2, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_8BIT);
    1086                                 break;
    1087                             case DBGFREGVALTYPE_U16:
    1088                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.u16, 16,  2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT);
    1089                                 break;
    1090                             case DBGFREGVALTYPE_U32:
    1091                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.u32, 16,  2+8, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_32BIT);
    1092                                 break;
    1093                             case DBGFREGVALTYPE_U64:
    1094                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.u64, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
    1095                                 break;
    1096                             case DBGFREGVALTYPE_U128:
    1097                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.au64[1], 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
    1098                                 RTStrFormatNumber(&szHex[2+16], aRegs[iReg].Val.au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
    1099                                 break;
    1100                             case DBGFREGVALTYPE_LRD:
    1101                                 /** @todo long double -> string conversion. */
    1102                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.au16[5], 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT);
    1103                                 RTStrFormatNumber(&szHex[2+4], aRegs[iReg].Val.au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
    1104                                 break;
    1105                             case DBGFREGVALTYPE_DTR:
    1106                                 RTStrFormatNumber(szHex, aRegs[iReg].Val.dtr.u64Base, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT);
    1107                                 szHex[2+16] = ':';
    1108                                 RTStrFormatNumber(&szHex[2+16+1], aRegs[iReg].Val.dtr.u32Limit, 16, 4, 0, RTSTR_F_ZEROPAD | RTSTR_F_32BIT);
    1109                                 break;
    1110 
    1111                             case DBGFREGVALTYPE_END:
    1112                             case DBGFREGVALTYPE_INVALID:
    1113                             case DBGFREGVALTYPE_32BIT_HACK:
    1114                                 break;
    1115                         }
    1116                         Assert(szHex[0]);
    1117 
    1118                         Bstr bstrValue(szHex);
     1200                        Bstr bstrValue;
     1201
     1202                        hrc = formatRegisterValue(&bstrValue, &aRegs[iReg].Val, aRegs[iReg].enmType);
     1203                        AssertComRC(hrc);
    11191204                        bstrValue.detachTo(&abstrValues[iReg]);
    11201205
Note: See TracChangeset for help on using the changeset viewer.

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