VirtualBox

Changeset 60560 in vbox


Ignore:
Timestamp:
Apr 19, 2016 3:06:42 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106689
Message:

DBGFStack: Take odd saved BP as a hint of far returns.

Location:
trunk
Files:
2 edited

Legend:

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

    r59074 r60560  
    12441244/** Set if the content of the frame is filled in by DBGFR3StackWalk() and can be used
    12451245 * to construct the next frame. */
    1246 # define DBGFSTACKFRAME_FLAGS_ALL_VALID RT_BIT(0)
     1246# define DBGFSTACKFRAME_FLAGS_ALL_VALID     RT_BIT(0)
    12471247/** This is the last stack frame we can read.
    12481248 * This flag is not set if the walk stop because of max dept or recursion. */
    1249 # define DBGFSTACKFRAME_FLAGS_LAST      RT_BIT(1)
     1249# define DBGFSTACKFRAME_FLAGS_LAST          RT_BIT(1)
    12501250/** This is the last record because we detected a loop. */
    1251 # define DBGFSTACKFRAME_FLAGS_LOOP      RT_BIT(2)
     1251# define DBGFSTACKFRAME_FLAGS_LOOP          RT_BIT(2)
    12521252/** This is the last record because we reached the maximum depth. */
    1253 # define DBGFSTACKFRAME_FLAGS_MAX_DEPTH RT_BIT(3)
     1253# define DBGFSTACKFRAME_FLAGS_MAX_DEPTH     RT_BIT(3)
    12541254/** 16-bit frame. */
    1255 # define DBGFSTACKFRAME_FLAGS_16BIT     RT_BIT(4)
     1255# define DBGFSTACKFRAME_FLAGS_16BIT         RT_BIT(4)
    12561256/** 32-bit frame. */
    1257 # define DBGFSTACKFRAME_FLAGS_32BIT     RT_BIT(5)
     1257# define DBGFSTACKFRAME_FLAGS_32BIT         RT_BIT(5)
    12581258/** 64-bit frame. */
    1259 # define DBGFSTACKFRAME_FLAGS_64BIT     RT_BIT(6)
     1259# define DBGFSTACKFRAME_FLAGS_64BIT         RT_BIT(6)
     1260/** Used Odd/even heuristics for far/near return. */
     1261# define DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN RT_BIT(7)
    12601262/** @} */
    12611263
  • trunk/src/VBox/VMM/VMMR3/DBGFStack.cpp

    r57358 r60560  
    8888    /*
    8989     * Read the raw frame data.
    90      */
    91     const DBGFADDRESS AddrOldPC = pFrame->AddrPC;
    92     const unsigned cbRetAddr = DBGFReturnTypeSize(pFrame->enmReturnType);
    93     unsigned cbStackItem;
     90     * We double cbRetAddr in case we find we have a far return.
     91     */
     92    const DBGFADDRESS   AddrOldPC = pFrame->AddrPC;
     93    unsigned            cbRetAddr = DBGFReturnTypeSize(pFrame->enmReturnType);
     94    unsigned            cbStackItem;
    9495    switch (AddrOldPC.fFlags & DBGFADDRESS_FLAGS_TYPE_MASK)
    9596    {
     
    130131        void     *pv;
    131132    } u, uRet, uArgs, uBp;
    132     size_t cbRead = cbRetAddr + cbStackItem + sizeof(pFrame->Args);
     133    size_t cbRead = cbRetAddr*2 + cbStackItem + sizeof(pFrame->Args);
    133134    u.pv = alloca(cbRead);
    134135    uBp = u;
     
    185186        default:    AssertMsgFailedReturn(("cbStackItem=%d\n", cbStackItem), VERR_DBGF_STACK_IPE_1);
    186187    }
     188
     189    /* Watcom tries to keep the frame pointer odd for far returns. */
     190    if (cbStackItem <= 4)
     191    {
     192        if (pFrame->AddrReturnFrame.off & 1)
     193        {
     194            pFrame->AddrReturnFrame.off &= ~(RTGCUINTPTR)1;
     195            if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR16)
     196            {
     197                pFrame->fFlags       |= DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
     198                pFrame->enmReturnType = DBGFRETURNTYPE_FAR16;
     199                cbRetAddr = 4;
     200            }
     201            else if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR32)
     202            {
     203                pFrame->fFlags       |= DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
     204                pFrame->enmReturnType = DBGFRETURNTYPE_FAR32;
     205                cbRetAddr = 8;
     206            }
     207        }
     208        else if (pFrame->fFlags & DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN)
     209        {
     210            if (pFrame->enmReturnType == DBGFRETURNTYPE_FAR16)
     211            {
     212                pFrame->enmReturnType = DBGFRETURNTYPE_NEAR16;
     213                cbRetAddr = 2;
     214            }
     215            else if (pFrame->enmReturnType == DBGFRETURNTYPE_NEAR32)
     216            {
     217                pFrame->enmReturnType = DBGFRETURNTYPE_FAR32;
     218                cbRetAddr = 4;
     219            }
     220            pFrame->fFlags &= ~DBGFSTACKFRAME_FLAGS_USED_ODD_EVEN;
     221        }
     222        uArgs.pb = u.pb + cbStackItem + cbRetAddr;
     223    }
     224
    187225    pFrame->AddrReturnFrame.FlatPtr += pFrame->AddrReturnFrame.off - pFrame->AddrFrame.off;
    188226
     
    315353                case DBGFADDRESS_FLAGS_FAR32: pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break;
    316354                case DBGFADDRESS_FLAGS_FAR64: pCur->enmReturnType = DBGFRETURNTYPE_NEAR64; break;
    317                 case DBGFADDRESS_FLAGS_RING0: pCur->enmReturnType = HC_ARCH_BITS == 64 ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32; break;
    318                 default:                      pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break; /// @todo 64-bit guests
     355                case DBGFADDRESS_FLAGS_RING0:
     356                    pCur->enmReturnType = HC_ARCH_BITS == 64 ? DBGFRETURNTYPE_NEAR64 : DBGFRETURNTYPE_NEAR32;
     357                    break;
     358                default:
     359                    pCur->enmReturnType = DBGFRETURNTYPE_NEAR32;
     360                    break; /// @todo 64-bit guests
    319361            }
    320362
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