Changeset 72469 in vbox
- Timestamp:
- Jun 7, 2018 11:35:23 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/gim.h
r69107 r72469 189 189 VMM_INT_DECL(bool) GIMAreHypercallsEnabled(PVMCPU pVCpu); 190 190 VMM_INT_DECL(VBOXSTRICTRC) GIMHypercall(PVMCPU pVCpu, PCPUMCTX pCtx); 191 VMM_INT_DECL(VBOXSTRICTRC) GIMHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr); 191 192 VMM_INT_DECL(VBOXSTRICTRC) GIMExecHypercallInstr(PVMCPU pVCpu, PCPUMCTX pCtx, uint8_t *pcbInstr); 192 193 VMM_INT_DECL(VBOXSTRICTRC) GIMXcptUD(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis, uint8_t *pcbInstr); … … 194 195 VMM_INT_DECL(VBOXSTRICTRC) GIMReadMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue); 195 196 VMM_INT_DECL(VBOXSTRICTRC) GIMWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue); 197 VMM_INT_DECL(int) GIMQueryHypercallOpcodeBytes(PVM pVM, void *pvBuf, size_t cbBuf, 198 size_t *pcbWritten, uint16_t *puDisOpcode); 196 199 /** @} */ 197 200 -
trunk/include/VBox/vmm/vmm.h
r72462 r72469 286 286 VMM_INT_DECL(bool) VMMIsInRing3Call(PVMCPU pVCpu); 287 287 VMM_INT_DECL(void) VMMTrashVolatileXMMRegs(void); 288 VMM_INT_DECL(int) VMMPatchHypercall(PVM pVM, void *pvBuf, size_t cbBuf, size_t *pcbWritten);289 288 290 289 -
trunk/src/VBox/VMM/VMMAll/GIMAll.cpp
r69111 r72469 133 133 134 134 /** 135 * Same as GIMHypercall, except with disassembler opcode and instruction length. 136 * 137 * This is the interface used by IEM. 138 * 139 * @returns Strict VBox status code. 140 * @retval VINF_SUCCESS if the hypercall succeeded (even if its operation 141 * failed). 142 * @retval VINF_GIM_HYPERCALL_CONTINUING continue hypercall without updating 143 * RIP. 144 * @retval VINF_GIM_R3_HYPERCALL re-start the hypercall from ring-3. 145 * @retval VERR_GIM_HYPERCALL_ACCESS_DENIED CPL is insufficient. 146 * @retval VERR_GIM_HYPERCALLS_NOT_AVAILABLE hypercalls unavailable. 147 * @retval VERR_GIM_NOT_ENABLED GIM is not enabled (shouldn't really happen) 148 * @retval VERR_GIM_HYPERCALL_MEMORY_READ_FAILED hypercall failed while reading 149 * memory. 150 * @retval VERR_GIM_HYPERCALL_MEMORY_WRITE_FAILED hypercall failed while 151 * writing memory. 152 * @retval VERR_GIM_INVALID_HYPERCALL_INSTR if uDisOpcode is the wrong one; raise \#UD. 153 * 154 * @param pVCpu The cross context virtual CPU structure. 155 * @param pCtx Pointer to the guest-CPU context. 156 * @param uDisOpcode The disassembler opcode. 157 * @param cbInstr The instruction length. 158 * 159 * @remarks The caller of this function needs to advance RIP as required. 160 * @thread EMT. 161 */ 162 VMM_INT_DECL(VBOXSTRICTRC) GIMHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr) 163 { 164 PVM pVM = pVCpu->CTX_SUFF(pVM); 165 VMCPU_ASSERT_EMT(pVCpu); 166 167 if (RT_UNLIKELY(!GIMIsEnabled(pVM))) 168 return VERR_GIM_NOT_ENABLED; 169 170 switch (pVM->gim.s.enmProviderId) 171 { 172 case GIMPROVIDERID_HYPERV: 173 return gimHvHypercallEx(pVCpu, pCtx, uDisOpcode, cbInstr); 174 175 case GIMPROVIDERID_KVM: 176 return gimKvmHypercallEx(pVCpu, pCtx, uDisOpcode, cbInstr); 177 178 default: 179 AssertMsgFailedReturn(("enmProviderId=%u\n", pVM->gim.s.enmProviderId), VERR_GIM_HYPERCALLS_NOT_AVAILABLE); 180 } 181 } 182 183 184 /** 135 185 * Disassembles the instruction at RIP and if it's a hypercall 136 186 * instruction, performs the hypercall. … … 163 213 { 164 214 case GIMPROVIDERID_HYPERV: 165 return gimHv ExecHypercallInstr(pVCpu, pCtx, &Dis);215 return gimHvHypercallEx(pVCpu, pCtx, Dis.pCurInstr->uOpcode, Dis.cbInstr); 166 216 167 217 case GIMPROVIDERID_KVM: 168 return gimKvm ExecHypercallInstr(pVCpu, pCtx, &Dis);218 return gimKvmHypercallEx(pVCpu, pCtx, Dis.pCurInstr->uOpcode, Dis.cbInstr); 169 219 170 220 default: … … 352 402 } 353 403 404 405 /** 406 * Queries the opcode bytes for a native hypercall. 407 * 408 * @returns VBox status code. 409 * @param pVM The cross context VM structure. 410 * @param pvBuf The destination buffer. 411 * @param cbBuf The size of the buffer. 412 * @param pcbWritten Where to return the number of bytes written. This is 413 * reliably updated only on successful return. Optional. 414 * @param puDisOpcode Where to return the disassembler opcode. Optional. 415 */ 416 VMM_INT_DECL(int) GIMQueryHypercallOpcodeBytes(PVM pVM, void *pvBuf, size_t cbBuf, size_t *pcbWritten, uint16_t *puDisOpcode) 417 { 418 AssertPtrReturn(pvBuf, VERR_INVALID_POINTER); 419 420 CPUMCPUVENDOR enmHostCpu = CPUMGetHostCpuVendor(pVM); 421 uint8_t const *pbSrc; 422 size_t cbSrc; 423 switch (enmHostCpu) 424 { 425 case CPUMCPUVENDOR_AMD: 426 { 427 if (puDisOpcode) 428 *puDisOpcode = OP_VMMCALL; 429 static uint8_t const s_abHypercall[] = { 0x0F, 0x01, 0xD9 }; /* VMMCALL */ 430 pbSrc = s_abHypercall; 431 cbSrc = sizeof(s_abHypercall); 432 break; 433 } 434 435 case CPUMCPUVENDOR_INTEL: 436 case CPUMCPUVENDOR_VIA: 437 { 438 if (puDisOpcode) 439 *puDisOpcode = OP_VMCALL; 440 static uint8_t const s_abHypercall[] = { 0x0F, 0x01, 0xC1 }; /* VMCALL */ 441 pbSrc = s_abHypercall; 442 cbSrc = sizeof(s_abHypercall); 443 break; 444 } 445 446 default: 447 AssertMsgFailedReturn(("%d\n", enmHostCpu), VERR_UNSUPPORTED_CPU); 448 } 449 if (RT_LIKELY(cbBuf >= cbSrc)) 450 { 451 memcpy(pvBuf, pbSrc, cbSrc); 452 if (pcbWritten) 453 *pcbWritten = cbSrc; 454 return VINF_SUCCESS; 455 } 456 return VERR_BUFFER_OVERFLOW; 457 } 458 -
trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp
r72462 r72469 1381 1381 1382 1382 /** 1383 * Checks the currently disassembled instruction and executes the hypercall if 1384 * it's a hypercall instruction. 1383 * Checks the instruction and executes the hypercall if it's a valid hypercall 1384 * instruction. 1385 * 1386 * This interface is used by \#UD handlers and IEM. 1385 1387 * 1386 1388 * @returns Strict VBox status code. 1387 1389 * @param pVCpu The cross context virtual CPU structure. 1388 1390 * @param pCtx Pointer to the guest-CPU context. 1389 * @param pDis Pointer to the disassembled instruction state at RIP. 1391 * @param uDisOpcode The disassembler opcode. 1392 * @param cbInstr The instruction length. 1390 1393 * 1391 1394 * @thread EMT(pVCpu). 1392 * 1393 * @todo Make this function static when @bugref{7270#c168} is addressed. 1394 */ 1395 VMM_INT_DECL(VBOXSTRICTRC) gimHvExecHypercallInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis) 1395 */ 1396 VMM_INT_DECL(VBOXSTRICTRC) gimHvHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr) 1396 1397 { 1397 1398 Assert(pVCpu); 1398 1399 Assert(pCtx); 1399 Assert(pDis);1400 1400 VMCPU_ASSERT_EMT(pVCpu); 1401 1401 1402 1402 PVM pVM = pVCpu->CTX_SUFF(pVM); 1403 CPUMCPUVENDOR const enmGuestCpuVendor = CPUMGetGuestCpuVendor(pVM);1404 if ( ( pDis->pCurInstr->uOpcode == OP_VMCALL1403 CPUMCPUVENDOR const enmGuestCpuVendor = (CPUMCPUVENDOR)pVM->cpum.ro.GuestFeatures.enmCpuVendor; 1404 if ( ( uDisOpcode == OP_VMCALL 1405 1405 && ( enmGuestCpuVendor == CPUMCPUVENDOR_INTEL 1406 1406 || enmGuestCpuVendor == CPUMCPUVENDOR_VIA)) 1407 || ( pDis->pCurInstr->uOpcode == OP_VMMCALL1407 || ( uDisOpcode == OP_VMMCALL 1408 1408 && enmGuestCpuVendor == CPUMCPUVENDOR_AMD)) 1409 {1410 1409 return gimHvHypercall(pVCpu, pCtx); 1411 } 1412 1410 1411 RT_NOREF_PV(cbInstr); 1413 1412 return VERR_GIM_INVALID_HYPERCALL_INSTR; 1414 1413 } … … 1460 1459 if (pcbInstr) 1461 1460 *pcbInstr = (uint8_t)cbInstr; 1462 return gimHv ExecHypercallInstr(pVCpu, pCtx, &Dis);1461 return gimHvHypercallEx(pVCpu, pCtx, Dis.pCurInstr->uOpcode, Dis.cbInstr); 1463 1462 } 1464 1463 … … 1467 1466 } 1468 1467 1469 return gimHv ExecHypercallInstr(pVCpu, pCtx, pDis);1468 return gimHvHypercallEx(pVCpu, pCtx, pDis->pCurInstr->uOpcode, pDis->cbInstr); 1470 1469 } 1471 1470 -
trunk/src/VBox/VMM/VMMAll/GIMAllKvm.cpp
r70948 r72469 351 351 352 352 /** 353 * Checks the currently disassembled instruction and executes the hypercall if 354 * it's a hypercall instruction. 353 * Checks the instruction and executes the hypercall if it's a valid hypercall 354 * instruction. 355 * 356 * This interface is used by \#UD handlers and IEM. 355 357 * 356 358 * @returns Strict VBox status code. 357 359 * @param pVCpu The cross context virtual CPU structure. 358 360 * @param pCtx Pointer to the guest-CPU context. 359 * @param pDis Pointer to the disassembled instruction state at RIP. 361 * @param uDisOpcode The disassembler opcode. 362 * @param cbInstr The instruction length. 360 363 * 361 364 * @thread EMT(pVCpu). 362 * 363 * @todo Make this function static when @bugref{7270#c168} is addressed. 364 */ 365 VMM_INT_DECL(VBOXSTRICTRC) gimKvmExecHypercallInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis) 365 */ 366 VMM_INT_DECL(VBOXSTRICTRC) gimKvmHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr) 366 367 { 367 368 Assert(pVCpu); 368 369 Assert(pCtx); 369 Assert(pDis);370 370 VMCPU_ASSERT_EMT(pVCpu); 371 371 … … 378 378 * will not require disassembly (when coming from HM). 379 379 */ 380 if ( pDis->pCurInstr->uOpcode == OP_VMCALL381 || pDis->pCurInstr->uOpcode == OP_VMMCALL)380 if ( uDisOpcode == OP_VMCALL 381 || uDisOpcode == OP_VMMCALL) 382 382 { 383 383 /* … … 399 399 PVM pVM = pVCpu->CTX_SUFF(pVM); 400 400 PCGIMKVM pKvm = &pVM->gim.s.u.Kvm; 401 if ( pDis->pCurInstr->uOpcode != pKvm->uOpCodeNative 402 && !VM_IS_RAW_MODE_ENABLED(pVM)) 401 if ( uDisOpcode != pKvm->uOpcodeNative 402 && !VM_IS_RAW_MODE_ENABLED(pVM) 403 && cbInstr == sizeof(pKvm->abOpcodeNative) ) 403 404 { 404 405 /** @todo r=ramshankar: we probably should be doing this in an 405 406 * EMT rendezvous. */ 406 uint8_t abHypercall[3]; 407 size_t cbWritten = 0; 408 int rc = VMMPatchHypercall(pVM, &abHypercall, sizeof(abHypercall), &cbWritten); 407 /** @todo Add stats for patching. */ 408 int rc = PGMPhysSimpleWriteGCPtr(pVCpu, pCtx->rip, pKvm->abOpcodeNative, sizeof(pKvm->abOpcodeNative)); 409 409 AssertRC(rc); 410 Assert(sizeof(abHypercall) == pDis->cbInstr);411 Assert(sizeof(abHypercall) == cbWritten);412 413 rc = PGMPhysSimpleWriteGCPtr(pVCpu, pCtx->rip, &abHypercall, sizeof(abHypercall));414 AssertRC(rc);415 416 /** @todo Add stats for patching. */417 410 } 418 411 } … … 473 466 if (pcbInstr) 474 467 *pcbInstr = (uint8_t)cbInstr; 475 return gimKvm ExecHypercallInstr(pVCpu, pCtx, &Dis);468 return gimKvmHypercallEx(pVCpu, pCtx, Dis.pCurInstr->uOpcode, Dis.cbInstr); 476 469 } 477 470 … … 480 473 } 481 474 482 return gimKvm ExecHypercallInstr(pVCpu, pCtx, pDis);483 } 484 475 return gimKvmHypercallEx(pVCpu, pCtx, pDis->pCurInstr->uOpcode, pDis->cbInstr); 476 } 477 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplSvmInstr.cpp.h
r72462 r72469 1092 1092 * Common code for iemCImpl_vmmcall and iemCImpl_vmcall (latter in IEMAllCImplVmxInstr.cpp.h). 1093 1093 */ 1094 IEM_CIMPL_DEF_ 0(iemCImpl_Hypercall)1094 IEM_CIMPL_DEF_1(iemCImpl_Hypercall, uint16_t, uDisOpcode) 1095 1095 { 1096 1096 if (EMAreHypercallInstructionsEnabled(pVCpu)) 1097 1097 { 1098 VBOXSTRICTRC rcStrict = GIMHypercall(pVCpu, IEM_GET_CTX(pVCpu)); 1098 NOREF(uDisOpcode); 1099 VBOXSTRICTRC rcStrict = GIMHypercallEx(pVCpu, IEM_GET_CTX(pVCpu), uDisOpcode, cbInstr); 1099 1100 if (RT_SUCCESS(rcStrict)) 1100 1101 { … … 1145 1146 1146 1147 /* Join forces with vmcall. */ 1147 return IEM_CIMPL_CALL_ 0(iemCImpl_Hypercall);1148 return IEM_CIMPL_CALL_1(iemCImpl_Hypercall, OP_VMMCALL); 1148 1149 } 1149 1150 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r72462 r72469 25 25 26 26 /* Join forces with vmmcall. */ 27 return IEM_CIMPL_CALL_ 0(iemCImpl_Hypercall);27 return IEM_CIMPL_CALL_1(iemCImpl_Hypercall, OP_VMCALL); 28 28 } 29 29 -
trunk/src/VBox/VMM/VMMAll/VMMAll.cpp
r72462 r72469 396 396 } 397 397 398 399 /**400 * Patches the instructions necessary for making a hypercall to the hypervisor.401 * Used by GIM.402 *403 * @returns VBox status code.404 * @param pVM The cross context VM structure.405 * @param pvBuf The buffer in the hypercall page(s) to be patched.406 * @param cbBuf The size of the buffer.407 * @param pcbWritten Where to store the number of bytes patched. This408 * is reliably updated only when this function returns409 * VINF_SUCCESS.410 */411 VMM_INT_DECL(int) VMMPatchHypercall(PVM pVM, void *pvBuf, size_t cbBuf, size_t *pcbWritten)412 {413 AssertReturn(pvBuf, VERR_INVALID_POINTER);414 AssertReturn(pcbWritten, VERR_INVALID_POINTER);415 416 CPUMCPUVENDOR enmHostCpu = CPUMGetHostCpuVendor(pVM);417 switch (enmHostCpu)418 {419 case CPUMCPUVENDOR_AMD:420 {421 uint8_t abHypercall[] = { 0x0F, 0x01, 0xD9 }; /* VMMCALL */422 if (RT_LIKELY(cbBuf >= sizeof(abHypercall)))423 {424 memcpy(pvBuf, abHypercall, sizeof(abHypercall));425 *pcbWritten = sizeof(abHypercall);426 return VINF_SUCCESS;427 }428 return VERR_BUFFER_OVERFLOW;429 }430 431 case CPUMCPUVENDOR_INTEL:432 case CPUMCPUVENDOR_VIA:433 {434 uint8_t abHypercall[] = { 0x0F, 0x01, 0xC1 }; /* VMCALL */435 if (RT_LIKELY(cbBuf >= sizeof(abHypercall)))436 {437 memcpy(pvBuf, abHypercall, sizeof(abHypercall));438 *pcbWritten = sizeof(abHypercall);439 return VINF_SUCCESS;440 }441 return VERR_BUFFER_OVERFLOW;442 }443 444 default:445 AssertFailed();446 return VERR_UNSUPPORTED_CPU;447 }448 }449 -
trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
r72462 r72469 1521 1521 * Patch the hypercall-page. 1522 1522 */ 1523 size_t cb Written= 0;1524 int rc = VMMPatchHypercall(pVM, pvHypercallPage, PAGE_SIZE, &cbWritten);1523 size_t cbHypercall = 0; 1524 int rc = GIMQueryHypercallOpcodeBytes(pVM, pvHypercallPage, PAGE_SIZE, &cbHypercall, NULL /*puDisOpcode*/); 1525 1525 if ( RT_SUCCESS(rc) 1526 && cb Written< PAGE_SIZE)1527 { 1528 uint8_t *pbLast = (uint8_t *)pvHypercallPage + cb Written;1526 && cbHypercall < PAGE_SIZE) 1527 { 1528 uint8_t *pbLast = (uint8_t *)pvHypercallPage + cbHypercall; 1529 1529 *pbLast = 0xc3; /* RET */ 1530 1530 … … 1543 1543 if (rc == VINF_SUCCESS) 1544 1544 rc = VERR_GIM_OPERATION_FAILED; 1545 LogRel(("GIM: HyperV: VMMPatchHypercall failed. rc=%Rrc cb Written=%u\n", rc, cbWritten));1545 LogRel(("GIM: HyperV: VMMPatchHypercall failed. rc=%Rrc cbHypercall=%u\n", rc, cbHypercall)); 1546 1546 } 1547 1547 -
trunk/src/VBox/VMM/VMMR3/GIMKvm.cpp
r72462 r72469 158 158 /* 159 159 * Setup hypercall and #UD handling. 160 * Note! We always need to trap VMCALL/VMMCALL hypercall using #UDs for raw-mode VMs. 160 161 */ 161 162 for (VMCPUID i = 0; i < pVM->cCpus; i++) 162 163 EMSetHypercallInstructionsEnabled(&pVM->aCpus[i], true); 163 164 164 if (ASMIsAmdCpu()) 165 { 166 pKvm->fTrapXcptUD = true; 167 pKvm->uOpCodeNative = OP_VMMCALL; 168 } 169 else 170 { 171 Assert(ASMIsIntelCpu() || ASMIsViaCentaurCpu()); 172 pKvm->fTrapXcptUD = false; 173 pKvm->uOpCodeNative = OP_VMCALL; 174 } 175 176 /* We always need to trap VMCALL/VMMCALL hypercall using #UDs for raw-mode VMs. */ 177 if (VM_IS_RAW_MODE_ENABLED(pVM)) 178 pKvm->fTrapXcptUD = true; 165 size_t cbHypercall = 0; 166 rc = GIMQueryHypercallOpcodeBytes(pVM, pKvm->abOpcodeNative, sizeof(pKvm->abOpcodeNative), &cbHypercall, &pKvm->uOpcodeNative); 167 AssertLogRelRCReturn(rc, rc); 168 AssertLogRelReturn(cbHypercall == sizeof(pKvm->abOpcodeNative), VERR_GIM_IPE_1); 169 pKvm->fTrapXcptUD = pKvm->uOpcodeNative != OP_VMCALL || VM_IS_RAW_MODE_ENABLED(pVM); 179 170 180 171 return VINF_SUCCESS; -
trunk/src/VBox/VMM/include/GIMHvInternal.h
r72460 r72469 1368 1368 VMM_INT_DECL(VBOXSTRICTRC) gimHvXcptUD(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis, uint8_t *pcbInstr); 1369 1369 VMM_INT_DECL(VBOXSTRICTRC) gimHvHypercall(PVMCPU pVCpu, PCPUMCTX pCtx); 1370 VMM_INT_DECL(VBOXSTRICTRC) gimHv ExecHypercallInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis);1370 VMM_INT_DECL(VBOXSTRICTRC) gimHvHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr); 1371 1371 VMM_INT_DECL(VBOXSTRICTRC) gimHvReadMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue); 1372 1372 VMM_INT_DECL(VBOXSTRICTRC) gimHvWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uRawValue); -
trunk/src/VBox/VMM/include/GIMKvmInternal.h
r69111 r72469 200 200 bool fTrapXcptUD; 201 201 /** Disassembler opcode of hypercall instruction native for this host CPU. */ 202 uint16_t uOpCodeNative; 202 uint16_t uOpcodeNative; 203 /** Native hypercall opcode bytes. Use for replacing. */ 204 uint8_t abOpcodeNative[3]; 205 /** Alignment padding. */ 206 uint8_t abPadding[5]; 203 207 /** The TSC frequency (in HZ) reported to the guest. */ 204 208 uint64_t cTscTicksPerSecond; … … 266 270 VMM_INT_DECL(bool) gimKvmShouldTrapXcptUD(PVMCPU pVCpu); 267 271 VMM_INT_DECL(VBOXSTRICTRC) gimKvmXcptUD(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis, uint8_t *pcbInstr); 268 VMM_INT_DECL(VBOXSTRICTRC) gimKvm ExecHypercallInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis);272 VMM_INT_DECL(VBOXSTRICTRC) gimKvmHypercallEx(PVMCPU pVCpu, PCPUMCTX pCtx, unsigned uDisOpcode, uint8_t cbInstr); 269 273 270 274
Note:
See TracChangeset
for help on using the changeset viewer.