Changeset 59073 in vbox
- Timestamp:
- Dec 10, 2015 12:48:03 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
-
include/VBox/err.h (modified) (1 diff)
-
include/VBox/err.mac (modified) (1 diff)
-
include/VBox/vmm/dbgf.h (modified) (2 diffs)
-
include/VBox/vmm/pgm.h (modified) (3 diffs)
-
src/VBox/VMM/VMMAll/DBGFAll.cpp (modified) (2 diffs)
-
src/VBox/VMM/VMMAll/IOMAllMMIO.cpp (modified) (1 diff)
-
src/VBox/VMM/VMMAll/PGMAllPhys.cpp (modified) (2 diffs)
-
src/VBox/VMM/VMMR0/HMVMXR0.cpp (modified) (2 diffs)
-
src/VBox/VMM/VMMR3/DBGF.cpp (modified) (1 diff)
-
src/VBox/VMM/VMMR3/EM.cpp (modified) (3 diffs)
-
src/VBox/VMM/include/EMHandleRCTmpl.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/err.h
r58658 r59073 118 118 * resolved there it will enter guru meditation. */ 119 119 #define VINF_EM_DBG_HYPER_ASSERTION 1103 120 /** Generic debug event, suspend the VM for debugging. */ 121 #define VINF_EM_DBG_EVENT 1104 120 122 /** Indicating that the VM should be suspended for debugging because 121 123 * the developer wants to inspect the VM state. */ -
trunk/include/VBox/err.mac
r56637 r59073 28 28 %define VINF_EM_DBG_HYPER_BREAKPOINT 1102 29 29 %define VINF_EM_DBG_HYPER_ASSERTION 1103 30 %define VINF_EM_DBG_EVENT 1104 30 31 %define VINF_EM_DBG_STOP 1105 31 32 %define VINF_EM_DBG_STEPPED 1106 -
trunk/include/VBox/vmm/dbgf.h
r59072 r59073 488 488 RTUINT iBp; 489 489 } Bp; 490 491 /** Generic debug event. */ 492 struct DBGFEVENTGENERIC 493 { 494 /** Argument. */ 495 uint64_t uArg; 496 } Generic; 497 490 498 /** Padding for ensuring that the structure is 8 byte aligned. */ 491 499 uint64_t au64Padding[4]; … … 832 840 VMM_INT_DECL(bool) DBGFIsStepping(PVMCPU pVCpu); 833 841 VMM_INT_DECL(VBOXSTRICTRC) DBGFBpCheckIo(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, RTIOPORT uIoPort, uint8_t cbValue); 834 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg); 842 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg, 843 DBGFEVENTCTX enmCtx); 835 844 836 845 -
trunk/include/VBox/vmm/pgm.h
r58126 r59073 526 526 ( (a_rcStrict) == VINF_SUCCESS \ 527 527 || (a_rcStrict) == VINF_EM_DBG_STOP \ 528 || (a_rcStrict) == VINF_EM_DBG_EVENT \ 528 529 || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \ 529 530 ) … … 536 537 || (a_rcStrict) == VINF_EM_HALT \ 537 538 || (a_rcStrict) == VINF_EM_DBG_STOP \ 539 || (a_rcStrict) == VINF_EM_DBG_EVENT \ 538 540 || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \ 539 541 ) … … 548 550 || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR_GDT_FAULT \ 549 551 || (a_rcStrict) == VINF_EM_DBG_STOP \ 552 || (a_rcStrict) == VINF_EM_DBG_EVENT \ 550 553 || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \ 551 554 ) -
trunk/src/VBox/VMM/VMMAll/DBGFAll.cpp
r58998 r59073 26 26 #include <VBox/err.h> 27 27 #include <iprt/assert.h> 28 #include <iprt/asm.h> 28 29 29 30 … … 262 263 263 264 264 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg) 265 { 265 /** 266 * Checks if the specified generic event is enabled or not. 267 * 268 * @returns true / false. 269 * @param pVM The cross context VM structure. 270 * @param enmEvent The generic event being raised. 271 * @param uEventArg The argument of that event. 272 */ 273 DECLINLINE(bool) dbgfEventIsGenericWithArgEnabled(PVM pVM, DBGFEVENTTYPE enmEvent, uint64_t uEventArg) 274 { 275 if (DBGF_IS_EVENT_ENABLED(pVM, enmEvent)) 276 { 277 switch (enmEvent) 278 { 279 case DBGFEVENT_INTERRUPT_HARDWARE: 280 AssertReturn(uEventArg < 256, false); 281 return ASMBitTest(pVM->dbgf.s.bmHardIntBreakpoints, (uint32_t)uEventArg); 282 283 case DBGFEVENT_INTERRUPT_SOFTWARE: 284 AssertReturn(uEventArg < 256, false); 285 return ASMBitTest(pVM->dbgf.s.bmSoftIntBreakpoints, (uint32_t)uEventArg); 286 287 default: 288 return true; 289 290 } 291 } 292 return false; 293 } 294 295 296 /** 297 * Raises a generic debug event if enabled and not being ignored. 298 * 299 * @returns Strict VBox status code. 300 * @retval VINF_EM_DBG_EVENT if the event was raised and the caller should 301 * return ASAP to the debugger (via EM). 302 * @retval VINF_SUCCESS if the event was disabled or ignored. 303 * 304 * @param pVM The cross context VM structure. 305 * @param pVCpu The cross context virtual CPU structure. 306 * @param enmEvent The generic event being raised. 307 * @param uEventArg The argument of that event. 308 * @param enmCtx The context in which this event is being raised. 309 * 310 * @thread EMT(pVCpu) 311 */ 312 VMM_INT_DECL(VBOXSTRICTRC) DBGFEventGenericWithArg(PVM pVM, PVMCPU pVCpu, DBGFEVENTTYPE enmEvent, uint64_t uEventArg, 313 DBGFEVENTCTX enmCtx) 314 { 315 /* 316 * Is it enabled. 317 */ 318 if (dbgfEventIsGenericWithArgEnabled(pVM, enmEvent, uEventArg)) 319 { 320 /* 321 * Any events on the stack. Should the incoming event be ignored? 322 */ 323 uint64_t const rip = CPUMGetGuestRIP(pVCpu); 324 uint32_t i = pVCpu->dbgf.s.cEvents; 325 if (i > 0) 326 { 327 while (i-- > 0) 328 { 329 if ( pVCpu->dbgf.s.aEvents[i].Event.enmType == enmEvent 330 && pVCpu->dbgf.s.aEvents[i].enmState == DBGFEVENTSTATE_IGNORE 331 && pVCpu->dbgf.s.aEvents[i].rip == rip) 332 { 333 pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_RESTORABLE; 334 return VINF_SUCCESS; 335 } 336 Assert(pVCpu->dbgf.s.aEvents[i].enmState != DBGFEVENTSTATE_CURRENT); 337 } 338 339 /* 340 * Trim the event stack. 341 */ 342 i = pVCpu->dbgf.s.cEvents; 343 while (i-- > 0) 344 { 345 if ( pVCpu->dbgf.s.aEvents[i].rip == rip 346 && ( pVCpu->dbgf.s.aEvents[i].enmState == DBGFEVENTSTATE_RESTORABLE 347 || pVCpu->dbgf.s.aEvents[i].enmState == DBGFEVENTSTATE_IGNORE) ) 348 pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_IGNORE; 349 else 350 { 351 if (i + 1 != pVCpu->dbgf.s.cEvents) 352 memmove(&pVCpu->dbgf.s.aEvents[i], &pVCpu->dbgf.s.aEvents[i + 1], 353 (pVCpu->dbgf.s.cEvents - i) * sizeof(pVCpu->dbgf.s.aEvents)); 354 pVCpu->dbgf.s.cEvents--; 355 } 356 } 357 358 i = pVCpu->dbgf.s.cEvents; 359 AssertStmt(i < RT_ELEMENTS(pVCpu->dbgf.s.aEvents), i = RT_ELEMENTS(pVCpu->dbgf.s.aEvents) - 1); 360 } 361 362 /* 363 * Push the event. 364 */ 365 pVCpu->dbgf.s.aEvents[i].enmState = DBGFEVENTSTATE_CURRENT; 366 pVCpu->dbgf.s.aEvents[i].rip = rip; 367 pVCpu->dbgf.s.aEvents[i].Event.enmType = enmEvent; 368 pVCpu->dbgf.s.aEvents[i].Event.enmCtx = enmCtx; 369 pVCpu->dbgf.s.aEvents[i].Event.u.Generic.uArg = uEventArg; 370 pVCpu->dbgf.s.cEvents = i + 1; 371 372 return VINF_EM_DBG_EVENT; 373 } 374 266 375 return VINF_SUCCESS; 267 376 } 268 377 269 -
trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
r58123 r59073 2029 2029 || rcStrict == VINF_IOM_R3_MMIO_READ_WRITE 2030 2030 || rcStrict == VINF_EM_DBG_STOP 2031 || rcStrict == VINF_EM_DBG_EVENT 2031 2032 || rcStrict == VINF_EM_DBG_BREAKPOINT 2032 2033 || rcStrict == VINF_EM_OFF -
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r58170 r59073 79 79 || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR \ 80 80 || (a_rcStrict) == VINF_EM_DBG_STOP \ 81 || (a_rcStrict) == VINF_EM_DBG_EVENT \ 81 82 || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \ 82 83 || (a_rcStrict) == VINF_EM_OFF \ … … 124 125 || (a_rcStrict) == VINF_EM_RAW_EMULATE_INSTR \ 125 126 || (a_rcStrict) == VINF_EM_DBG_STOP \ 127 || (a_rcStrict) == VINF_EM_DBG_EVENT \ 126 128 || (a_rcStrict) == VINF_EM_DBG_BREAKPOINT \ 127 129 ) -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r59004 r59073 9688 9688 && DBGF_IS_EVENT_ENABLED(pVM, enmEvent1)) 9689 9689 { 9690 VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg );9690 VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent1, uEventArg, DBGFEVENTCTX_HM); 9691 9691 if (rcStrict != VINF_SUCCESS) 9692 9692 return rcStrict; … … 9695 9695 && DBGF_IS_EVENT_ENABLED(pVM, enmEvent2)) 9696 9696 { 9697 VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg );9697 VBOXSTRICTRC rcStrict = DBGFEventGenericWithArg(pVM, pVCpu, enmEvent2, uEventArg, DBGFEVENTCTX_HM); 9698 9698 if (rcStrict != VINF_SUCCESS) 9699 9699 return rcStrict; -
trunk/src/VBox/VMM/VMMR3/DBGF.cpp
r58938 r59073 748 748 case VINF_EM_DBG_STEP: 749 749 case VINF_EM_DBG_STOP: 750 case VINF_EM_DBG_EVENT: 750 751 AssertMsgFailed(("rc=%Rrc\n", rc)); 751 752 break; -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r58123 r59073 850 850 break; 851 851 852 case VINF_EM_DBG_EVENT: 853 rc = DBGFR3EventHandlePending(pVM, pVCpu); 854 break; 855 852 856 case VINF_EM_DBG_HYPER_STEPPED: 853 857 rc = DBGFR3Event(pVM, DBGFEVENT_STEPPED_HYPER); … … 894 898 case VINF_EM_DBG_STEP: 895 899 case VINF_EM_DBG_STOP: 900 case VINF_EM_DBG_EVENT: 896 901 case VINF_EM_DBG_STEPPED: 897 902 case VINF_EM_DBG_BREAKPOINT: … … 2357 2362 case VINF_EM_DBG_STEPPED: 2358 2363 case VINF_EM_DBG_STOP: 2364 case VINF_EM_DBG_EVENT: 2359 2365 case VINF_EM_DBG_BREAKPOINT: 2360 2366 case VINF_EM_DBG_STEP: -
trunk/src/VBox/VMM/include/EMHandleRCTmpl.h
r58658 r59073 341 341 case VINF_EM_DBG_HYPER_ASSERTION: 342 342 case VINF_EM_DBG_STOP: 343 case VINF_EM_DBG_EVENT: 343 344 break; 344 345
Note:
See TracChangeset
for help on using the changeset viewer.

