Changeset 60560 in vbox
- Timestamp:
- Apr 19, 2016 3:06:42 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106689
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/dbgf.h
r59074 r60560 1244 1244 /** Set if the content of the frame is filled in by DBGFR3StackWalk() and can be used 1245 1245 * to construct the next frame. */ 1246 # define DBGFSTACKFRAME_FLAGS_ALL_VALID RT_BIT(0)1246 # define DBGFSTACKFRAME_FLAGS_ALL_VALID RT_BIT(0) 1247 1247 /** This is the last stack frame we can read. 1248 1248 * 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) 1250 1250 /** 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) 1252 1252 /** 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) 1254 1254 /** 16-bit frame. */ 1255 # define DBGFSTACKFRAME_FLAGS_16BIT RT_BIT(4)1255 # define DBGFSTACKFRAME_FLAGS_16BIT RT_BIT(4) 1256 1256 /** 32-bit frame. */ 1257 # define DBGFSTACKFRAME_FLAGS_32BIT RT_BIT(5)1257 # define DBGFSTACKFRAME_FLAGS_32BIT RT_BIT(5) 1258 1258 /** 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) 1260 1262 /** @} */ 1261 1263 -
trunk/src/VBox/VMM/VMMR3/DBGFStack.cpp
r57358 r60560 88 88 /* 89 89 * 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; 94 95 switch (AddrOldPC.fFlags & DBGFADDRESS_FLAGS_TYPE_MASK) 95 96 { … … 130 131 void *pv; 131 132 } u, uRet, uArgs, uBp; 132 size_t cbRead = cbRetAddr + cbStackItem + sizeof(pFrame->Args);133 size_t cbRead = cbRetAddr*2 + cbStackItem + sizeof(pFrame->Args); 133 134 u.pv = alloca(cbRead); 134 135 uBp = u; … … 185 186 default: AssertMsgFailedReturn(("cbStackItem=%d\n", cbStackItem), VERR_DBGF_STACK_IPE_1); 186 187 } 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 187 225 pFrame->AddrReturnFrame.FlatPtr += pFrame->AddrReturnFrame.off - pFrame->AddrFrame.off; 188 226 … … 315 353 case DBGFADDRESS_FLAGS_FAR32: pCur->enmReturnType = DBGFRETURNTYPE_NEAR32; break; 316 354 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 319 361 } 320 362
Note:
See TracChangeset
for help on using the changeset viewer.