VirtualBox

Changeset 86098 in vbox for trunk/src/VBox/Debugger


Ignore:
Timestamp:
Sep 13, 2020 7:17:19 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
140330
Message:

VMM/DBGF: Rework part 1 to make it work well with SMP VMs. bugref:9822

Location:
trunk/src/VBox/Debugger
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/DBGCCmdHlp.cpp

    r84653 r86098  
    13471347
    13481348/**
     1349 * @interface_method_impl{DBGCCMDHLP,pfnRegPrintf}
     1350 */
     1351static DECLCALLBACK(int) dbgcHlpRegPrintf(PDBGCCMDHLP pCmdHlp, VMCPUID idCpu, int f64BitMode, bool fTerse)
     1352{
     1353    PDBGC pDbgc   = DBGC_CMDHLP2DBGC(pCmdHlp);
     1354    char  szDisAndRegs[8192];
     1355    int   rc;
     1356
     1357    if (f64BitMode < 0)
     1358        f64BitMode = DBGFR3CpuIsIn64BitCode(pDbgc->pUVM, idCpu);
     1359
     1360    if (fTerse)
     1361    {
     1362        if (f64BitMode)
     1363            rc = DBGFR3RegPrintf(pDbgc->pUVM, idCpu, &szDisAndRegs[0], sizeof(szDisAndRegs),
     1364                                 "u %016VR{rip} L 0\n"
     1365                                 "rax=%016VR{rax} rbx=%016VR{rbx} rcx=%016VR{rcx} rdx=%016VR{rdx}\n"
     1366                                 "rsi=%016VR{rsi} rdi=%016VR{rdi} r8 =%016VR{r8} r9 =%016VR{r9}\n"
     1367                                 "r10=%016VR{r10} r11=%016VR{r11} r12=%016VR{r12} r13=%016VR{r13}\n"
     1368                                 "r14=%016VR{r14} r15=%016VR{r15} %VRF{rflags}\n"
     1369                                 "rip=%016VR{rip} rsp=%016VR{rsp} rbp=%016VR{rbp}\n"
     1370                                 "cs=%04VR{cs} ds=%04VR{ds} es=%04VR{es} fs=%04VR{fs} gs=%04VR{gs} ss=%04VR{ss}                     rflags=%08VR{rflags}\n");
     1371        else
     1372            rc = DBGFR3RegPrintf(pDbgc->pUVM, idCpu, szDisAndRegs, sizeof(szDisAndRegs),
     1373                                 "u %04VR{cs}:%08VR{eip} L 0\n"
     1374                                 "eax=%08VR{eax} ebx=%08VR{ebx} ecx=%08VR{ecx} edx=%08VR{edx} esi=%08VR{esi} edi=%08VR{edi}\n"
     1375                                 "eip=%08VR{eip} esp=%08VR{esp} ebp=%08VR{ebp} %VRF{eflags}\n"
     1376                                 "cs=%04VR{cs} ds=%04VR{ds} es=%04VR{es} fs=%04VR{fs} gs=%04VR{gs} ss=%04VR{ss}               eflags=%08VR{eflags}\n");
     1377    }
     1378    else
     1379    {
     1380        if (f64BitMode)
     1381            rc = DBGFR3RegPrintf(pDbgc->pUVM, idCpu, &szDisAndRegs[0], sizeof(szDisAndRegs),
     1382                                 "u %016VR{rip} L 0\n"
     1383                                 "rax=%016VR{rax} rbx=%016VR{rbx} rcx=%016VR{rcx} rdx=%016VR{rdx}\n"
     1384                                 "rsi=%016VR{rsi} rdi=%016VR{rdi} r8 =%016VR{r8} r9 =%016VR{r9}\n"
     1385                                 "r10=%016VR{r10} r11=%016VR{r11} r12=%016VR{r12} r13=%016VR{r13}\n"
     1386                                 "r14=%016VR{r14} r15=%016VR{r15} %VRF{rflags}\n"
     1387                                 "rip=%016VR{rip} rsp=%016VR{rsp} rbp=%016VR{rbp}\n"
     1388                                 "cs={%04VR{cs} base=%016VR{cs_base} limit=%08VR{cs_lim} flags=%04VR{cs_attr}} cr0=%016VR{cr0}\n"
     1389                                 "ds={%04VR{ds} base=%016VR{ds_base} limit=%08VR{ds_lim} flags=%04VR{ds_attr}} cr2=%016VR{cr2}\n"
     1390                                 "es={%04VR{es} base=%016VR{es_base} limit=%08VR{es_lim} flags=%04VR{es_attr}} cr3=%016VR{cr3}\n"
     1391                                 "fs={%04VR{fs} base=%016VR{fs_base} limit=%08VR{fs_lim} flags=%04VR{fs_attr}} cr4=%016VR{cr4}\n"
     1392                                 "gs={%04VR{gs} base=%016VR{gs_base} limit=%08VR{gs_lim} flags=%04VR{gs_attr}} cr8=%016VR{cr8}\n"
     1393                                 "ss={%04VR{ss} base=%016VR{ss_base} limit=%08VR{ss_lim} flags=%04VR{ss_attr}}\n"
     1394                                 "dr0=%016VR{dr0} dr1=%016VR{dr1} dr2=%016VR{dr2} dr3=%016VR{dr3}\n"
     1395                                 "dr6=%016VR{dr6} dr7=%016VR{dr7}\n"
     1396                                 "gdtr=%016VR{gdtr_base}:%04VR{gdtr_lim}  idtr=%016VR{idtr_base}:%04VR{idtr_lim}  rflags=%08VR{rflags}\n"
     1397                                 "ldtr={%04VR{ldtr} base=%016VR{ldtr_base} limit=%08VR{ldtr_lim} flags=%08VR{ldtr_attr}}\n"
     1398                                 "tr  ={%04VR{tr} base=%016VR{tr_base} limit=%08VR{tr_lim} flags=%08VR{tr_attr}}\n"
     1399                                 "    sysenter={cs=%04VR{sysenter_cs} eip=%08VR{sysenter_eip} esp=%08VR{sysenter_esp}}\n"
     1400                                 "        efer=%016VR{efer}\n"
     1401                                 "         pat=%016VR{pat}\n"
     1402                                 "     sf_mask=%016VR{sf_mask}\n"
     1403                                 "krnl_gs_base=%016VR{krnl_gs_base}\n"
     1404                                 "       lstar=%016VR{lstar}\n"
     1405                                 "        star=%016VR{star} cstar=%016VR{cstar}\n"
     1406                                 "fcw=%04VR{fcw} fsw=%04VR{fsw} ftw=%04VR{ftw} mxcsr=%04VR{mxcsr} mxcsr_mask=%04VR{mxcsr_mask}\n"
     1407                                 );
     1408        else
     1409            rc = DBGFR3RegPrintf(pDbgc->pUVM, idCpu, szDisAndRegs, sizeof(szDisAndRegs),
     1410                                 "u %04VR{cs}:%08VR{eip} L 0\n"
     1411                                 "eax=%08VR{eax} ebx=%08VR{ebx} ecx=%08VR{ecx} edx=%08VR{edx} esi=%08VR{esi} edi=%08VR{edi}\n"
     1412                                 "eip=%08VR{eip} esp=%08VR{esp} ebp=%08VR{ebp} %VRF{eflags}\n"
     1413                                 "cs={%04VR{cs} base=%08VR{cs_base} limit=%08VR{cs_lim} flags=%04VR{cs_attr}} dr0=%08VR{dr0} dr1=%08VR{dr1}\n"
     1414                                 "ds={%04VR{ds} base=%08VR{ds_base} limit=%08VR{ds_lim} flags=%04VR{ds_attr}} dr2=%08VR{dr2} dr3=%08VR{dr3}\n"
     1415                                 "es={%04VR{es} base=%08VR{es_base} limit=%08VR{es_lim} flags=%04VR{es_attr}} dr6=%08VR{dr6} dr7=%08VR{dr7}\n"
     1416                                 "fs={%04VR{fs} base=%08VR{fs_base} limit=%08VR{fs_lim} flags=%04VR{fs_attr}} cr0=%08VR{cr0} cr2=%08VR{cr2}\n"
     1417                                 "gs={%04VR{gs} base=%08VR{gs_base} limit=%08VR{gs_lim} flags=%04VR{gs_attr}} cr3=%08VR{cr3} cr4=%08VR{cr4}\n"
     1418                                 "ss={%04VR{ss} base=%08VR{ss_base} limit=%08VR{ss_lim} flags=%04VR{ss_attr}} cr8=%08VR{cr8}\n"
     1419                                 "gdtr=%08VR{gdtr_base}:%04VR{gdtr_lim}  idtr=%08VR{idtr_base}:%04VR{idtr_lim}  eflags=%08VR{eflags}\n"
     1420                                 "ldtr={%04VR{ldtr} base=%08VR{ldtr_base} limit=%08VR{ldtr_lim} flags=%04VR{ldtr_attr}}\n"
     1421                                 "tr  ={%04VR{tr} base=%08VR{tr_base} limit=%08VR{tr_lim} flags=%04VR{tr_attr}}\n"
     1422                                 "sysenter={cs=%04VR{sysenter_cs} eip=%08VR{sysenter_eip} esp=%08VR{sysenter_esp}}\n"
     1423                                 "fcw=%04VR{fcw} fsw=%04VR{fsw} ftw=%04VR{ftw} mxcsr=%04VR{mxcsr} mxcsr_mask=%04VR{mxcsr_mask}\n"
     1424                                 );
     1425    }
     1426    if (RT_FAILURE(rc))
     1427        return DBGCCmdHlpVBoxError(pCmdHlp, rc, "DBGFR3RegPrintf failed");
     1428    char *pszRegs = strchr(szDisAndRegs, '\n');
     1429    *pszRegs++ = '\0';
     1430    rc = DBGCCmdHlpPrintf(pCmdHlp, "%s", pszRegs);
     1431
     1432    /*
     1433     * Disassemble one instruction at cs:[r|e]ip.
     1434     */
     1435    if (!f64BitMode && strstr(pszRegs, " vm ")) /* a bit ugly... */
     1436        return pCmdHlp->pfnExec(pCmdHlp, "uv86 %s", szDisAndRegs + 2);
     1437    return pCmdHlp->pfnExec(pCmdHlp, "%s", szDisAndRegs);
     1438}
     1439
     1440
     1441/**
    13491442 * Initializes the Command Helpers for a DBGC instance.
    13501443 *
     
    13761469    pDbgc->CmdHlp.pfnGetCurrentCpu      = dbgcHlpGetCurrentCpu;
    13771470    pDbgc->CmdHlp.pfnGetCpuMode         = dbgcHlpGetCpuMode;
     1471    pDbgc->CmdHlp.pfnRegPrintf          = dbgcHlpRegPrintf;
    13781472    pDbgc->CmdHlp.u32EndMarker          = DBGCCMDHLP_MAGIC;
    13791473}
  • trunk/src/VBox/Debugger/DBGCCommands.cpp

    r83088 r86098  
    233233    {  1,           1,          DBGCVAR_CAT_SYMBOL,     0,                              "var",          "Variable name." },
    234234    {  1,           1,          DBGCVAR_CAT_ANY,        0,                              "value",        "Value to assign to the variable." },
     235};
     236
     237/** 'stop' arguments */
     238static const DBGCVARDESC    g_aArgStop[] =
     239{
     240    /* cTimesMin,   cTimesMax,  enmCategory,            fFlags,                         pszName,        pszDescription */
     241    {  0,           1,          DBGCVAR_CAT_NUMBER,     0,                              "idCpu",        "CPU ID." },
    235242};
    236243
     
    298305    { "set",        2,        2,        &g_aArgSet[0],       RT_ELEMENTS(g_aArgSet),       0, dbgcCmdSet,       "<var> <value>",        "Sets a global variable." },
    299306    { "showvars",   0,        0,        NULL,                0,                            0, dbgcCmdShowVars,  "",                     "List all the defined variables." },
    300     { "stop",       0,        0,        NULL,                0,                            0, dbgcCmdStop,      "",                     "Stop execution." },
     307    { "stop",       0,        1,        &g_aArgStop[0],      RT_ELEMENTS(g_aArgStop),      0, dbgcCmdStop,      "[idCpu]",              "Stop execution either of all or the specified CPU. (The latter is not recommended unless you know exactly what you're doing.)" },
    301308    { "unload",     1,       ~0U,       &g_aArgUnload[0],    RT_ELEMENTS(g_aArgUnload),    0, dbgcCmdUnload,    "<modname1> [modname2..N]", "Unloads one or more modules in the current address space." },
    302309    { "unloadplugin", 1,     ~0U,       &g_aArgPlugIn[0],    RT_ELEMENTS(g_aArgPlugIn),    0, dbgcCmdUnloadPlugIn, "<plugin1> [plugin2..N]", "Unloads one or more plugins." },
     
    938945static DECLCALLBACK(int) dbgcCmdStop(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PUVM pUVM, PCDBGCVAR paArgs, unsigned cArgs)
    939946{
    940     /*
    941      * Check if the VM is halted or not before trying to halt it.
    942      */
    943     int rc;
    944     if (DBGFR3IsHalted(pUVM))
    945         rc = DBGCCmdHlpPrintf(pCmdHlp, "warning: The VM is already halted...\n");
     947    DBGC_CMDHLP_REQ_UVM_RET(pCmdHlp, pCmd, pUVM);
     948
     949    /*
     950     * Parse arguments.
     951     */
     952    VMCPUID idCpu = VMCPUID_ALL;
     953    if (cArgs == 1)
     954    {
     955        VMCPUID cCpus = DBGFR3CpuGetCount(pUVM);
     956        if (paArgs[0].u.u64Number >= cCpus)
     957            return DBGCCmdHlpFail(pCmdHlp, pCmd, "idCpu %RU64 is out of range! Highest valid ID is %u.\n",
     958                                  paArgs[0].u.u64Number, cCpus - 1);
     959        idCpu = (VMCPUID)paArgs[0].u.u64Number;
     960    }
    946961    else
    947     {
    948         rc = DBGFR3Halt(pUVM);
    949         if (RT_SUCCESS(rc))
     962        Assert(cArgs == 0);
     963
     964    /*
     965     * Try halt the VM or VCpu.
     966     */
     967    int rc = DBGFR3Halt(pUVM, idCpu);
     968    if (RT_SUCCESS(rc))
     969    {
     970        Assert(rc == VINF_SUCCESS || rc == VWRN_DBGF_ALREADY_HALTED);
     971        if (rc != VWRN_DBGF_ALREADY_HALTED)
    950972            rc = VWRN_DBGC_CMD_PENDING;
     973        else if (idCpu == VMCPUID_ALL)
     974            rc = DBGCCmdHlpPrintf(pCmdHlp, "warning: The VM is already halted...\n");
    951975        else
    952             rc = DBGCCmdHlpVBoxError(pCmdHlp, rc, "Executing DBGFR3Halt().");
    953     }
    954 
    955     NOREF(pCmd); NOREF(paArgs); NOREF(cArgs);
     976            rc = DBGCCmdHlpPrintf(pCmdHlp, "warning: CPU %u is already halted...\n", idCpu);
     977    }
     978    else
     979        rc = DBGCCmdHlpVBoxError(pCmdHlp, rc, "Executing DBGFR3Halt().");
     980
    956981    return rc;
    957982}
  • trunk/src/VBox/Debugger/DBGCEmulateCodeView.cpp

    r83082 r86098  
    237237    {  1,           1,          DBGCVAR_CAT_POINTER,    0,                              "address",      "Address where to write." },
    238238    {  1,           ~0U,        DBGCVAR_CAT_NUMBER,     0,                              "value",        "Value to write." },
     239};
     240
     241
     242/** 'g' arguments. */
     243static const DBGCVARDESC    g_aArgGo[] =
     244{
     245    /* cTimesMin,   cTimesMax,  enmCategory,            fFlags,                         pszName,        pszDescription */
     246    {  0,           1,          DBGCVAR_CAT_NUMBER,     0,                              "idCpu",        "CPU ID." },
    239247};
    240248
     
    425433    { "ed",         2,        2,        &g_aArgEditMem[0],  RT_ELEMENTS(g_aArgEditMem),     0,       dbgcCmdEditMem,     "<addr> <value>",       "Write a 4-byte value to memory." },
    426434    { "eq",         2,        2,        &g_aArgEditMem[0],  RT_ELEMENTS(g_aArgEditMem),     0,       dbgcCmdEditMem,     "<addr> <value>",       "Write a 8-byte value to memory." },
    427     { "g",          0,        0,        NULL,               0,                              0,       dbgcCmdGo,          "",                     "Continue execution." },
     435    { "g",          0,        1,        &g_aArgGo[0],       RT_ELEMENTS(g_aArgGo),          0,       dbgcCmdGo,          "[idCpu]",              "Continue execution of all or the specified CPU. (The latter is not recommended unless you know exactly what you're doing.)" },
    428436    { "gu",         0,        0,        NULL,               0,                              0,       dbgcCmdGoUp,        "",                     "Go up - continue execution till after return." },
    429437    { "k",          0,        0,        NULL,               0,                              0,       dbgcCmdStack,       "",                     "Callstack." },
     
    651659
    652660    /*
    653      * Check if the VM is halted or not before trying to resume it.
    654      */
    655     if (!DBGFR3IsHalted(pUVM))
    656         return DBGCCmdHlpFail(pCmdHlp, pCmd, "The VM is already running");
    657 
    658     int rc = DBGFR3Resume(pUVM);
    659     if (RT_FAILURE(rc))
    660         return DBGCCmdHlpFailRc(pCmdHlp, pCmd, rc, "DBGFR3Resume");
    661 
    662     NOREF(paArgs); NOREF(cArgs);
    663     return VINF_SUCCESS;
     661     * Parse arguments.
     662     */
     663    VMCPUID idCpu = VMCPUID_ALL;
     664    if (cArgs == 1)
     665    {
     666        VMCPUID cCpus = DBGFR3CpuGetCount(pUVM);
     667        if (paArgs[0].u.u64Number >= cCpus)
     668            return DBGCCmdHlpFail(pCmdHlp, pCmd, "idCpu %RU64 is out of range! Highest valid ID is %u.\n",
     669                                  paArgs[0].u.u64Number, cCpus - 1);
     670        idCpu = (VMCPUID)paArgs[0].u.u64Number;
     671    }
     672    else
     673        Assert(cArgs == 0);
     674
     675    /*
     676     * Try resume the VM or CPU.
     677     */
     678    int rc = DBGFR3Resume(pUVM, idCpu);
     679    if (RT_SUCCESS(rc))
     680    {
     681        Assert(rc == VINF_SUCCESS || rc == VWRN_DBGF_ALREADY_RUNNING);
     682        if (rc != VWRN_DBGF_ALREADY_RUNNING)
     683            return VINF_SUCCESS;
     684        if (idCpu == VMCPUID_ALL)
     685            return DBGCCmdHlpFail(pCmdHlp, pCmd, "The VM is already running");
     686        return DBGCCmdHlpFail(pCmdHlp, pCmd, "CPU %u is already running", idCpu);
     687    }
     688    return DBGCCmdHlpFailRc(pCmdHlp, pCmd, rc, "DBGFR3Resume");
    664689}
    665690
     
    24662491                              || (   strcmp(pCmd->pszCmd, "rg32") != 0
    24672492                                  && DBGFR3CpuIsIn64BitCode(pUVM, pDbgc->idCpu));
    2468         char        szDisAndRegs[8192];
    2469         int         rc;
    2470 
    2471         if (pDbgc->fRegTerse)
    2472         {
    2473             if (f64BitMode)
    2474                 rc = DBGFR3RegPrintf(pUVM, pDbgc->idCpu, &szDisAndRegs[0], sizeof(szDisAndRegs),
    2475                                      "u %016VR{rip} L 0\n"
    2476                                      "rax=%016VR{rax} rbx=%016VR{rbx} rcx=%016VR{rcx} rdx=%016VR{rdx}\n"
    2477                                      "rsi=%016VR{rsi} rdi=%016VR{rdi} r8 =%016VR{r8} r9 =%016VR{r9}\n"
    2478                                      "r10=%016VR{r10} r11=%016VR{r11} r12=%016VR{r12} r13=%016VR{r13}\n"
    2479                                      "r14=%016VR{r14} r15=%016VR{r15} %VRF{rflags}\n"
    2480                                      "rip=%016VR{rip} rsp=%016VR{rsp} rbp=%016VR{rbp}\n"
    2481                                      "cs=%04VR{cs} ds=%04VR{ds} es=%04VR{es} fs=%04VR{fs} gs=%04VR{gs} ss=%04VR{ss}                     rflags=%08VR{rflags}\n");
    2482             else
    2483                 rc = DBGFR3RegPrintf(pUVM, pDbgc->idCpu, szDisAndRegs, sizeof(szDisAndRegs),
    2484                                      "u %04VR{cs}:%08VR{eip} L 0\n"
    2485                                      "eax=%08VR{eax} ebx=%08VR{ebx} ecx=%08VR{ecx} edx=%08VR{edx} esi=%08VR{esi} edi=%08VR{edi}\n"
    2486                                      "eip=%08VR{eip} esp=%08VR{esp} ebp=%08VR{ebp} %VRF{eflags}\n"
    2487                                      "cs=%04VR{cs} ds=%04VR{ds} es=%04VR{es} fs=%04VR{fs} gs=%04VR{gs} ss=%04VR{ss}               eflags=%08VR{eflags}\n");
    2488         }
    2489         else
    2490         {
    2491             if (f64BitMode)
    2492                 rc = DBGFR3RegPrintf(pUVM, pDbgc->idCpu, &szDisAndRegs[0], sizeof(szDisAndRegs),
    2493                                      "u %016VR{rip} L 0\n"
    2494                                      "rax=%016VR{rax} rbx=%016VR{rbx} rcx=%016VR{rcx} rdx=%016VR{rdx}\n"
    2495                                      "rsi=%016VR{rsi} rdi=%016VR{rdi} r8 =%016VR{r8} r9 =%016VR{r9}\n"
    2496                                      "r10=%016VR{r10} r11=%016VR{r11} r12=%016VR{r12} r13=%016VR{r13}\n"
    2497                                      "r14=%016VR{r14} r15=%016VR{r15} %VRF{rflags}\n"
    2498                                      "rip=%016VR{rip} rsp=%016VR{rsp} rbp=%016VR{rbp}\n"
    2499                                      "cs={%04VR{cs} base=%016VR{cs_base} limit=%08VR{cs_lim} flags=%04VR{cs_attr}} cr0=%016VR{cr0}\n"
    2500                                      "ds={%04VR{ds} base=%016VR{ds_base} limit=%08VR{ds_lim} flags=%04VR{ds_attr}} cr2=%016VR{cr2}\n"
    2501                                      "es={%04VR{es} base=%016VR{es_base} limit=%08VR{es_lim} flags=%04VR{es_attr}} cr3=%016VR{cr3}\n"
    2502                                      "fs={%04VR{fs} base=%016VR{fs_base} limit=%08VR{fs_lim} flags=%04VR{fs_attr}} cr4=%016VR{cr4}\n"
    2503                                      "gs={%04VR{gs} base=%016VR{gs_base} limit=%08VR{gs_lim} flags=%04VR{gs_attr}} cr8=%016VR{cr8}\n"
    2504                                      "ss={%04VR{ss} base=%016VR{ss_base} limit=%08VR{ss_lim} flags=%04VR{ss_attr}}\n"
    2505                                      "dr0=%016VR{dr0} dr1=%016VR{dr1} dr2=%016VR{dr2} dr3=%016VR{dr3}\n"
    2506                                      "dr6=%016VR{dr6} dr7=%016VR{dr7}\n"
    2507                                      "gdtr=%016VR{gdtr_base}:%04VR{gdtr_lim}  idtr=%016VR{idtr_base}:%04VR{idtr_lim}  rflags=%08VR{rflags}\n"
    2508                                      "ldtr={%04VR{ldtr} base=%016VR{ldtr_base} limit=%08VR{ldtr_lim} flags=%08VR{ldtr_attr}}\n"
    2509                                      "tr  ={%04VR{tr} base=%016VR{tr_base} limit=%08VR{tr_lim} flags=%08VR{tr_attr}}\n"
    2510                                      "    sysenter={cs=%04VR{sysenter_cs} eip=%08VR{sysenter_eip} esp=%08VR{sysenter_esp}}\n"
    2511                                      "        efer=%016VR{efer}\n"
    2512                                      "         pat=%016VR{pat}\n"
    2513                                      "     sf_mask=%016VR{sf_mask}\n"
    2514                                      "krnl_gs_base=%016VR{krnl_gs_base}\n"
    2515                                      "       lstar=%016VR{lstar}\n"
    2516                                      "        star=%016VR{star} cstar=%016VR{cstar}\n"
    2517                                      "fcw=%04VR{fcw} fsw=%04VR{fsw} ftw=%04VR{ftw} mxcsr=%04VR{mxcsr} mxcsr_mask=%04VR{mxcsr_mask}\n"
    2518                                      );
    2519             else
    2520                 rc = DBGFR3RegPrintf(pUVM, pDbgc->idCpu, szDisAndRegs, sizeof(szDisAndRegs),
    2521                                      "u %04VR{cs}:%08VR{eip} L 0\n"
    2522                                      "eax=%08VR{eax} ebx=%08VR{ebx} ecx=%08VR{ecx} edx=%08VR{edx} esi=%08VR{esi} edi=%08VR{edi}\n"
    2523                                      "eip=%08VR{eip} esp=%08VR{esp} ebp=%08VR{ebp} %VRF{eflags}\n"
    2524                                      "cs={%04VR{cs} base=%08VR{cs_base} limit=%08VR{cs_lim} flags=%04VR{cs_attr}} dr0=%08VR{dr0} dr1=%08VR{dr1}\n"
    2525                                      "ds={%04VR{ds} base=%08VR{ds_base} limit=%08VR{ds_lim} flags=%04VR{ds_attr}} dr2=%08VR{dr2} dr3=%08VR{dr3}\n"
    2526                                      "es={%04VR{es} base=%08VR{es_base} limit=%08VR{es_lim} flags=%04VR{es_attr}} dr6=%08VR{dr6} dr7=%08VR{dr7}\n"
    2527                                      "fs={%04VR{fs} base=%08VR{fs_base} limit=%08VR{fs_lim} flags=%04VR{fs_attr}} cr0=%08VR{cr0} cr2=%08VR{cr2}\n"
    2528                                      "gs={%04VR{gs} base=%08VR{gs_base} limit=%08VR{gs_lim} flags=%04VR{gs_attr}} cr3=%08VR{cr3} cr4=%08VR{cr4}\n"
    2529                                      "ss={%04VR{ss} base=%08VR{ss_base} limit=%08VR{ss_lim} flags=%04VR{ss_attr}} cr8=%08VR{cr8}\n"
    2530                                      "gdtr=%08VR{gdtr_base}:%04VR{gdtr_lim}  idtr=%08VR{idtr_base}:%04VR{idtr_lim}  eflags=%08VR{eflags}\n"
    2531                                      "ldtr={%04VR{ldtr} base=%08VR{ldtr_base} limit=%08VR{ldtr_lim} flags=%04VR{ldtr_attr}}\n"
    2532                                      "tr  ={%04VR{tr} base=%08VR{tr_base} limit=%08VR{tr_lim} flags=%04VR{tr_attr}}\n"
    2533                                      "sysenter={cs=%04VR{sysenter_cs} eip=%08VR{sysenter_eip} esp=%08VR{sysenter_esp}}\n"
    2534                                      "fcw=%04VR{fcw} fsw=%04VR{fsw} ftw=%04VR{ftw} mxcsr=%04VR{mxcsr} mxcsr_mask=%04VR{mxcsr_mask}\n"
    2535                                      );
    2536         }
    2537         if (RT_FAILURE(rc))
    2538             return DBGCCmdHlpVBoxError(pCmdHlp, rc, "DBGFR3RegPrintf failed");
    2539         char *pszRegs = strchr(szDisAndRegs, '\n');
    2540         *pszRegs++ = '\0';
    2541         rc = DBGCCmdHlpPrintf(pCmdHlp, "%s", pszRegs);
    2542 
    2543         /*
    2544          * Disassemble one instruction at cs:[r|e]ip.
    2545          */
    2546         if (!f64BitMode && strstr(pszRegs, " vm ")) /* a bit ugly... */
    2547             return pCmdHlp->pfnExec(pCmdHlp, "uv86 %s", szDisAndRegs + 2);
    2548         return pCmdHlp->pfnExec(pCmdHlp, "%s", szDisAndRegs);
     2493        return DBGCCmdHlpRegPrintf(pCmdHlp, pDbgc->idCpu, f64BitMode, pDbgc->fRegTerse);
    25492494    }
    25502495    return dbgcCmdRegCommon(pCmd, pCmdHlp, pUVM, paArgs, cArgs, "");
  • trunk/src/VBox/Debugger/DBGCGdbRemoteStub.cpp

    r85367 r86098  
    15651565        case 'c':
    15661566        {
    1567             if (DBGFR3IsHalted(pThis->Dbgc.pUVM))
    1568                 DBGFR3Resume(pThis->Dbgc.pUVM);
     1567            if (DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
     1568                DBGFR3Resume(pThis->Dbgc.pUVM, VMCPUID_ALL);
    15691569            break;
    15701570        }
     
    15811581        case 't':
    15821582        {
    1583             if (!DBGFR3IsHalted(pThis->Dbgc.pUVM))
    1584                 rc = DBGFR3Halt(pThis->Dbgc.pUVM);
     1583            if (!DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
     1584                rc = DBGFR3Halt(pThis->Dbgc.pUVM, VMCPUID_ALL);
    15851585            /* The reply will be send in the event loop. */
    15861586            break;
     
    17321732            case 'c': /* Continue, no response */
    17331733            {
    1734                 if (DBGFR3IsHalted(pThis->Dbgc.pUVM))
    1735                     DBGFR3Resume(pThis->Dbgc.pUVM);
     1734                if (DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
     1735                    DBGFR3Resume(pThis->Dbgc.pUVM, VMCPUID_ALL);
    17361736                break;
    17371737            }
     
    21742174        {
    21752175            /* Stop target and send packet to indicate the target has stopped. */
    2176             if (!DBGFR3IsHalted(pThis->Dbgc.pUVM))
    2177                 rc = DBGFR3Halt(pThis->Dbgc.pUVM);
     2176            if (!DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
     2177                rc = DBGFR3Halt(pThis->Dbgc.pUVM, VMCPUID_ALL);
    21782178            /* The reply will be send in the event loop. */
    21792179        }
     
    24032403                    break;
    24042404            }
    2405             if (RT_SUCCESS(rc) && DBGFR3IsHalted(pDbgc->pUVM))
     2405            if (RT_SUCCESS(rc) && DBGFR3IsHalted(pDbgc->pUVM, VMCPUID_ALL))
    24062406            {
    24072407                rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     
    25892589             * Wait for a debug event.
    25902590             */
    2591             PCDBGFEVENT pEvent;
    2592             rc = DBGFR3EventWait(pThis->Dbgc.pUVM, 32, &pEvent);
     2591            DBGFEVENT Event;
     2592            rc = DBGFR3EventWait(pThis->Dbgc.pUVM, 32, &Event);
    25932593            if (RT_SUCCESS(rc))
    25942594            {
    2595                 rc = dbgcGdbStubCtxProcessEvent(pThis, pEvent);
     2595                rc = dbgcGdbStubCtxProcessEvent(pThis, &Event);
    25962596                if (RT_FAILURE(rc))
    25972597                    break;
     
    28402840        //dbgcRunInitScripts(pDbgc); Not yet
    28412841
    2842         if (!DBGFR3IsHalted(pThis->Dbgc.pUVM))
    2843             rc = DBGFR3Halt(pThis->Dbgc.pUVM);
     2842        if (!DBGFR3IsHalted(pThis->Dbgc.pUVM, VMCPUID_ALL))
     2843            rc = DBGFR3Halt(pThis->Dbgc.pUVM, VMCPUID_ALL);
    28442844
    28452845        /*
  • trunk/src/VBox/Debugger/DBGConsole.cpp

    r84708 r86098  
    648648    bool fPrintPrompt = true;
    649649    int rc = VINF_SUCCESS;
     650    VMCPUID const idCpuSaved = pDbgc->idCpu;
    650651    switch (pEvent->enmType)
    651652    {
     
    655656        case DBGFEVENT_HALT_DONE:
    656657        {
    657             rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: VM %p is halted! (%s)\n",
    658                                          pDbgc->pVM, dbgcGetEventCtx(pEvent->enmCtx));
     658            /** @todo add option to suppress this on CPUs that aren't selected (like
     659             *        fRegTerse). */
     660            rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: CPU %u has halted! (%s)\n",
     661                                         pEvent->idCpu, pEvent->idCpu, dbgcGetEventCtx(pEvent->enmCtx));
    659662            if (RT_SUCCESS(rc))
    660                 rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     663                rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    661664            break;
    662665        }
     
    668671        case DBGFEVENT_FATAL_ERROR:
    669672        {
    670             rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbf event: Fatal error! (%s)\n",
    671                                          dbgcGetEventCtx(pEvent->enmCtx));
     673            pDbgc->idCpu = pEvent->idCpu;
     674            rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbf event/%u: Fatal error! (%s)\n",
     675                                         pEvent->idCpu, dbgcGetEventCtx(pEvent->enmCtx));
    672676            if (RT_SUCCESS(rc))
    673                 rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     677                rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    674678            break;
    675679        }
     
    680684        case DBGFEVENT_BREAKPOINT_HYPER:
    681685        {
     686            pDbgc->idCpu = pEvent->idCpu;
    682687            rc = dbgcBpExec(pDbgc, pEvent->u.Bp.iBp);
    683688            switch (rc)
    684689            {
    685690                case VERR_DBGC_BP_NOT_FOUND:
    686                     rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Unknown breakpoint %u! (%s)\n",
    687                                                  pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     691                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: Unknown breakpoint %u! (%s)\n",
     692                                                 pEvent->idCpu, pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
    688693                    break;
    689694
    690695                case VINF_DBGC_BP_NO_COMMAND:
    691                     rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Breakpoint %u! (%s)\n",
    692                                                  pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     696                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: Breakpoint %u! (%s)\n",
     697                                                 pEvent->idCpu, pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
    693698                    break;
    694699
    695700                case VINF_BUFFER_OVERFLOW:
    696                     rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Breakpoint %u! Command too long to execute! (%s)\n",
    697                                                  pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
     701                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: Breakpoint %u! Command too long to execute! (%s)\n",
     702                                                 pEvent->idCpu, pEvent->u.Bp.iBp, dbgcGetEventCtx(pEvent->enmCtx));
    698703                    break;
    699704
     
    701706                    break;
    702707            }
    703             if (RT_SUCCESS(rc) && DBGFR3IsHalted(pDbgc->pUVM))
     708            if (RT_SUCCESS(rc) && DBGFR3IsHalted(pDbgc->pUVM, pEvent->idCpu))
    704709            {
    705                 rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     710                rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    706711
    707712                /* Set the resume flag to ignore the breakpoint when resuming execution. */
     
    710715                    rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r eflags.rf = 1");
    711716            }
     717            else
     718                pDbgc->idCpu = idCpuSaved;
    712719            break;
    713720        }
     
    716723        case DBGFEVENT_STEPPED_HYPER:
    717724        {
    718             if (!pDbgc->cMultiStepsLeft)
    719                 rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: Single step! (%s)\n", dbgcGetEventCtx(pEvent->enmCtx));
     725            if (!pDbgc->cMultiStepsLeft || pEvent->idCpu != idCpuSaved)
     726                rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: Single step! (%s)\n",
     727                                             pEvent->idCpu, dbgcGetEventCtx(pEvent->enmCtx));
    720728            else
    721729                pDbgc->cMultiStepsLeft -= 1;
     
    723731            {
    724732                if (pDbgc->fStepTraceRegs)
    725                     rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     733                    rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    726734                else
    727735                {
     
    739747
    740748            /* If multi-stepping, take the next step: */
    741             if (pDbgc->cMultiStepsLeft > 0)
     749            if (pDbgc->cMultiStepsLeft > 0 && pEvent->idCpu != idCpuSaved)
    742750            {
    743751                int rc2 = DBGFR3StepEx(pDbgc->pUVM, pDbgc->idCpu, DBGF_STEP_F_INTO, NULL, NULL, 0, pDbgc->uMultiStepStrideLength);
     
    747755                    DBGCCmdHlpFailRc(&pDbgc->CmdHlp, pDbgc->pMultiStepCmd, rc2, "DBGFR3StepEx(,,DBGF_STEP_F_INTO,) failed");
    748756            }
     757            else
     758                pDbgc->idCpu = pEvent->idCpu;
    749759            break;
    750760        }
     
    752762        case DBGFEVENT_ASSERTION_HYPER:
    753763        {
     764            pDbgc->idCpu = pEvent->idCpu;
    754765            rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL,
    755                                          "\ndbgf event: Hypervisor Assertion! (%s)\n"
     766                                         "\ndbgf event/%u: Hypervisor Assertion! (%s)\n"
    756767                                         "%s"
    757768                                         "%s"
    758769                                         "\n",
     770                                         pEvent->idCpu,
    759771                                         dbgcGetEventCtx(pEvent->enmCtx),
    760772                                         pEvent->u.Assert.pszMsg1,
    761773                                         pEvent->u.Assert.pszMsg2);
    762774            if (RT_SUCCESS(rc))
    763                 rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     775                rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    764776            break;
    765777        }
     
    767779        case DBGFEVENT_DEV_STOP:
    768780        {
     781            pDbgc->idCpu = pEvent->idCpu;
    769782            rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL,
    770783                                         "\n"
    771                                          "dbgf event: DBGFSTOP (%s)\n"
     784                                         "dbgf event/%u: DBGFSTOP (%s)\n"
    772785                                         "File:     %s\n"
    773786                                         "Line:     %d\n"
    774787                                         "Function: %s\n",
     788                                         pEvent->idCpu,
    775789                                         dbgcGetEventCtx(pEvent->enmCtx),
    776790                                         pEvent->u.Src.pszFile,
     
    782796                                             pEvent->u.Src.pszMessage);
    783797            if (RT_SUCCESS(rc))
    784                 rc = pDbgc->CmdHlp.pfnExec(&pDbgc->CmdHlp, "r");
     798                rc = DBGCCmdHlpRegPrintf(&pDbgc->CmdHlp, pEvent->idCpu, -1, pDbgc->fRegTerse);
    785799            break;
    786800        }
     
    816830                    Assert(pEvtDesc->pszDesc);
    817831                    Assert(pEvent->u.Generic.cArgs == 1);
    818                     rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s no %#llx! (%s)\n",
    819                                                  pEvtDesc->pszDesc, pEvent->u.Generic.auArgs[0], pEvtDesc->pszName);
     832                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s no %#llx! (%s)\n",
     833                                                 pEvent->idCpu, pEvtDesc->pszDesc, pEvent->u.Generic.auArgs[0], pEvtDesc->pszName);
    820834                }
    821835                else if (pEvtDesc->fFlags & DBGCSXEVT_F_BUGCHECK)
     
    826840                                         pEvent->u.Generic.auArgs[1], pEvent->u.Generic.auArgs[2],
    827841                                         pEvent->u.Generic.auArgs[3], pEvent->u.Generic.auArgs[4]);
    828                     rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s %s%s!\n%s", pEvtDesc->pszName,
    829                                                  pEvtDesc->pszDesc ? "- " : "", pEvtDesc->pszDesc ? pEvtDesc->pszDesc : "",
    830                                                  szDetails);
     842                    rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s %s%s!\n%s", pEvent->idCpu,
     843                                                 pEvtDesc->pszName, pEvtDesc->pszDesc ? "- " : "",
     844                                                 pEvtDesc->pszDesc ? pEvtDesc->pszDesc : "", szDetails);
    831845                }
    832846                else if (   (pEvtDesc->fFlags & DBGCSXEVT_F_TAKE_ARG)
     
    836850                {
    837851                    if (pEvtDesc->pszDesc)
    838                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s - %s!",
    839                                                      pEvtDesc->pszName, pEvtDesc->pszDesc);
     852                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s - %s!",
     853                                                     pEvent->idCpu, pEvtDesc->pszName, pEvtDesc->pszDesc);
    840854                    else
    841                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s!", pEvtDesc->pszName);
     855                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s!",
     856                                                     pEvent->idCpu, pEvtDesc->pszName);
    842857                    if (pEvent->u.Generic.cArgs <= 1)
    843858                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, " arg=%#llx\n", pEvent->u.Generic.auArgs[0]);
     
    852867                {
    853868                    if (pEvtDesc->pszDesc)
    854                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s - %s!\n",
    855                                                      pEvtDesc->pszName, pEvtDesc->pszDesc);
     869                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s - %s!\n",
     870                                                     pEvent->idCpu, pEvtDesc->pszName, pEvtDesc->pszDesc);
    856871                    else
    857                         rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event: %s!\n", pEvtDesc->pszName);
     872                        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf event/%u: %s!\n",
     873                                                     pEvent->idCpu, pEvtDesc->pszName);
    858874                }
    859875            }
    860876            else
    861                 rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf/dbgc error: Unknown event %d!\n", pEvent->enmType);
     877                rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "\ndbgf/dbgc error: Unknown event %d on CPU %u!\n",
     878                                             pEvent->enmType, pEvent->idCpu);
    862879            break;
    863880        }
     
    869886    if (fPrintPrompt && RT_SUCCESS(rc))
    870887    {
     888        /** @todo add CPU indicator to the prompt if an SMP VM? */
    871889        rc = pDbgc->CmdHlp.pfnPrintf(&pDbgc->CmdHlp, NULL, "VBoxDbg> ");
    872890        pDbgc->fReady = true;
     
    938956             * Wait for a debug event.
    939957             */
    940             PCDBGFEVENT pEvent;
    941             rc = DBGFR3EventWait(pDbgc->pUVM, pDbgc->fLog ? 1 : 32, &pEvent);
     958            DBGFEVENT Event;
     959            rc = DBGFR3EventWait(pDbgc->pUVM, pDbgc->fLog ? 1 : 32, &Event);
    942960            if (RT_SUCCESS(rc))
    943961            {
    944                 rc = dbgcProcessEvent(pDbgc, pEvent);
     962                rc = dbgcProcessEvent(pDbgc, &Event);
    945963                if (RT_FAILURE(rc))
    946964                    break;
  • trunk/src/VBox/Debugger/testcase/tstDBGCStubs.cpp

    r82968 r86098  
    9494    return VERR_INTERNAL_ERROR;
    9595}
    96 VMMR3DECL(int) DBGFR3EventWait(PUVM pUVM, RTMSINTERVAL cMillies, PCDBGFEVENT *ppEvent)
     96VMMR3DECL(int) DBGFR3EventWait(PUVM pUVM, RTMSINTERVAL cMillies, PDBGFEVENT pEvent)
    9797{
    9898    return VERR_INTERNAL_ERROR;
     
    107107}
    108108
    109 VMMR3DECL(int) DBGFR3Halt(PUVM pUVM)
     109VMMR3DECL(int) DBGFR3Halt(PUVM pUVM, VMCPUID idCpu)
    110110{
    111111    return VERR_INTERNAL_ERROR;
     
    122122{
    123123}
    124 VMMR3DECL(bool) DBGFR3IsHalted(PUVM pUVM)
     124VMMR3DECL(bool) DBGFR3IsHalted(PUVM pUVM, VMCPUID idCpu)
    125125{
    126126    return true;
     
    164164    return VERR_DBG_LINE_NOT_FOUND;
    165165}
    166 VMMR3DECL(int) DBGFR3Resume(PUVM pUVM)
     166VMMR3DECL(int) DBGFR3Resume(PUVM pUVM, VMCPUID idCpu)
    167167{
    168168    return VERR_INTERNAL_ERROR;
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