Changeset 3145 in vbox
- Timestamp:
- Jun 18, 2007 3:31:09 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/iom.h
r2981 r3145 40 40 */ 41 41 #define IOM_NO_PDMINS_CHECKS 42 43 /** 44 * Macro for checking if an I/O or MMIO emulation call succeeded. 45 * 46 * This macro shall only be used with the IOM APIs where it's mentioned 47 * in the return value description. And there is must be used to correctly 48 * determin if the call succeeded and things like the EIP needs updating. 49 * 50 * 51 * @returns Success indicator (true/false). 52 * 53 * @param rc The status code. This may be evaluated 54 * more than once! 55 * 56 * @remark To avoid making assumptions about the layout of the 57 * VINF_EM_FIRST...VINF_EM_LAST range we're checking 58 * explicitly for each for exach the exceptions. 59 * However, for efficieny we ASSUME that the 60 * VINF_EM_LAST is smaller than most of the relevant 61 * status codes. We also ASSUME that the 62 * VINF_EM_RESCHEDULE_REM status code is the most 63 * frequent status code we'll enounter in this range. 64 * 65 * @todo Will have to add VINF_EM_DBG_HYPER_BREAKPOINT if the 66 * I/O port and MMIO breakpoints should trigger before 67 * the I/O is done. Currently, we don't implement these 68 * kind of breakpoints. 69 */ 70 #define IOM_SUCCESS(rc) ( (rc) == VINF_SUCCESS \ 71 || ( (rc) <= VINF_EM_LAST \ 72 && (rc) != VINF_EM_RESCHEDULE_REM \ 73 && (rc) >= VINF_EM_FIRST \ 74 && (rc) != VINF_EM_RESCHEDULE_RAW \ 75 && (rc) != VINF_EM_RESCHEDULE_HWACC \ 76 ) \ 77 ) 42 78 43 79 … … 263 299 * 264 300 * @returns Strict VBox status code. Informational status codes other than the one documented 265 * here are to be treated as internal failure. 266 * @retval VINF_SUCCESS Success. 267 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 301 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 302 * @retval VINF_SUCCESS Success. 303 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 304 * status code must be passed on to EM. 268 305 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 269 306 * … … 279 316 * 280 317 * @returns Strict VBox status code. Informational status codes other than the one documented 281 * here are to be treated as internal failure. 282 * @retval VINF_SUCCESS Success. 283 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 318 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 319 * @retval VINF_SUCCESS Success. 320 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 321 * status code must be passed on to EM. 284 322 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 285 323 * … … 295 333 * 296 334 * @returns Strict VBox status code. Informational status codes other than the one documented 297 * here are to be treated as internal failure. 298 * @retval VINF_SUCCESS Success. 299 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 335 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 336 * @retval VINF_SUCCESS Success. 337 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 338 * status code must be passed on to EM. 300 339 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 301 340 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 313 352 * 314 353 * @returns Strict VBox status code. Informational status codes other than the one documented 315 * here are to be treated as internal failure. 316 * @retval VINF_SUCCESS Success. 317 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 354 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 355 * @retval VINF_SUCCESS Success. 356 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 357 * status code must be passed on to EM. 318 358 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 319 359 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 332 372 * 333 373 * @returns Strict VBox status code. Informational status codes other than the one documented 334 * here are to be treated as internal failure. 335 * @retval VINF_SUCCESS Success. 336 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 374 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 375 * @retval VINF_SUCCESS Success. 376 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 377 * status code must be passed on to EM. 337 378 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 338 379 * … … 367 408 * 368 409 * @returns Strict VBox status code. Informational status codes other than the one documented 410 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 411 * @retval VINF_SUCCESS Success. 412 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 413 * status code must be passed on to EM. 414 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 415 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) 416 * @retval VINF_TRPM_XCPT_DISPATCHED The exception was raised and dispatched for raw-mode execution. (TRPMRaiseXcptErr) 417 * @retval VINF_EM_RESCHEDULE_REM The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr) 418 * 419 * @param pVM The virtual machine (GC pointer ofcourse). 420 * @param pRegFrame Pointer to CPUMCTXCORE guest registers structure. 421 * @param pCpu Disassembler CPU state. 422 */ 423 IOMDECL(int) IOMInterpretINS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu); 424 425 /** 426 * [REP*] INSB/INSW/INSD 427 * ES:EDI,DX[,ECX] 428 * 429 * @remark Assumes caller checked the access privileges (IOMInterpretCheckPortIOAccess) 430 * 431 * @returns Strict VBox status code. Informational status codes other than the one documented 369 432 * here are to be treated as internal failure. 370 433 * @retval VINF_SUCCESS Success. … … 375 438 * @retval VINF_EM_RESCHEDULE_REM The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr) 376 439 * 377 * @param pVM The virtual machine (GC pointer ofcourse).378 * @param pRegFrame Pointer to CPUMCTXCORE guest registers structure.379 * @param pCpu Disassembler CPU state.380 */381 IOMDECL(int) IOMInterpretINS(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu);382 383 /**384 * [REP*] INSB/INSW/INSD385 * ES:EDI,DX[,ECX]386 *387 * @remark Assumes caller checked the access privileges (IOMInterpretCheckPortIOAccess)388 *389 * @returns Strict VBox status code. Informational status codes other than the one documented390 * here are to be treated as internal failure.391 * @retval VINF_SUCCESS Success.392 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM.393 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only)394 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr)395 * @retval VINF_TRPM_XCPT_DISPATCHED The exception was raised and dispatched for raw-mode execution. (TRPMRaiseXcptErr)396 * @retval VINF_EM_RESCHEDULE_REM The exception was dispatched and cannot be executed in raw-mode. (TRPMRaiseXcptErr)397 *398 440 * @param pVM The virtual machine (GC pointer ofcourse). 399 441 * @param pRegFrame Pointer to CPUMCTXCORE guest registers structure. … … 409 451 * 410 452 * @returns Strict VBox status code. Informational status codes other than the one documented 411 * here are to be treated as internal failure. 412 * @retval VINF_SUCCESS Success. 413 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 453 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 454 * @retval VINF_SUCCESS Success. 455 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 456 * status code must be passed on to EM. 414 457 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 415 458 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 430 473 * 431 474 * @returns Strict VBox status code. Informational status codes other than the one documented 432 * here are to be treated as internal failure. 433 * @retval VINF_SUCCESS Success. 434 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 475 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 476 * @retval VINF_SUCCESS Success. 477 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 478 * status code must be passed on to EM. 435 479 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 436 480 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 510 554 * 511 555 * @returns Strict VBox status code. Informational status codes other than the one documented 512 * here are to be treated as internal failure. 513 * @retval VINF_SUCCESS Success. 514 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 556 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 557 * @retval VINF_SUCCESS Success. 558 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 559 * status code must be passed on to EM. 515 560 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 516 561 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) -
trunk/src/VBox/VMM/EM.cpp
r2981 r3145 1321 1321 * (The unhandled cases end up with rc == VINF_EM_RESCHEDULE_REM.) 1322 1322 */ 1323 if (rc == VINF_EM_RESCHEDULE_REM) 1324 { 1325 /* emulate this instruction only */ 1326 goto emulate_instr; 1327 } 1328 1329 if ( rc == VINF_SUCCESS 1330 || (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST)) 1323 if (IOM_SUCCESS(rc)) 1331 1324 { 1332 1325 pCtx->eip += Cpu.opsize; … … 1342 1335 } 1343 1336 AssertMsg(rc != VINF_TRPM_XCPT_DISPATCHED, ("Handle VINF_TRPM_XCPT_DISPATCHED\n")); 1337 1344 1338 if (VBOX_FAILURE(rc)) 1345 1339 { … … 1349 1343 AssertMsg(rc == VINF_EM_RESCHEDULE_REM, ("rc=%Vrc\n", rc)); 1350 1344 } 1351 emulate_instr:1352 1345 STAM_PROFILE_STOP(&pVM->em.s.StatIOEmu, a); 1353 1346 return emR3RawExecuteInstruction(pVM, "IO: "); -
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r2981 r3145 273 273 #ifdef IN_GC 274 274 int rc = IOMGCIOPortHandler(pVM, pCtxCore, pCpu); 275 if ( rc == VINF_SUCCESS 276 || (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST)) 275 if (IOM_SUCCESS(rc)) 277 276 pCtxCore->eip += cbOp; 278 277 return rc; -
trunk/src/VBox/VMM/VMMAll/IOMAll.cpp
r2981 r3145 720 720 * 721 721 * @returns Strict VBox status code. Informational status codes other than the one documented 722 * here are to be treated as internal failure. 722 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 723 723 * @retval VINF_SUCCESS Success. 724 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 724 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 725 * status code must be passed on to EM. 725 726 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 726 727 * … … 862 863 * 863 864 * @returns Strict VBox status code. Informational status codes other than the one documented 864 * here are to be treated as internal failure. 865 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 865 866 * @retval VINF_SUCCESS Success. 866 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 867 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 868 * status code must be passed on to EM. 867 869 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 868 870 * … … 987 989 * 988 990 * @returns Strict VBox status code. Informational status codes other than the one documented 989 * here are to be treated as internal failure. 991 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 990 992 * @retval VINF_SUCCESS Success. 991 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 993 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 994 * status code must be passed on to EM. 992 995 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 993 996 * … … 1107 1110 * 1108 1111 * @returns Strict VBox status code. Informational status codes other than the one documented 1109 * here are to be treated as internal failure. 1112 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1110 1113 * @retval VINF_SUCCESS Success. 1111 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1114 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1115 * status code must be passed on to EM. 1112 1116 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 1113 1117 * … … 1327 1331 * 1328 1332 * @returns Strict VBox status code. Informational status codes other than the one documented 1329 * here are to be treated as internal failure. 1333 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1330 1334 * @retval VINF_SUCCESS Success. 1331 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1335 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1336 * status code must be passed on to EM. 1332 1337 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 1333 1338 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 1364 1369 uint32_t u32Data = ~0U; 1365 1370 rc = IOMIOPortRead(pVM, uPort, &u32Data, cbSize); 1366 if ( rc == VINF_SUCCESS 1367 || (rc >= VINF_EM_FIRST && rc <= VINF_EM_LAST)) 1371 if (IOM_SUCCESS(rc)) 1368 1372 { 1369 1373 /* … … 1386 1390 * 1387 1391 * @returns Strict VBox status code. Informational status codes other than the one documented 1388 * here are to be treated as internal failure. 1392 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1389 1393 * @retval VINF_SUCCESS Success. 1390 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1394 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1395 * status code must be passed on to EM. 1391 1396 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 1392 1397 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) -
trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
r2981 r3145 1592 1592 * 1593 1593 * @returns Strict VBox status code. Informational status codes other than the one documented 1594 * here are to be treated as internal failure. 1594 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1595 1595 * @retval VINF_SUCCESS Success. 1596 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1596 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1597 * status code must be passed on to EM. 1597 1598 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 1598 1599 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 1677 1678 uint32_t u32Value; 1678 1679 rc = IOMIOPortRead(pVM, uPort, &u32Value, cbTransfer); 1679 if ( rc == VINF_IOM_HC_IOPORT_READ || VBOX_FAILURE(rc))1680 if (!IOM_SUCCESS(rc)) 1680 1681 break; 1681 1682 int rc2 = iomRamWrite(pVM, GCPtrDst, &u32Value, cbTransfer); … … 1703 1704 * 1704 1705 * @returns Strict VBox status code. Informational status codes other than the one documented 1705 * here are to be treated as internal failure. 1706 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1706 1707 * @retval VINF_SUCCESS Success. 1707 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1708 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1709 * status code must be passed on to EM. 1708 1710 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 1709 1711 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 1746 1748 * 1747 1749 * @returns Strict VBox status code. Informational status codes other than the one documented 1748 * here are to be treated as internal failure. 1750 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1749 1751 * @retval VINF_SUCCESS Success. 1750 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1752 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1753 * status code must be passed on to EM. 1751 1754 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 1752 1755 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) … … 1834 1837 break; 1835 1838 rc = IOMIOPortWrite(pVM, uPort, u32Value, cbTransfer); 1836 if ( rc == VINF_IOM_HC_IOPORT_WRITE || VBOX_FAILURE(rc))1839 if (!IOM_SUCCESS(rc)) 1837 1840 break; 1838 1841 GCPtrSrc = (RTGCPTR)((RTUINTPTR)GCPtrSrc + cbTransfer); … … 1859 1862 * 1860 1863 * @returns Strict VBox status code. Informational status codes other than the one documented 1861 * here are to be treated as internal failure. 1864 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 1862 1865 * @retval VINF_SUCCESS Success. 1863 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 1866 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 1867 * status code must be passed on to EM. 1864 1868 * @retval VINF_IOM_HC_IOPORT_WRITE Defer the write to ring-3. (R0/GC only) 1865 1869 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr) -
trunk/src/VBox/VMM/VMMGC/IOMGC.cpp
r2981 r3145 54 54 * 55 55 * @returns Strict VBox status code. Informational status codes other than the one documented 56 * here are to be treated as internal failure. 56 * here are to be treated as internal failure. Use IOM_SUCCESS() to check for success. 57 57 * @retval VINF_SUCCESS Success. 58 * @retval VINF_EM_FIRST-VINF_EM_LAST Success but schedulinging information needs to be passed onto EM. 58 * @retval VINF_EM_FIRST-VINF_EM_LAST Success with some exceptions (see IOM_SUCCESS()), the 59 * status code must be passed on to EM. 59 60 * @retval VINF_IOM_HC_IOPORT_READ Defer the read to ring-3. (R0/GC only) 60 61 * @retval VINF_EM_RAW_GUEST_TRAP The exception was left pending. (TRPMRaiseXcptErr)
Note:
See TracChangeset
for help on using the changeset viewer.