Changeset 12822 in vbox
- Timestamp:
- Sep 30, 2008 7:50:05 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 37178
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMM.cpp
r12675 r12822 2512 2512 uEIP); 2513 2513 2514 /* 2515 * Try figure out where eip is. 2516 */ 2517 /** @todo make query call for core code or move this function to VMM. */ 2518 /* core code? */ 2519 //if (uEIP - (RTGCUINTPTR)pVM->vmm.s.pvGCCoreCode < pVM->vmm.s.cbCoreCode) 2520 // pHlp->pfnPrintf(pHlp, 2521 // "!! EIP is in CoreCode, offset %#x\n", 2522 // uEIP - (RTGCUINTPTR)pVM->vmm.s.pvGCCoreCode); 2523 //else 2524 { /* ask PDM */ 2525 /** @todo ask DBGFR3Sym later. */ 2526 char szModName[64]; 2527 RTGCPTR GCPtrMod; 2528 char szNearSym1[260]; 2529 RTGCPTR GCPtrNearSym1; 2530 char szNearSym2[260]; 2531 RTGCPTR GCPtrNearSym2; 2532 int rc = PDMR3QueryModFromEIP(pVM, uEIP, 2533 &szModName[0], sizeof(szModName), &GCPtrMod, 2534 &szNearSym1[0], sizeof(szNearSym1), &GCPtrNearSym1, 2535 &szNearSym2[0], sizeof(szNearSym2), &GCPtrNearSym2); 2536 if (VBOX_SUCCESS(rc)) 2514 /* The hypervisor dump is not relevant when we're in VT-x/AMD-V mode. */ 2515 if (!HWACCMR3IsActive(pVM)) 2516 { 2517 /* 2518 * Try figure out where eip is. 2519 */ 2520 /** @todo make query call for core code or move this function to VMM. */ 2521 /* core code? */ 2522 //if (uEIP - (RTGCUINTPTR)pVM->vmm.s.pvGCCoreCode < pVM->vmm.s.cbCoreCode) 2523 // pHlp->pfnPrintf(pHlp, 2524 // "!! EIP is in CoreCode, offset %#x\n", 2525 // uEIP - (RTGCUINTPTR)pVM->vmm.s.pvGCCoreCode); 2526 //else 2527 { /* ask PDM */ 2528 /** @todo ask DBGFR3Sym later. */ 2529 char szModName[64]; 2530 RTGCPTR GCPtrMod; 2531 char szNearSym1[260]; 2532 RTGCPTR GCPtrNearSym1; 2533 char szNearSym2[260]; 2534 RTGCPTR GCPtrNearSym2; 2535 int rc = PDMR3QueryModFromEIP(pVM, uEIP, 2536 &szModName[0], sizeof(szModName), &GCPtrMod, 2537 &szNearSym1[0], sizeof(szNearSym1), &GCPtrNearSym1, 2538 &szNearSym2[0], sizeof(szNearSym2), &GCPtrNearSym2); 2539 if (VBOX_SUCCESS(rc)) 2540 { 2541 pHlp->pfnPrintf(pHlp, 2542 "!! EIP in %s (%VGv) at rva %x near symbols:\n" 2543 "!! %VGv rva %VGv off %08x %s\n" 2544 "!! %VGv rva %VGv off -%08x %s\n", 2545 szModName, GCPtrMod, (unsigned)(uEIP - GCPtrMod), 2546 GCPtrNearSym1, GCPtrNearSym1 - GCPtrMod, (unsigned)(uEIP - GCPtrNearSym1), szNearSym1, 2547 GCPtrNearSym2, GCPtrNearSym2 - GCPtrMod, (unsigned)(GCPtrNearSym2 - uEIP), szNearSym2); 2548 } 2549 else 2550 pHlp->pfnPrintf(pHlp, 2551 "!! EIP is not in any code known to VMM!\n"); 2552 } 2553 2554 /* Disassemble the instruction. */ 2555 char szInstr[256]; 2556 rc2 = DBGFR3DisasInstrEx(pVM, 0, 0, DBGF_DISAS_FLAGS_CURRENT_HYPER, &szInstr[0], sizeof(szInstr), NULL); 2557 if (VBOX_SUCCESS(rc2)) 2558 pHlp->pfnPrintf(pHlp, 2559 "!! %s\n", szInstr); 2560 2561 /* Dump the hypervisor cpu state. */ 2562 pHlp->pfnPrintf(pHlp, 2563 "!!\n" 2564 "!!\n" 2565 "!!\n"); 2566 rc2 = DBGFR3Info(pVM, "cpumhyper", "verbose", pHlp); 2567 fDoneHyper = true; 2568 2569 /* Callstack. */ 2570 DBGFSTACKFRAME Frame = {0}; 2571 rc2 = DBGFR3StackWalkBeginHyper(pVM, &Frame); 2572 if (VBOX_SUCCESS(rc2)) 2537 2573 { 2538 2574 pHlp->pfnPrintf(pHlp, 2539 "!! EIP in %s (%VGv) at rva %x near symbols:\n" 2540 "!! %VGv rva %VGv off %08x %s\n" 2541 "!! %VGv rva %VGv off -%08x %s\n", 2542 szModName, GCPtrMod, (unsigned)(uEIP - GCPtrMod), 2543 GCPtrNearSym1, GCPtrNearSym1 - GCPtrMod, (unsigned)(uEIP - GCPtrNearSym1), szNearSym1, 2544 GCPtrNearSym2, GCPtrNearSym2 - GCPtrMod, (unsigned)(GCPtrNearSym2 - uEIP), szNearSym2); 2575 "!!\n" 2576 "!! Call Stack:\n" 2577 "!!\n" 2578 "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n"); 2579 do 2580 { 2581 pHlp->pfnPrintf(pHlp, 2582 "%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32", 2583 (uint32_t)Frame.AddrFrame.off, 2584 (uint32_t)Frame.AddrReturnFrame.off, 2585 (uint32_t)Frame.AddrReturnPC.Sel, 2586 (uint32_t)Frame.AddrReturnPC.off, 2587 Frame.Args.au32[0], 2588 Frame.Args.au32[1], 2589 Frame.Args.au32[2], 2590 Frame.Args.au32[3]); 2591 pHlp->pfnPrintf(pHlp, " %RTsel:%08RGv", Frame.AddrPC.Sel, Frame.AddrPC.off); 2592 if (Frame.pSymPC) 2593 { 2594 RTGCINTPTR offDisp = Frame.AddrPC.FlatPtr - Frame.pSymPC->Value; 2595 if (offDisp > 0) 2596 pHlp->pfnPrintf(pHlp, " %s+%llx", Frame.pSymPC->szName, (int64_t)offDisp); 2597 else if (offDisp < 0) 2598 pHlp->pfnPrintf(pHlp, " %s-%llx", Frame.pSymPC->szName, -(int64_t)offDisp); 2599 else 2600 pHlp->pfnPrintf(pHlp, " %s", Frame.pSymPC->szName); 2601 } 2602 if (Frame.pLinePC) 2603 pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", Frame.pLinePC->szFilename, Frame.pLinePC->uLineNo); 2604 pHlp->pfnPrintf(pHlp, "\n"); 2605 2606 /* next */ 2607 rc2 = DBGFR3StackWalkNext(pVM, &Frame); 2608 } while (VBOX_SUCCESS(rc2)); 2609 DBGFR3StackWalkEnd(pVM, &Frame); 2545 2610 } 2546 else 2547 pHlp->pfnPrintf(pHlp, 2548 "!! EIP is not in any code known to VMM!\n"); 2549 } 2550 2551 /* Disassemble the instruction. */ 2552 char szInstr[256]; 2553 rc2 = DBGFR3DisasInstrEx(pVM, 0, 0, DBGF_DISAS_FLAGS_CURRENT_HYPER, &szInstr[0], sizeof(szInstr), NULL); 2554 if (VBOX_SUCCESS(rc2)) 2555 pHlp->pfnPrintf(pHlp, 2556 "!! %s\n", szInstr); 2557 2558 /* Dump the hypervisor cpu state. */ 2559 pHlp->pfnPrintf(pHlp, 2560 "!!\n" 2561 "!!\n" 2562 "!!\n"); 2563 rc2 = DBGFR3Info(pVM, "cpumhyper", "verbose", pHlp); 2564 fDoneHyper = true; 2565 2566 /* Callstack. */ 2567 DBGFSTACKFRAME Frame = {0}; 2568 rc2 = DBGFR3StackWalkBeginHyper(pVM, &Frame); 2569 if (VBOX_SUCCESS(rc2)) 2570 { 2611 2612 /* raw stack */ 2571 2613 pHlp->pfnPrintf(pHlp, 2572 2614 "!!\n" 2573 "!! Call Stack:\n"2615 "!! Raw stack (mind the direction).\n" 2574 2616 "!!\n" 2575 "EBP Ret EBP Ret CS:EIP Arg0 Arg1 Arg2 Arg3 CS:EIP Symbol [line]\n"); 2576 do 2577 { 2578 pHlp->pfnPrintf(pHlp, 2579 "%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32", 2580 (uint32_t)Frame.AddrFrame.off, 2581 (uint32_t)Frame.AddrReturnFrame.off, 2582 (uint32_t)Frame.AddrReturnPC.Sel, 2583 (uint32_t)Frame.AddrReturnPC.off, 2584 Frame.Args.au32[0], 2585 Frame.Args.au32[1], 2586 Frame.Args.au32[2], 2587 Frame.Args.au32[3]); 2588 pHlp->pfnPrintf(pHlp, " %RTsel:%08RGv", Frame.AddrPC.Sel, Frame.AddrPC.off); 2589 if (Frame.pSymPC) 2590 { 2591 RTGCINTPTR offDisp = Frame.AddrPC.FlatPtr - Frame.pSymPC->Value; 2592 if (offDisp > 0) 2593 pHlp->pfnPrintf(pHlp, " %s+%llx", Frame.pSymPC->szName, (int64_t)offDisp); 2594 else if (offDisp < 0) 2595 pHlp->pfnPrintf(pHlp, " %s-%llx", Frame.pSymPC->szName, -(int64_t)offDisp); 2596 else 2597 pHlp->pfnPrintf(pHlp, " %s", Frame.pSymPC->szName); 2598 } 2599 if (Frame.pLinePC) 2600 pHlp->pfnPrintf(pHlp, " [%s @ 0i%d]", Frame.pLinePC->szFilename, Frame.pLinePC->uLineNo); 2601 pHlp->pfnPrintf(pHlp, "\n"); 2602 2603 /* next */ 2604 rc2 = DBGFR3StackWalkNext(pVM, &Frame); 2605 } while (VBOX_SUCCESS(rc2)); 2606 DBGFR3StackWalkEnd(pVM, &Frame); 2607 } 2608 2609 /* raw stack */ 2610 pHlp->pfnPrintf(pHlp, 2611 "!!\n" 2612 "!! Raw stack (mind the direction).\n" 2613 "!!\n" 2614 "%.*Vhxd\n", 2615 VMM_STACK_SIZE, (char *)pVM->vmm.s.pbHCStack); 2617 "%.*Vhxd\n", 2618 VMM_STACK_SIZE, (char *)pVM->vmm.s.pbHCStack); 2619 } 2616 2620 break; 2617 2621 } -
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r12795 r12822 476 476 if (CPUMIsGuestInRealModeEx(pCtx)) 477 477 { 478 /* Injecting events doe ns't work right with real mode emulation.478 /* Injecting events doesn't work right with real mode emulation. 479 479 * (#GP if we try to inject external hardware interrupts) 480 480 * Fake an 'int x' instruction. Note that we need to take special precautions when
Note:
See TracChangeset
for help on using the changeset viewer.