VirtualBox

Changeset 22106 in vbox


Ignore:
Timestamp:
Aug 8, 2009 4:15:40 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50855
Message:

DBGF,DBGC: 64-bit stack walking.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/dbgf.h

    r22105 r22106  
    728728{
    729729    /** Frame number. */
    730     RTUINT          iFrame;
     730    uint32_t        iFrame;
    731731    /** Frame flags. */
    732     RTUINT          fFlags;
     732    uint32_t        fFlags;
    733733    /** The frame address.
    734734     * The off member is [e|r]bp and the Sel member is ss. */
     
    795795/** This is the last record because we reached the maximum depth. */
    796796#define DBGFSTACKFRAME_FLAGS_MAX_DEPTH  RT_BIT(3)
     797/** 16-bit frame. */
     798#define DBGFSTACKFRAME_FLAGS_16BIT      RT_BIT(4)
     799/** 32-bit frame. */
     800#define DBGFSTACKFRAME_FLAGS_32BIT      RT_BIT(5)
     801/** 64-bit frame. */
     802#define DBGFSTACKFRAME_FLAGS_64BIT      RT_BIT(6)
    797803/** @} */
    798804
  • trunk/src/VBox/VMM/DBGFStack.cpp

    r19710 r22106  
    101101        case DBGFADDRESS_FLAGS_FAR64: cbStackItem = 8; break;
    102102        case DBGFADDRESS_FLAGS_RING0: cbStackItem = sizeof(RTHCUINTPTR); break;
    103         default:                      cbStackItem = 4; break; /// @todo 64-bit guests.
     103        default:
     104            switch (pFrame->enmReturnType)
     105            {
     106                case DBGFRETURNTYPE_FAR16:
     107                case DBGFRETURNTYPE_IRET16:
     108                case DBGFRETURNTYPE_IRET32_V86:
     109                case DBGFRETURNTYPE_NEAR16: cbStackItem = 2; break;
     110
     111                case DBGFRETURNTYPE_FAR32:
     112                case DBGFRETURNTYPE_IRET32:
     113                case DBGFRETURNTYPE_IRET32_PRIV:
     114                case DBGFRETURNTYPE_NEAR32: cbStackItem = 4; break;
     115
     116                case DBGFRETURNTYPE_FAR64:
     117                case DBGFRETURNTYPE_IRET64:
     118                case DBGFRETURNTYPE_NEAR64: cbStackItem = 8; break;
     119
     120                default:
     121                    AssertMsgFailed(("%d\n", pFrame->enmReturnType));
     122                    cbStackItem = 4;
     123                    break;
     124            }
    104125    }
    105126
     
    239260
    240261    /*
     262     * Frame bitness flag.
     263     */
     264    switch (cbStackItem)
     265    {
     266        case 2: pFrame->fFlags |= DBGFSTACKFRAME_FLAGS_16BIT; break;
     267        case 4: pFrame->fFlags |= DBGFSTACKFRAME_FLAGS_32BIT; break;
     268        case 8: pFrame->fFlags |= DBGFSTACKFRAME_FLAGS_64BIT; break;
     269        default:    AssertMsgFailed(("cbStackItem=%d\n", cbStackItem)); return VERR_INTERNAL_ERROR;
     270    }
     271
     272    /*
    241273     * The arguments.
    242274     */
     
    282314                case DBGFADDRESS_FLAGS_FAR32: pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break;
    283315                case DBGFADDRESS_FLAGS_FAR64: pCur->enmReturnType = DBGFRETURNTYPE_NEAR64; break;
    284                 case DBGFADDRESS_FLAGS_RING0: pCur->enmReturnType = (HC_ARCH_BITS == 64) ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32; break;
     316                case DBGFADDRESS_FLAGS_RING0: pCur->enmReturnType = HC_ARCH_BITS == 64 ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32; break;
    285317                default:                      pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break; /// @todo 64-bit guests
    286318            }
    287319
    288         uint64_t fAddrMask = UINT64_MAX;
     320        uint64_t fAddrMask;
    289321        if (enmCodeType == DBGFCODETYPE_RING0)
    290             fAddrMask = (HC_ARCH_BITS == 64) ? UINT64_MAX : UINT32_MAX;
    291         else
    292         if (enmCodeType == DBGFCODETYPE_HYPER)
     322            fAddrMask = HC_ARCH_BITS == 64 ? UINT64_MAX : UINT32_MAX;
     323        else if (enmCodeType == DBGFCODETYPE_HYPER)
    293324            fAddrMask = UINT32_MAX;
    294325        else if (DBGFADDRESS_IS_FAR16(&pCur->AddrPC))
     
    296327        else if (DBGFADDRESS_IS_FAR32(&pCur->AddrPC))
    297328            fAddrMask = UINT32_MAX;
    298         else if (DBGFADDRESS_IS_FLAT(&pCur->AddrPC))
     329        else if (DBGFADDRESS_IS_FAR64(&pCur->AddrPC))
     330            fAddrMask = UINT64_MAX;
     331        else
    299332        {
    300             CPUMMODE CpuMode = CPUMGetGuestMode(VMMGetCpuById(pVM, idCpu));
     333            PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);
     334            CPUMMODE CpuMode = CPUMGetGuestMode(pVCpu);
    301335            if (CpuMode == CPUMMODE_REAL)
    302336                fAddrMask = UINT16_MAX;
    303             else if (CpuMode == CPUMMODE_PROTECTED)
     337            else if (   CpuMode == CPUMMODE_PROTECTED
     338                     || !CPUMIsGuestIn64BitCode(pVCpu, pCtxCore))
    304339                fAddrMask = UINT32_MAX;
     340            else
     341                fAddrMask = UINT64_MAX;
    305342        }
    306343
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