VirtualBox

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


Ignore:
Timestamp:
Aug 2, 2018 9:06:59 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
124087
Message:

IPRT,DBGF,Diggers: Moved DBGFRETURNTYPE and the unwind state structure to IPRT (dbg.h) in prep for debug module interface and more. Added stack unwind assist callback for the OS diggers so they can identify special stack frames and supply more info via the sure-register-value array and frame flags. Identify and decode NT/AMD64 trap frames.

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

Legend:

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

    r73449 r73460  
    28532853             * Display verbose frame info.
    28542854             */
    2855             const char *pszRetType;
     2855            const char *pszRetType = "invalid";
    28562856            switch (pFrame->enmReturnType)
    28572857            {
    2858                 case DBGFRETURNTYPE_NEAR16:         pszRetType = "retn/16"; break;
    2859                 case DBGFRETURNTYPE_NEAR32:         pszRetType = "retn/32"; break;
    2860                 case DBGFRETURNTYPE_NEAR64:         pszRetType = "retn/64"; break;
    2861                 case DBGFRETURNTYPE_FAR16:          pszRetType = "retf/16"; break;
    2862                 case DBGFRETURNTYPE_FAR32:          pszRetType = "retf/32"; break;
    2863                 case DBGFRETURNTYPE_FAR64:          pszRetType = "retf/64"; break;
    2864                 case DBGFRETURNTYPE_IRET16:         pszRetType = "iret-16"; break;
    2865                 case DBGFRETURNTYPE_IRET32:         pszRetType = "iret/32s"; break;
    2866                 case DBGFRETURNTYPE_IRET32_PRIV:    pszRetType = "iret/32p"; break;
    2867                 case DBGFRETURNTYPE_IRET32_V86:     pszRetType = "iret/v86"; break;
    2868                 case DBGFRETURNTYPE_IRET64:         pszRetType = "iret/64"; break;
    2869                 default:                            pszRetType = "invalid"; break;
     2858                case RTDBGRETURNTYPE_NEAR16:        pszRetType = "retn/16"; break;
     2859                case RTDBGRETURNTYPE_NEAR32:        pszRetType = "retn/32"; break;
     2860                case RTDBGRETURNTYPE_NEAR64:        pszRetType = "retn/64"; break;
     2861                case RTDBGRETURNTYPE_FAR16:         pszRetType = "retf/16"; break;
     2862                case RTDBGRETURNTYPE_FAR32:         pszRetType = "retf/32"; break;
     2863                case RTDBGRETURNTYPE_FAR64:         pszRetType = "retf/64"; break;
     2864                case RTDBGRETURNTYPE_IRET16:        pszRetType = "iret-16"; break;
     2865                case RTDBGRETURNTYPE_IRET32:        pszRetType = "iret/32s"; break;
     2866                case RTDBGRETURNTYPE_IRET32_PRIV:   pszRetType = "iret/32p"; break;
     2867                case RTDBGRETURNTYPE_IRET32_V86:    pszRetType = "iret/v86"; break;
     2868                case RTDBGRETURNTYPE_IRET64:        pszRetType = "iret/64"; break;
     2869
     2870                case RTDBGRETURNTYPE_END:
     2871                case RTDBGRETURNTYPE_INVALID:
     2872                case RTDBGRETURNTYPE_32BIT_HACK:
     2873                    break;
    28702874            }
    28712875            size_t cchLine = DBGCCmdHlpPrintfLen(pCmdHlp, "   %s", pszRetType);
     
    28782882            if (pFrame->fFlags & DBGFSTACKFRAME_FLAGS_MAX_DEPTH)
    28792883                cchLine += DBGCCmdHlpPrintfLen(pCmdHlp, " max-depth");
     2884            if (pFrame->fFlags & DBGFSTACKFRAME_FLAGS_TRAP_FRAME)
     2885                cchLine += DBGCCmdHlpPrintfLen(pCmdHlp, " trap-frame");
    28802886
    28812887            if (pFrame->cSureRegs > 0)
  • trunk/src/VBox/Debugger/DBGPlugInDarwin.cpp

    r69500 r73460  
    129129*********************************************************************************************************************************/
    130130static DECLCALLBACK(int)  dbgDiggerDarwinInit(PUVM pUVM, void *pvData);
     131
    131132
    132133
     
    304305
    305306/**
     307 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     308 */
     309static DECLCALLBACK(int) dbgDiggerDarwinStackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     310                                                          PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     311                                                          uint64_t *puScratch)
     312{
     313    RT_NOREF(pUVM, pvData, idCpu, pFrame, pState, pInitialCtx, hAs, puScratch);
     314    return VINF_SUCCESS;
     315}
     316
     317
     318/**
    306319 * @copydoc DBGFOSREG::pfnQueryInterface
    307320 */
     
    972985const DBGFOSREG g_DBGDiggerDarwin =
    973986{
    974     /* .u32Magic = */           DBGFOSREG_MAGIC,
    975     /* .fFlags = */             0,
    976     /* .cbData = */             sizeof(DBGDIGGERDARWIN),
    977     /* .szName = */             "Darwin",
    978     /* .pfnConstruct = */       dbgDiggerDarwinConstruct,
    979     /* .pfnDestruct = */        dbgDiggerDarwinDestruct,
    980     /* .pfnProbe = */           dbgDiggerDarwinProbe,
    981     /* .pfnInit = */            dbgDiggerDarwinInit,
    982     /* .pfnRefresh = */         dbgDiggerDarwinRefresh,
    983     /* .pfnTerm = */            dbgDiggerDarwinTerm,
    984     /* .pfnQueryVersion = */    dbgDiggerDarwinQueryVersion,
    985     /* .pfnQueryInterface = */  dbgDiggerDarwinQueryInterface,
    986     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     987    /* .u32Magic = */               DBGFOSREG_MAGIC,
     988    /* .fFlags = */                 0,
     989    /* .cbData = */                 sizeof(DBGDIGGERDARWIN),
     990    /* .szName = */                 "Darwin",
     991    /* .pfnConstruct = */           dbgDiggerDarwinConstruct,
     992    /* .pfnDestruct = */            dbgDiggerDarwinDestruct,
     993    /* .pfnProbe = */               dbgDiggerDarwinProbe,
     994    /* .pfnInit = */                dbgDiggerDarwinInit,
     995    /* .pfnRefresh = */             dbgDiggerDarwinRefresh,
     996    /* .pfnTerm = */                dbgDiggerDarwinTerm,
     997    /* .pfnQueryVersion = */        dbgDiggerDarwinQueryVersion,
     998    /* .pfnQueryInterface = */      dbgDiggerDarwinQueryInterface,
     999    /* .pfnStackUnwindAssist = */   dbgDiggerDarwinStackUnwindAssist,
     1000    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    9871001};
    9881002
  • trunk/src/VBox/Debugger/DBGPlugInFreeBsd.cpp

    r69500 r73460  
    585585
    586586/**
     587 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     588 */
     589static DECLCALLBACK(int) dbgDiggerFreeBsdStackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     590                                                           PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     591                                                           uint64_t *puScratch)
     592{
     593    RT_NOREF(pUVM, pvData, idCpu, pFrame, pState, pInitialCtx, hAs, puScratch);
     594    return VINF_SUCCESS;
     595}
     596
     597
     598/**
    587599 * @copydoc DBGFOSREG::pfnQueryInterface
    588600 */
     
    799811const DBGFOSREG g_DBGDiggerFreeBsd =
    800812{
    801     /* .u32Magic = */           DBGFOSREG_MAGIC,
    802     /* .fFlags = */             0,
    803     /* .cbData = */             sizeof(DBGDIGGERFBSD),
    804     /* .szName = */             "FreeBSD",
    805     /* .pfnConstruct = */       dbgDiggerFreeBsdConstruct,
    806     /* .pfnDestruct = */        dbgDiggerFreeBsdDestruct,
    807     /* .pfnProbe = */           dbgDiggerFreeBsdProbe,
    808     /* .pfnInit = */            dbgDiggerFreeBsdInit,
    809     /* .pfnRefresh = */         dbgDiggerFreeBsdRefresh,
    810     /* .pfnTerm = */            dbgDiggerFreeBsdTerm,
    811     /* .pfnQueryVersion = */    dbgDiggerFreeBsdQueryVersion,
    812     /* .pfnQueryInterface = */  dbgDiggerFreeBsdQueryInterface,
    813     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     813    /* .u32Magic = */               DBGFOSREG_MAGIC,
     814    /* .fFlags = */                 0,
     815    /* .cbData = */                 sizeof(DBGDIGGERFBSD),
     816    /* .szName = */                 "FreeBSD",
     817    /* .pfnConstruct = */           dbgDiggerFreeBsdConstruct,
     818    /* .pfnDestruct = */            dbgDiggerFreeBsdDestruct,
     819    /* .pfnProbe = */               dbgDiggerFreeBsdProbe,
     820    /* .pfnInit = */                dbgDiggerFreeBsdInit,
     821    /* .pfnRefresh = */             dbgDiggerFreeBsdRefresh,
     822    /* .pfnTerm = */                dbgDiggerFreeBsdTerm,
     823    /* .pfnQueryVersion = */        dbgDiggerFreeBsdQueryVersion,
     824    /* .pfnQueryInterface = */      dbgDiggerFreeBsdQueryInterface,
     825    /* .pfnStackUnwindAssist = */   dbgDiggerFreeBsdStackUnwindAssist,
     826    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    814827};
    815828
  • trunk/src/VBox/Debugger/DBGPlugInLinux.cpp

    r73097 r73460  
    10821082{
    10831083    RTStrSpaceDestroy(&pThis->hCfgDb, dbgDiggerLinuxCfgDbDestroyWorker, NULL);
     1084}
     1085
     1086
     1087/**
     1088 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     1089 */
     1090static DECLCALLBACK(int) dbgDiggerLinuxStackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     1091                                                         PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     1092                                                         uint64_t *puScratch)
     1093{
     1094    RT_NOREF(pUVM, pvData, idCpu, pFrame, pState, pInitialCtx, hAs, puScratch);
     1095    return VINF_SUCCESS;
    10841096}
    10851097
     
    25982610const DBGFOSREG g_DBGDiggerLinux =
    25992611{
    2600     /* .u32Magic = */           DBGFOSREG_MAGIC,
    2601     /* .fFlags = */             0,
    2602     /* .cbData = */             sizeof(DBGDIGGERLINUX),
    2603     /* .szName = */             "Linux",
    2604     /* .pfnConstruct = */       dbgDiggerLinuxConstruct,
    2605     /* .pfnDestruct = */        dbgDiggerLinuxDestruct,
    2606     /* .pfnProbe = */           dbgDiggerLinuxProbe,
    2607     /* .pfnInit = */            dbgDiggerLinuxInit,
    2608     /* .pfnRefresh = */         dbgDiggerLinuxRefresh,
    2609     /* .pfnTerm = */            dbgDiggerLinuxTerm,
    2610     /* .pfnQueryVersion = */    dbgDiggerLinuxQueryVersion,
    2611     /* .pfnQueryInterface = */  dbgDiggerLinuxQueryInterface,
    2612     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     2612    /* .u32Magic = */               DBGFOSREG_MAGIC,
     2613    /* .fFlags = */                 0,
     2614    /* .cbData = */                 sizeof(DBGDIGGERLINUX),
     2615    /* .szName = */                 "Linux",
     2616    /* .pfnConstruct = */           dbgDiggerLinuxConstruct,
     2617    /* .pfnDestruct = */            dbgDiggerLinuxDestruct,
     2618    /* .pfnProbe = */               dbgDiggerLinuxProbe,
     2619    /* .pfnInit = */                dbgDiggerLinuxInit,
     2620    /* .pfnRefresh = */             dbgDiggerLinuxRefresh,
     2621    /* .pfnTerm = */                dbgDiggerLinuxTerm,
     2622    /* .pfnQueryVersion = */        dbgDiggerLinuxQueryVersion,
     2623    /* .pfnQueryInterface = */      dbgDiggerLinuxQueryInterface,
     2624    /* .pfnStackUnwindAssist = */   dbgDiggerLinuxStackUnwindAssist,
     2625    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    26132626};
    26142627
  • trunk/src/VBox/Debugger/DBGPlugInOS2.cpp

    r69500 r73460  
    116116
    117117/**
     118 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     119 */
     120static DECLCALLBACK(int) dbgDiggerOS2StackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     121                                                       PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     122                                                       uint64_t *puScratch)
     123{
     124    RT_NOREF(pUVM, pvData, idCpu, pFrame, pState, pInitialCtx, hAs, puScratch);
     125    return VINF_SUCCESS;
     126}
     127
     128
     129/**
    118130 * @copydoc DBGFOSREG::pfnQueryInterface
    119131 */
     
    343355const DBGFOSREG g_DBGDiggerOS2 =
    344356{
    345     /* .u32Magic = */           DBGFOSREG_MAGIC,
    346     /* .fFlags = */             0,
    347     /* .cbData = */             sizeof(DBGDIGGEROS2),
    348     /* .szName = */             "OS/2",
    349     /* .pfnConstruct = */       dbgDiggerOS2Construct,
    350     /* .pfnDestruct = */        dbgDiggerOS2Destruct,
    351     /* .pfnProbe = */           dbgDiggerOS2Probe,
    352     /* .pfnInit = */            dbgDiggerOS2Init,
    353     /* .pfnRefresh = */         dbgDiggerOS2Refresh,
    354     /* .pfnTerm = */            dbgDiggerOS2Term,
    355     /* .pfnQueryVersion = */    dbgDiggerOS2QueryVersion,
    356     /* .pfnQueryInterface = */  dbgDiggerOS2QueryInterface,
    357     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     357    /* .u32Magic = */               DBGFOSREG_MAGIC,
     358    /* .fFlags = */                 0,
     359    /* .cbData = */                 sizeof(DBGDIGGEROS2),
     360    /* .szName = */                 "OS/2",
     361    /* .pfnConstruct = */           dbgDiggerOS2Construct,
     362    /* .pfnDestruct = */            dbgDiggerOS2Destruct,
     363    /* .pfnProbe = */               dbgDiggerOS2Probe,
     364    /* .pfnInit = */                dbgDiggerOS2Init,
     365    /* .pfnRefresh = */             dbgDiggerOS2Refresh,
     366    /* .pfnTerm = */                dbgDiggerOS2Term,
     367    /* .pfnQueryVersion = */        dbgDiggerOS2QueryVersion,
     368    /* .pfnQueryInterface = */      dbgDiggerOS2QueryInterface,
     369    /* .pfnStackUnwindAssist = */   dbgDiggerOS2StackUnwindAssist,
     370    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    358371};
  • trunk/src/VBox/Debugger/DBGPlugInSolaris.cpp

    r69500 r73460  
    352352static DECLCALLBACK(int)  dbgDiggerSolarisInit(PUVM pUVM, void *pvData);
    353353
     354
     355
     356/**
     357 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     358 */
     359static DECLCALLBACK(int) dbgDiggerSolarisStackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     360                                                           PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     361                                                           uint64_t *puScratch)
     362{
     363    RT_NOREF(pUVM, pvData, idCpu, pFrame, pState, pInitialCtx, hAs, puScratch);
     364    return VINF_SUCCESS;
     365}
    354366
    355367
     
    11111123const DBGFOSREG g_DBGDiggerSolaris =
    11121124{
    1113     /* .u32Magic = */           DBGFOSREG_MAGIC,
    1114     /* .fFlags = */             0,
    1115     /* .cbData = */             sizeof(DBGDIGGERSOLARIS),
    1116     /* .szName = */             "Solaris",
    1117     /* .pfnConstruct = */       dbgDiggerSolarisConstruct,
    1118     /* .pfnDestruct = */        dbgDiggerSolarisDestruct,
    1119     /* .pfnProbe = */           dbgDiggerSolarisProbe,
    1120     /* .pfnInit = */            dbgDiggerSolarisInit,
    1121     /* .pfnRefresh = */         dbgDiggerSolarisRefresh,
    1122     /* .pfnTerm = */            dbgDiggerSolarisTerm,
    1123     /* .pfnQueryVersion = */    dbgDiggerSolarisQueryVersion,
    1124     /* .pfnQueryInterface = */  dbgDiggerSolarisQueryInterface,
    1125     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     1125    /* .u32Magic = */               DBGFOSREG_MAGIC,
     1126    /* .fFlags = */                 0,
     1127    /* .cbData = */                 sizeof(DBGDIGGERSOLARIS),
     1128    /* .szName = */                 "Solaris",
     1129    /* .pfnConstruct = */           dbgDiggerSolarisConstruct,
     1130    /* .pfnDestruct = */            dbgDiggerSolarisDestruct,
     1131    /* .pfnProbe = */               dbgDiggerSolarisProbe,
     1132    /* .pfnInit = */                dbgDiggerSolarisInit,
     1133    /* .pfnRefresh = */             dbgDiggerSolarisRefresh,
     1134    /* .pfnTerm = */                dbgDiggerSolarisTerm,
     1135    /* .pfnQueryVersion = */        dbgDiggerSolarisQueryVersion,
     1136    /* .pfnQueryInterface = */      dbgDiggerSolarisQueryInterface,
     1137    /* .pfnStackUnwindAssist = */   dbgDiggerSolarisStackUnwindAssist,
     1138    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    11261139};
    11271140
  • trunk/src/VBox/Debugger/DBGPlugInWinNt.cpp

    r73419 r73460  
    2323#include "DBGPlugIns.h"
    2424#include <VBox/vmm/dbgf.h>
     25#include <VBox/vmm/cpumctx.h>
     26#include <VBox/vmm/mm.h>
    2527#include <VBox/err.h>
    2628#include <VBox/param.h>
     
    3133#include <iprt/formats/pecoff.h>
    3234#include <iprt/formats/mz.h>
     35#include <iprt/nt/nt-structures.h>
    3336
    3437
     
    262265#define WINNT32_VALID_ADDRESS(Addr)         ((Addr) >         UINT32_C(0x80000000) && (Addr) <         UINT32_C(0xfffff000))
    263266/** Validates a 64-bit Windows NT kernel address */
    264  #define WINNT64_VALID_ADDRESS(Addr)         ((Addr) > UINT64_C(0xffff800000000000) && (Addr) < UINT64_C(0xfffffffffffff000))
     267#define WINNT64_VALID_ADDRESS(Addr)         ((Addr) > UINT64_C(0xffff800000000000) && (Addr) < UINT64_C(0xfffffffffffff000))
    265268/** Validates a kernel address. */
    266269#define WINNT_VALID_ADDRESS(pThis, Addr)    ((pThis)->f32Bit ? WINNT32_VALID_ADDRESS(Addr) : WINNT64_VALID_ADDRESS(Addr))
     
    347350    else
    348351        Log(("DigWinNt: %s: DBGFR3ModInMem failed: %Rrc\n", pszName, rc));
     352}
     353
     354
     355/**
     356 * @copydoc DBGFOSREG::pfnStackUnwindAssist
     357 */
     358static DECLCALLBACK(int) dbgDiggerWinNtStackUnwindAssist(PUVM pUVM, void *pvData, VMCPUID idCpu, PDBGFSTACKFRAME pFrame,
     359                                                         PRTDBGUNWINDSTATE pState, PCCPUMCTX pInitialCtx, RTDBGAS hAs,
     360                                                         uint64_t *puScratch)
     361{
     362    Assert(pInitialCtx);
     363
     364    /*
     365     * We want to locate trap frames here.  The trap frame structure contains
     366     * the 64-bit IRET frame, so given unwind information it's easy to identify
     367     * using the return type and frame address.
     368     */
     369    if (pFrame->fFlags & DBGFSTACKFRAME_FLAGS_64BIT)
     370    {
     371        /*
     372         * Is this a trap frame?  If so, try read the trap frame.
     373         */
     374        if (   pFrame->enmReturnType == RTDBGRETURNTYPE_IRET64
     375            && !(pFrame->AddrFrame.FlatPtr & 0x7)
     376            && WINNT64_VALID_ADDRESS(pFrame->AddrFrame.FlatPtr) )
     377        {
     378            KTRAP_FRAME_AMD64 TrapFrame;
     379            RT_ZERO(TrapFrame);
     380            uint64_t const uTrapFrameAddr = pFrame->AddrFrame.FlatPtr
     381                                          - RT_UOFFSETOF(KTRAP_FRAME_AMD64, ErrCdOrXcptFrameOrS);
     382            int rc = pState->pfnReadStack(pState, uTrapFrameAddr, sizeof(TrapFrame), &TrapFrame);
     383            if (RT_SUCCESS(rc))
     384            {
     385                /* Valid?  Not too much else we can check here (EFlags isn't
     386                   reliable in manually construct frames). */
     387                if (TrapFrame.ExceptionActive <= 2)
     388                {
     389                    pFrame->fFlags |= DBGFSTACKFRAME_FLAGS_TRAP_FRAME;
     390
     391                    /*
     392                     * Add sure 'register' information from the frame to the frame.
     393                     *
     394                     * To avoid code duplication, we do this in two steps in a loop.
     395                     * The first iteration only figures out how many registers we're
     396                     * going to save and allocates room for them.  The second iteration
     397                     * does the actual adding.
     398                     */
     399                    uint32_t      cRegs      = pFrame->cSureRegs;
     400                    PDBGFREGVALEX paSureRegs = NULL;
     401#define ADD_REG_NAMED(a_Type, a_ValMemb, a_Value, a_pszName) do { \
     402                            if (paSureRegs) \
     403                            { \
     404                                paSureRegs[iReg].pszName         = a_pszName;\
     405                                paSureRegs[iReg].enmReg          = DBGFREG_END; \
     406                                paSureRegs[iReg].enmType         = a_Type; \
     407                                paSureRegs[iReg].Value.a_ValMemb = (a_Value); \
     408                            } \
     409                            iReg++; \
     410                        } while (0)
     411#define MAYBE_ADD_GREG(a_Value, a_enmReg, a_idxReg) do { \
     412                            if (!(pState->u.x86.Loaded.s.fRegs & RT_BIT(a_idxReg))) \
     413                            { \
     414                                if (paSureRegs) \
     415                                { \
     416                                    pState->u.x86.Loaded.s.fRegs    |= RT_BIT(a_idxReg); \
     417                                    pState->u.x86.auRegs[a_idxReg]   = (a_Value); \
     418                                    paSureRegs[iReg].Value.u64       = (a_Value); \
     419                                    paSureRegs[iReg].enmReg          = a_enmReg; \
     420                                    paSureRegs[iReg].enmType         = DBGFREGVALTYPE_U64; \
     421                                    paSureRegs[iReg].pszName         = NULL; \
     422                                } \
     423                                iReg++; \
     424                            } \
     425                        } while (0)
     426                    for (unsigned iLoop = 0; iLoop < 2; iLoop++)
     427                    {
     428                        uint32_t iReg = pFrame->cSureRegs;
     429                        ADD_REG_NAMED(DBGFREGVALTYPE_U64, u64, uTrapFrameAddr, "TrapFrame");
     430                        ADD_REG_NAMED(DBGFREGVALTYPE_U8,   u8, TrapFrame.ExceptionActive, "ExceptionActive");
     431                        if (TrapFrame.ExceptionActive == 0)
     432                        {
     433                            ADD_REG_NAMED(DBGFREGVALTYPE_U8,   u8, TrapFrame.PreviousIrql, "PrevIrql");
     434                            ADD_REG_NAMED(DBGFREGVALTYPE_U8,   u8, (uint8_t)TrapFrame.ErrCdOrXcptFrameOrS, "IntNo");
     435                        }
     436                        else if (   TrapFrame.ExceptionActive == 1
     437                                 && TrapFrame.FaultIndicator == ((TrapFrame.ErrCdOrXcptFrameOrS >> 1) & 0x9))
     438                            ADD_REG_NAMED(DBGFREGVALTYPE_U64, u64, TrapFrame.FaultAddrOrCtxRecOrTS, "cr2-probably");
     439                        if (TrapFrame.SegCs & X86_SEL_RPL)
     440                            ADD_REG_NAMED(DBGFREGVALTYPE_U8,   u8, 1, "UserMode");
     441                        else
     442                            ADD_REG_NAMED(DBGFREGVALTYPE_U8,   u8, 1, "KernelMode");
     443                        if (TrapFrame.ExceptionActive <= 1)
     444                        {
     445                            MAYBE_ADD_GREG(TrapFrame.Rax, DBGFREG_RAX, X86_GREG_xAX);
     446                            MAYBE_ADD_GREG(TrapFrame.Rcx, DBGFREG_RCX, X86_GREG_xCX);
     447                            MAYBE_ADD_GREG(TrapFrame.Rdx, DBGFREG_RDX, X86_GREG_xDX);
     448                            MAYBE_ADD_GREG(TrapFrame.R8,  DBGFREG_R8,  X86_GREG_x8);
     449                            MAYBE_ADD_GREG(TrapFrame.R9,  DBGFREG_R9,  X86_GREG_x9);
     450                            MAYBE_ADD_GREG(TrapFrame.R10, DBGFREG_R10, X86_GREG_x10);
     451                            MAYBE_ADD_GREG(TrapFrame.R11, DBGFREG_R11, X86_GREG_x11);
     452                        }
     453                        else if (TrapFrame.ExceptionActive == 2)
     454                        {
     455                            MAYBE_ADD_GREG(TrapFrame.Rbx, DBGFREG_RBX, X86_GREG_xBX);
     456                            MAYBE_ADD_GREG(TrapFrame.Rsi, DBGFREG_RSI, X86_GREG_xSI);
     457                            MAYBE_ADD_GREG(TrapFrame.Rdi, DBGFREG_RDI, X86_GREG_xDI);
     458                        }
     459                        MAYBE_ADD_GREG(TrapFrame.Rbp, DBGFREG_RBP, X86_GREG_xBP);
     460
     461                        /* Done? */
     462                        if (iLoop > 0)
     463                        {
     464                            Assert(cRegs == iReg);
     465                            break;
     466                        }
     467
     468                        /* Resize the array, zeroing the extension. */
     469                        if (pFrame->cSureRegs)
     470                            paSureRegs = (PDBGFREGVALEX)MMR3HeapRealloc(pFrame->paSureRegs, iReg * sizeof(paSureRegs[0]));
     471                        else
     472                            paSureRegs = (PDBGFREGVALEX)MMR3HeapAllocU(pUVM, MM_TAG_DBGF_STACK, iReg * sizeof(paSureRegs[0]));
     473                        AssertReturn(paSureRegs, VERR_NO_MEMORY);
     474
     475                        pFrame->paSureRegs = paSureRegs;
     476                        RT_BZERO(&paSureRegs[pFrame->cSureRegs], (iReg - pFrame->cSureRegs) * sizeof(paSureRegs[0]));
     477                        cRegs = iReg;
     478                    }
     479#undef ADD_REG_NAMED
     480#undef MAYBE_ADD_GREG
     481
     482                    /* Commit the register update. */
     483                    pFrame->cSureRegs = cRegs;
     484                }
     485            }
     486        }
     487    }
     488
     489    RT_NOREF(pUVM, pvData, idCpu, hAs, puScratch);
     490    return VINF_SUCCESS;
    349491}
    350492
     
    8821024const DBGFOSREG g_DBGDiggerWinNt =
    8831025{
    884     /* .u32Magic = */           DBGFOSREG_MAGIC,
    885     /* .fFlags = */             0,
    886     /* .cbData = */             sizeof(DBGDIGGERWINNT),
    887     /* .szName = */             "WinNT",
    888     /* .pfnConstruct = */       dbgDiggerWinNtConstruct,
    889     /* .pfnDestruct = */        dbgDiggerWinNtDestruct,
    890     /* .pfnProbe = */           dbgDiggerWinNtProbe,
    891     /* .pfnInit = */            dbgDiggerWinNtInit,
    892     /* .pfnRefresh = */         dbgDiggerWinNtRefresh,
    893     /* .pfnTerm = */            dbgDiggerWinNtTerm,
    894     /* .pfnQueryVersion = */    dbgDiggerWinNtQueryVersion,
    895     /* .pfnQueryInterface = */  dbgDiggerWinNtQueryInterface,
    896     /* .u32EndMagic = */        DBGFOSREG_MAGIC
     1026    /* .u32Magic = */               DBGFOSREG_MAGIC,
     1027    /* .fFlags = */                 0,
     1028    /* .cbData = */                 sizeof(DBGDIGGERWINNT),
     1029    /* .szName = */                 "WinNT",
     1030    /* .pfnConstruct = */           dbgDiggerWinNtConstruct,
     1031    /* .pfnDestruct = */            dbgDiggerWinNtDestruct,
     1032    /* .pfnProbe = */               dbgDiggerWinNtProbe,
     1033    /* .pfnInit = */                dbgDiggerWinNtInit,
     1034    /* .pfnRefresh = */             dbgDiggerWinNtRefresh,
     1035    /* .pfnTerm = */                dbgDiggerWinNtTerm,
     1036    /* .pfnQueryVersion = */        dbgDiggerWinNtQueryVersion,
     1037    /* .pfnQueryInterface = */      dbgDiggerWinNtQueryInterface,
     1038    /* .pfnStackUnwindAssist = */   dbgDiggerWinNtStackUnwindAssist,
     1039    /* .u32EndMagic = */            DBGFOSREG_MAGIC
    8971040};
    8981041
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