Changeset 106427 in vbox for trunk/src/VBox
- Timestamp:
- Oct 17, 2024 10:59:12 AM (6 weeks ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.h
r106191 r106427 387 387 #define IEM_MC_IND_CALL_U64_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_u32NewRIP, a_cbInstr) do { IEM_LIVENESS_PC64_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 388 388 389 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_ i16, a_cbInstr)do { IEM_LIVENESS_PC16_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0)390 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_ i16, a_cbInstr, a_enmEffOpSize)do { IEM_LIVENESS_PC32_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0)391 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_ i16, a_cbInstr, a_enmEffOpSize)do { IEM_LIVENESS_PC64_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0)392 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_ i16, a_cbInstr)do { IEM_LIVENESS_PC16_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0)393 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_ i16, a_cbInstr, a_enmEffOpSize)do { IEM_LIVENESS_PC32_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0)394 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_ i16, a_cbInstr, a_enmEffOpSize)do { IEM_LIVENESS_PC64_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0)389 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_cbPopArgs, a_cbInstr) do { IEM_LIVENESS_PC16_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 390 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) do { IEM_LIVENESS_PC32_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 391 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) do { IEM_LIVENESS_PC64_JMP_NO_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 392 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_cbPopArgs, a_cbInstr) do { IEM_LIVENESS_PC16_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 393 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) do { IEM_LIVENESS_PC32_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 394 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) do { IEM_LIVENESS_PC64_JMP_WITH_FLAGS(); IEM_LIVENESS_STACK(); } while (0) 395 395 396 396 /* Effective address stuff is rather complicated... */ -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h
r106423 r106427 2277 2277 2278 2278 /** Variant of IEM_MC_RETN_AND_FINISH for pre-386 targets. */ 2279 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_ u16Pop, a_cbInstr) \2280 off = iemNativeEmitRetn (pReNative, off, (a_cbInstr), (a_u16Pop), false /*f64Bit*/, IEMMODE_16BIT, pCallEntry->idxInstr)2279 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_cbPopArgs, a_cbInstr) \ 2280 off = iemNativeEmitRetn<IEMMODE_16BIT, false>(pReNative, off, (a_cbInstr), (a_cbPopArgs), pCallEntry->idxInstr) 2281 2281 2282 2282 /** Variant of IEM_MC_RETN_AND_FINISH for 386+ targets. */ 2283 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_u16Pop, a_cbInstr, a_enmEffOpSize) \ 2284 off = iemNativeEmitRetn(pReNative, off, (a_cbInstr), (a_u16Pop), false /*f64Bit*/, (a_enmEffOpSize), pCallEntry->idxInstr) 2283 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 2284 Assert((a_enmEffOpSize) == IEMMODE_32BIT || (a_enmEffOpSize) == IEMMODE_16BIT); \ 2285 off = (a_enmEffOpSize) == IEMMODE_32BIT \ 2286 ? iemNativeEmitRetn<IEMMODE_32BIT, false>(pReNative, off, (a_cbInstr), (a_cbPopArgs), pCallEntry->idxInstr) \ 2287 : iemNativeEmitRetn<IEMMODE_16BIT, false>(pReNative, off, (a_cbInstr), (a_cbPopArgs), pCallEntry->idxInstr) 2285 2288 2286 2289 /** Variant of IEM_MC_RETN_AND_FINISH for use in 64-bit code. */ 2287 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_u16Pop, a_cbInstr, a_enmEffOpSize) \ 2288 off = iemNativeEmitRetn(pReNative, off, (a_cbInstr), (a_u16Pop), true /*f64Bit*/, (a_enmEffOpSize), pCallEntry->idxInstr) 2290 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 2291 Assert((a_enmEffOpSize) == IEMMODE_64BIT || (a_enmEffOpSize) == IEMMODE_16BIT); \ 2292 off = (a_enmEffOpSize) == IEMMODE_64BIT \ 2293 ? iemNativeEmitRetn<IEMMODE_64BIT, true>(pReNative, off, (a_cbInstr), (a_cbPopArgs), pCallEntry->idxInstr) \ 2294 : iemNativeEmitRetn<IEMMODE_16BIT, true>(pReNative, off, (a_cbInstr), (a_cbPopArgs), pCallEntry->idxInstr) 2289 2295 2290 2296 /** Variant of IEM_MC_RETN_AND_FINISH for pre-386 targets that checks and 2291 2297 * clears flags. */ 2292 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_ u16Pop, a_cbInstr) \2293 IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_ u16Pop, a_cbInstr); \2298 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_cbPopArgs, a_cbInstr) \ 2299 IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_cbPopArgs, a_cbInstr); \ 2294 2300 off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off) 2295 2301 2296 2302 /** Variant of IEM_MC_RETN_AND_FINISH for 386+ targets that checks and 2297 2303 * clears flags. */ 2298 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \2299 IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_ u16Pop, a_cbInstr, a_enmEffOpSize); \2304 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 2305 IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_cbPopArgs, a_cbInstr, a_enmEffOpSize); \ 2300 2306 off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off) 2301 2307 2302 2308 /** Variant of IEM_MC_RETN_AND_FINISH for use in 64-bit code that checks and 2303 2309 * clears flags. */ 2304 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \2305 IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_ u16Pop, a_cbInstr, a_enmEffOpSize); \2310 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 2311 IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_cbPopArgs, a_cbInstr, a_enmEffOpSize); \ 2306 2312 off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off) 2307 2313 2308 2314 /** IEM_MC[|_FLAT32|_FLAT64]_RETN_AND_FINISH */ 2309 DECL_INLINE_THROW(uint32_t) 2310 iemNativeEmitRetn(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t cbInstr, uint16_t cbPop, bool f64Bit, 2311 IEMMODE enmEffOpSize, uint8_t idxInstr)2315 template<IEMMODE const a_enmEffOpSize, bool const a_f64Bit> 2316 DECL_INLINE_THROW(uint32_t) 2317 iemNativeEmitRetn(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t cbInstr, uint16_t cbPopArgs, uint8_t idxInstr) 2312 2318 { 2313 2319 RT_NOREF(cbInstr); 2320 AssertCompile(a_enmEffOpSize == IEMMODE_64BIT || a_enmEffOpSize == IEMMODE_32BIT || a_enmEffOpSize == IEMMODE_16BIT); 2314 2321 2315 2322 #ifdef VBOX_STRICT … … 2330 2337 * For FLAT modes we'll do this in TlbDone as we'll be using the incoming RSP 2331 2338 * directly as the effective stack pointer. 2339 * 2332 2340 * (Code structure is very similar to that of PUSH) 2333 2341 * … … 2336 2344 * aren't commonly used (or useful) and thus not in need of optimizing. 2337 2345 * 2338 * Note! For non flat modes the guest RSP is not allocated for update but rather for calculation 2339 * as the shadowed register would remain modified even if the return address throws a \#GP(0) 2340 * due to being outside the CS limit causing a wrong stack pointer value in the guest (see 2341 * the near return testcase in bs3-cpu-basic-2). If no exception is thrown the shadowing is transfered 2342 * to the new register returned by iemNativeRegAllocTmpForGuestReg() at the end. 2346 * Note! For non-flat modes the guest RSP is not allocated for update but 2347 * rather for calculation as the shadowed register would remain modified 2348 * even if the return address throws a #GP(0) due to being outside the 2349 * CS limit causing a wrong stack pointer value in the guest (see the 2350 * near return testcase in bs3-cpu-basic-2). If no exception is thrown 2351 * the shadowing is transfered to the new register returned by 2352 * iemNativeRegAllocTmpForGuestReg() at the end. 2343 2353 */ 2344 uint8_t const cbMem = enmEffOpSize == IEMMODE_64BIT 2354 RT_CONSTEXPR 2355 uint8_t const cbMem = a_enmEffOpSize == IEMMODE_64BIT 2345 2356 ? sizeof(uint64_t) 2346 : enmEffOpSize == IEMMODE_32BIT2357 : a_enmEffOpSize == IEMMODE_32BIT 2347 2358 ? sizeof(uint32_t) 2348 2359 : sizeof(uint16_t); 2349 bool const fFlat = IEM_F_MODE_X86_IS_FLAT(pReNative->fExec) && enmEffOpSize != IEMMODE_16BIT; /* see note */ 2360 /** @todo the basic flatness should be detected by the threaded compiler step 2361 * like for the other macros... */ 2362 bool const fFlat = IEM_F_MODE_X86_IS_FLAT(pReNative->fExec) && a_enmEffOpSize != IEMMODE_16BIT; /* see note */ 2350 2363 uintptr_t const pfnFunction = fFlat 2351 ? enmEffOpSize == IEMMODE_64BIT2364 ? a_enmEffOpSize == IEMMODE_64BIT 2352 2365 ? (uintptr_t)iemNativeHlpStackFlatFetchU64 2353 2366 : (uintptr_t)iemNativeHlpStackFlatFetchU32 2354 : enmEffOpSize == IEMMODE_32BIT2367 : a_enmEffOpSize == IEMMODE_32BIT 2355 2368 ? (uintptr_t)iemNativeHlpStackFetchU32 2356 2369 : (uintptr_t)iemNativeHlpStackFetchU16; … … 2380 2393 iemNativeRegFreeTmp(pReNative, idxRegSsAttr); 2381 2394 offFixupJumpToUseOtherBitSp = off; 2382 if (enmEffOpSize == IEMMODE_32BIT)2395 if RT_CONSTEXPR_IF(a_enmEffOpSize == IEMMODE_32BIT) 2383 2396 { 2384 2397 off = iemNativeEmitJccToFixedEx(pCodeBuf, off, off /*8-bit suffices*/, kIemNativeInstrCond_e); /* jump if zero */ 2385 off = iemNativeEmitStackPopForRetnUse32Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPop );2398 off = iemNativeEmitStackPopForRetnUse32Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPopArgs); 2386 2399 } 2387 2400 else 2388 2401 { 2389 Assert( enmEffOpSize == IEMMODE_16BIT);2402 Assert(a_enmEffOpSize == IEMMODE_16BIT); 2390 2403 off = iemNativeEmitJccToFixedEx(pCodeBuf, off, off /*8-bit suffices*/, kIemNativeInstrCond_ne); /* jump if not zero */ 2391 off = iemNativeEmitStackPopForRetnUse16Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPop ,2404 off = iemNativeEmitStackPopForRetnUse16Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPopArgs, 2392 2405 idxRegMemResult); 2393 2406 } … … 2426 2439 iemNativeFixupFixedJump(pReNative, offFixupJumpToUseOtherBitSp, off); 2427 2440 if ((pReNative->fExec & IEM_F_MODE_CPUMODE_MASK) == IEMMODE_32BIT) 2428 off = iemNativeEmitStackPopForRetnUse16Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPop ,2441 off = iemNativeEmitStackPopForRetnUse16Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPopArgs, 2429 2442 idxRegMemResult); 2430 2443 else 2431 off = iemNativeEmitStackPopForRetnUse32Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPop );2444 off = iemNativeEmitStackPopForRetnUse32Sp(pCodeBuf, off, idxRegRsp, idxRegEffSp, cbMem, cbPopArgs); 2432 2445 off = iemNativeEmitJmpToFixedEx(pCodeBuf, off, offLabelSpUpdateEnd); 2433 2446 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); … … 2525 2538 2526 2539 /* Check limit before committing RIP and RSP (may #GP(0) + exit TB). */ 2527 if (!f64Bit)2540 if RT_CONSTEXPR_IF(!a_f64Bit) 2528 2541 /** @todo we can skip this test in FLAT 32-bit mode. */ 2529 2542 off = iemNativeEmitCheckGpr32AgainstCsSegLimitMaybeRaiseGp0(pReNative, off, idxRegMemResult, idxInstr); 2530 2543 /* Check that the address is canonical, raising #GP(0) + exit TB if it isn't. */ 2531 else if (enmEffOpSize == IEMMODE_64BIT)2544 else if RT_CONSTEXPR_IF(a_enmEffOpSize == IEMMODE_64BIT) 2532 2545 off = iemNativeEmitCheckGprCanonicalMaybeRaiseGp0(pReNative, off, idxRegMemResult, idxInstr); 2533 2546 … … 2535 2548 if (idxRegEffSp == idxRegRsp) 2536 2549 { 2537 if (enmEffOpSize == IEMMODE_64BIT)2538 off = iemNativeEmitAddGprImm(pReNative, off, idxRegRsp, sizeof(uint64_t) + cbPop );2550 if RT_CONSTEXPR_IF(a_enmEffOpSize == IEMMODE_64BIT) 2551 off = iemNativeEmitAddGprImm(pReNative, off, idxRegRsp, sizeof(uint64_t) + cbPopArgs); 2539 2552 else 2540 2553 { 2541 Assert( enmEffOpSize == IEMMODE_32BIT);2542 off = iemNativeEmitAddGpr32Imm(pReNative, off, idxRegRsp, sizeof(uint32_t) + cbPop );2554 Assert(a_enmEffOpSize == IEMMODE_32BIT); 2555 off = iemNativeEmitAddGpr32Imm(pReNative, off, idxRegRsp, sizeof(uint32_t) + cbPopArgs); 2543 2556 } 2544 2557 } -
trunk/src/VBox/VMM/VMMAll/IEMAllThrdFuncs.cpp
r106061 r106427 523 523 524 524 /** Variant of IEM_MC_RETN_AND_FINISH for pre-386 targets. */ 525 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_ u16Pop, a_cbInstr) \526 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_ u16Pop), IEMMODE_16BIT)525 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16(a_cbPopArgs, a_cbInstr) \ 526 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_cbPopArgs), IEMMODE_16BIT) 527 527 528 528 /** Variant of IEM_MC_RETN_AND_FINISH for 386+ targets. */ 529 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \530 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_ u16Pop), (a_enmEffOpSize))529 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 530 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_cbPopArgs), (a_enmEffOpSize)) 531 531 532 532 /** Variant of IEM_MC_RETN_AND_FINISH for use in 64-bit code. */ 533 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \534 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_ u16Pop), (a_enmEffOpSize))533 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 534 return iemRegRipNearReturnAndFinishNoFlags((pVCpu), a_cbInstr, (a_cbPopArgs), (a_enmEffOpSize)) 535 535 536 536 /** Variant of IEM_MC_RETN_AND_FINISH for pre-386 targets that checks and 537 537 * clears flags. */ 538 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_ u16Pop, a_cbInstr) \539 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_ u16Pop), IEMMODE_16BIT)538 #define IEM_MC_RETN_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_cbPopArgs, a_cbInstr) \ 539 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_cbPopArgs), IEMMODE_16BIT) 540 540 541 541 /** Variant of IEM_MC_RETN_AND_FINISH for 386+ targets that checks and 542 542 * clears flags. */ 543 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \544 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_ u16Pop), (a_enmEffOpSize))543 #define IEM_MC_RETN_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 544 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_cbPopArgs), (a_enmEffOpSize)) 545 545 546 546 /** Variant of IEM_MC_RETN_AND_FINISH for use in 64-bit code that checks and 547 547 * clears flags. */ 548 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_ u16Pop, a_cbInstr, a_enmEffOpSize) \549 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_ u16Pop), (a_enmEffOpSize))548 #define IEM_MC_RETN_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_cbPopArgs, a_cbInstr, a_enmEffOpSize) \ 549 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), a_cbInstr, (a_cbPopArgs), (a_enmEffOpSize)) 550 550 551 551 #undef IEM_MC_RETN_AND_FINISH -
trunk/src/VBox/VMM/include/IEMMc.h
r106179 r106427 105 105 /** Fetches the near return address from the stack, sets RIP and RSP (may trigger 106 106 * \#GP or \#SS), finishes the instruction and returns. */ 107 #define IEM_MC_RETN_AND_FINISH(a_ u16Pop) \108 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), IEM_GET_INSTR_LEN(pVCpu), (a_ u16Pop), pVCpu->iem.s.enmEffOpSize)107 #define IEM_MC_RETN_AND_FINISH(a_cbPopArgs) \ 108 return iemRegRipNearReturnAndFinishClearingRF((pVCpu), IEM_GET_INSTR_LEN(pVCpu), (a_cbPopArgs), pVCpu->iem.s.enmEffOpSize) 109 109 110 110 -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r106179 r106427 617 617 #define IEM_MC_IND_CALL_U32_AND_FINISH(a_u32NewIP) do { (void)fMcBegin; CHK_TYPE(uint32_t, a_u32NewIP); return VINF_SUCCESS; } while (0) 618 618 #define IEM_MC_IND_CALL_U64_AND_FINISH(a_u64NewIP) do { (void)fMcBegin; CHK_TYPE(uint64_t, a_u64NewIP); return VINF_SUCCESS; } while (0) 619 #define IEM_MC_RETN_AND_FINISH(a_ u16Pop)do { (void)fMcBegin; return VINF_SUCCESS; } while (0)619 #define IEM_MC_RETN_AND_FINISH(a_cbPopArgs) do { (void)fMcBegin; return VINF_SUCCESS; } while (0) 620 620 #define IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(a_uVar) do { (void)fMcBegin; CHK_VAR(a_uVar); if (a_uVar == 0) return VERR_TRPM_ACTIVE_TRAP; } while (0) 621 621 #define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() do { (void)fMcBegin; } while (0)
Note:
See TracChangeset
for help on using the changeset viewer.