Changeset 48329 in vbox
- Timestamp:
- Sep 5, 2013 10:47:36 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 88757
- Location:
- trunk/src/VBox/VMM/VMMR0
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r48309 r48329 57 57 #define HMSVM_EXIT_DECL static int 58 58 59 60 59 /** @name Segment attribute conversion between CPU and AMD-V VMCB format. 61 60 * … … 70 69 #define HMSVM_VMCB_2_CPU_SEG_ATTR(a) ( ((a) & 0xff) | (((a) & 0x0f00) << 4) ) 71 70 /** @} */ 72 73 71 74 72 /** @name Macros for loading, storing segment registers to/from the VMCB. … … 97 95 /** @} */ 98 96 99 100 97 /** Macro for checking and returning from the using function for 101 98 * \#VMEXIT intercepts that maybe caused during delivering of another … … 137 134 #define HMSVM_CONTRIBUTORY_XCPT_MASK ( RT_BIT(X86_XCPT_GP) | RT_BIT(X86_XCPT_NP) | RT_BIT(X86_XCPT_SS) | RT_BIT(X86_XCPT_TS) \ 138 135 | RT_BIT(X86_XCPT_DE)) 139 140 136 141 137 /** @name VMCB Clean Bits. … … 220 216 /** @} */ 221 217 222 223 218 /** 224 219 * MSRPM (MSR permission bitmap) read permissions (for guest RDMSR). … … 243 238 } SVMMSREXITWRITE; 244 239 240 /** 241 * SVM VM-exit handler. 242 * 243 * @returns VBox status code. 244 * @param pVCpu Pointer to the VMCPU. 245 * @param pMixedCtx Pointer to the guest-CPU context. 246 * @param pSvmTransient Pointer to the SVM-transient structure. 247 */ 248 typedef int FNSVMEXITHANDLER(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 245 249 246 250 /******************************************************************************* … … 251 255 static void hmR0SvmLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx); 252 256 253 HMSVM_EXIT_DECL hmR0SvmExitIntr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 254 HMSVM_EXIT_DECL hmR0SvmExitWbinvd(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 255 HMSVM_EXIT_DECL hmR0SvmExitInvd(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 256 HMSVM_EXIT_DECL hmR0SvmExitCpuid(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 257 HMSVM_EXIT_DECL hmR0SvmExitRdtsc(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 258 HMSVM_EXIT_DECL hmR0SvmExitRdtscp(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 259 HMSVM_EXIT_DECL hmR0SvmExitRdpmc(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 260 HMSVM_EXIT_DECL hmR0SvmExitInvlpg(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 261 HMSVM_EXIT_DECL hmR0SvmExitHlt(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 262 HMSVM_EXIT_DECL hmR0SvmExitMonitor(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 263 HMSVM_EXIT_DECL hmR0SvmExitMwait(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 264 HMSVM_EXIT_DECL hmR0SvmExitShutdown(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 265 HMSVM_EXIT_DECL hmR0SvmExitReadCRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 266 HMSVM_EXIT_DECL hmR0SvmExitWriteCRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 267 HMSVM_EXIT_DECL hmR0SvmExitSetPendingXcptUD(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 268 HMSVM_EXIT_DECL hmR0SvmExitMsr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 269 HMSVM_EXIT_DECL hmR0SvmExitReadDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 270 HMSVM_EXIT_DECL hmR0SvmExitWriteDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 271 HMSVM_EXIT_DECL hmR0SvmExitIOInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 272 HMSVM_EXIT_DECL hmR0SvmExitNestedPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 273 HMSVM_EXIT_DECL hmR0SvmExitVIntr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 274 HMSVM_EXIT_DECL hmR0SvmExitTaskSwitch(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 275 HMSVM_EXIT_DECL hmR0SvmExitVmmCall(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 276 HMSVM_EXIT_DECL hmR0SvmExitXcptPF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 277 HMSVM_EXIT_DECL hmR0SvmExitXcptNM(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 278 HMSVM_EXIT_DECL hmR0SvmExitXcptMF(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 279 HMSVM_EXIT_DECL hmR0SvmExitXcptDB(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient); 257 /** @name VM-exit handlers. 258 * @{ 259 */ 260 static FNSVMEXITHANDLER hmR0SvmExitIntr; 261 static FNSVMEXITHANDLER hmR0SvmExitWbinvd; 262 static FNSVMEXITHANDLER hmR0SvmExitInvd; 263 static FNSVMEXITHANDLER hmR0SvmExitCpuid; 264 static FNSVMEXITHANDLER hmR0SvmExitRdtsc; 265 static FNSVMEXITHANDLER hmR0SvmExitRdtscp; 266 static FNSVMEXITHANDLER hmR0SvmExitRdpmc; 267 static FNSVMEXITHANDLER hmR0SvmExitInvlpg; 268 static FNSVMEXITHANDLER hmR0SvmExitHlt; 269 static FNSVMEXITHANDLER hmR0SvmExitMonitor; 270 static FNSVMEXITHANDLER hmR0SvmExitMwait; 271 static FNSVMEXITHANDLER hmR0SvmExitShutdown; 272 static FNSVMEXITHANDLER hmR0SvmExitReadCRx; 273 static FNSVMEXITHANDLER hmR0SvmExitWriteCRx; 274 static FNSVMEXITHANDLER hmR0SvmExitSetPendingXcptUD; 275 static FNSVMEXITHANDLER hmR0SvmExitMsr; 276 static FNSVMEXITHANDLER hmR0SvmExitReadDRx; 277 static FNSVMEXITHANDLER hmR0SvmExitWriteDRx; 278 static FNSVMEXITHANDLER hmR0SvmExitIOInstr; 279 static FNSVMEXITHANDLER hmR0SvmExitNestedPF; 280 static FNSVMEXITHANDLER hmR0SvmExitVIntr; 281 static FNSVMEXITHANDLER hmR0SvmExitTaskSwitch; 282 static FNSVMEXITHANDLER hmR0SvmExitVmmCall; 283 static FNSVMEXITHANDLER hmR0SvmExitXcptPF; 284 static FNSVMEXITHANDLER hmR0SvmExitXcptNM; 285 static FNSVMEXITHANDLER hmR0SvmExitXcptMF; 286 static FNSVMEXITHANDLER hmR0SvmExitXcptDB; 287 /** @} */ 280 288 281 289 DECLINLINE(int) hmR0SvmHandleExit(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PSVMTRANSIENT pSvmTransient); 282 283 290 284 291 /******************************************************************************* … … 1085 1092 if (!pVM->hm.s.fNestedPaging) 1086 1093 { 1087 u64GuestCR0 |= X86_CR0_PG; /* When Nested Paging is not available, use shadow page tables. */1088 u64GuestCR0 |= X86_CR0_WP; /* Guest CPL 0 writes to its read-only pages should cause a #PF VM-exit. */1094 u64GuestCR0 |= X86_CR0_PG; /* When Nested Paging is not available, use shadow page tables. */ 1095 u64GuestCR0 |= X86_CR0_WP; /* Guest CPL 0 writes to its read-only pages should cause a #PF VM-exit. */ 1089 1096 } 1090 1097 … … 1497 1504 AssertRCReturn(rc, rc); 1498 1505 1499 /* *Assume that we need to trap all TPR accesses and thus need not check on1500 *every #VMEXIT if we should update the TPR. */1506 /* Assume that we need to trap all TPR accesses and thus need not check on 1507 every #VMEXIT if we should update the TPR. */ 1501 1508 Assert(pVmcb->ctrl.IntCtrl.n.u1VIrqMasking); 1502 1509 pVCpu->hm.s.svm.fSyncVTpr = false; … … 1615 1622 PVM pVM = pVCpu->CTX_SUFF(pVM); 1616 1623 PCPUMCTX pCtx = CPUMQueryGuestCtxPtr(pVCpu); 1617 VMMRZCallRing3Disable(pVCpu); /* No longjmps (log-flush, locks) in this fragile context. */ 1624 1625 /* No longjmps (log-flush, locks) in this fragile context. */ 1626 VMMRZCallRing3Disable(pVCpu); 1618 1627 1619 1628 if (!pVCpu->hm.s.fLeaveDone) … … 1623 1632 } 1624 1633 1625 int rc = HMR0LeaveCpu(pVCpu); /* Leave HM context, takes care of local init (term). */ 1634 /* Leave HM context, takes care of local init (term). */ 1635 int rc = HMR0LeaveCpu(pVCpu); 1626 1636 AssertRC(rc); NOREF(rc); 1627 1637 1628 VMMRZCallRing3Enable(pVCpu); /* Restore longjmp state. */ 1638 /* Restore longjmp state. */ 1639 VMMRZCallRing3Enable(pVCpu); 1629 1640 STAM_COUNTER_INC(&pVCpu->hm.s.StatPreemptPreempting); 1630 1641 break; … … 1637 1648 VMCPU_ASSERT_EMT(pVCpu); 1638 1649 1639 VMMRZCallRing3Disable(pVCpu); /* No longjmps (log-flush, locks) in this fragile context. */ 1650 /* No longjmps (log-flush, locks) in this fragile context. */ 1651 VMMRZCallRing3Disable(pVCpu); 1640 1652 1641 1653 /* … … 1648 1660 1649 1661 pVCpu->hm.s.fLeaveDone = false; 1650 VMMRZCallRing3Enable(pVCpu); /* Restore longjmp state. */ 1662 1663 /* Restore longjmp state. */ 1664 VMMRZCallRing3Enable(pVCpu); 1651 1665 break; 1652 1666 } -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r48326 r48329 293 293 294 294 /** 295 * VM -exit handler.295 * VMX VM-exit handler. 296 296 * 297 297 * @returns VBox status code. … … 303 303 */ 304 304 #ifndef HMVMX_USE_FUNCTION_TABLE 305 typedef int FNVM EXITHANDLER(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient);305 typedef int FNVMXEXITHANDLER(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient); 306 306 #else 307 typedef DECLCALLBACK(int) FNVM EXITHANDLER(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient);307 typedef DECLCALLBACK(int) FNVMXEXITHANDLER(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVmxTransient); 308 308 /** Pointer to VM-exit handler. */ 309 typedef FNVM EXITHANDLER *PFNVMEXITHANDLER;309 typedef FNVMXEXITHANDLER *PFNVMXEXITHANDLER; 310 310 #endif 311 311 … … 332 332 * @{ 333 333 */ 334 static FNVM EXITHANDLER hmR0VmxExitXcptOrNmi;335 static FNVM EXITHANDLER hmR0VmxExitExtInt;336 static FNVM EXITHANDLER hmR0VmxExitTripleFault;337 static FNVM EXITHANDLER hmR0VmxExitInitSignal;338 static FNVM EXITHANDLER hmR0VmxExitSipi;339 static FNVM EXITHANDLER hmR0VmxExitIoSmi;340 static FNVM EXITHANDLER hmR0VmxExitSmi;341 static FNVM EXITHANDLER hmR0VmxExitIntWindow;342 static FNVM EXITHANDLER hmR0VmxExitNmiWindow;343 static FNVM EXITHANDLER hmR0VmxExitTaskSwitch;344 static FNVM EXITHANDLER hmR0VmxExitCpuid;345 static FNVM EXITHANDLER hmR0VmxExitGetsec;346 static FNVM EXITHANDLER hmR0VmxExitHlt;347 static FNVM EXITHANDLER hmR0VmxExitInvd;348 static FNVM EXITHANDLER hmR0VmxExitInvlpg;349 static FNVM EXITHANDLER hmR0VmxExitRdpmc;350 static FNVM EXITHANDLER hmR0VmxExitRdtsc;351 static FNVM EXITHANDLER hmR0VmxExitRsm;352 static FNVM EXITHANDLER hmR0VmxExitSetPendingXcptUD;353 static FNVM EXITHANDLER hmR0VmxExitMovCRx;354 static FNVM EXITHANDLER hmR0VmxExitMovDRx;355 static FNVM EXITHANDLER hmR0VmxExitIoInstr;356 static FNVM EXITHANDLER hmR0VmxExitRdmsr;357 static FNVM EXITHANDLER hmR0VmxExitWrmsr;358 static FNVM EXITHANDLER hmR0VmxExitErrInvalidGuestState;359 static FNVM EXITHANDLER hmR0VmxExitErrMsrLoad;360 static FNVM EXITHANDLER hmR0VmxExitErrUndefined;361 static FNVM EXITHANDLER hmR0VmxExitMwait;362 static FNVM EXITHANDLER hmR0VmxExitMtf;363 static FNVM EXITHANDLER hmR0VmxExitMonitor;364 static FNVM EXITHANDLER hmR0VmxExitPause;365 static FNVM EXITHANDLER hmR0VmxExitErrMachineCheck;366 static FNVM EXITHANDLER hmR0VmxExitTprBelowThreshold;367 static FNVM EXITHANDLER hmR0VmxExitApicAccess;368 static FNVM EXITHANDLER hmR0VmxExitXdtrAccess;369 static FNVM EXITHANDLER hmR0VmxExitXdtrAccess;370 static FNVM EXITHANDLER hmR0VmxExitEptViolation;371 static FNVM EXITHANDLER hmR0VmxExitEptMisconfig;372 static FNVM EXITHANDLER hmR0VmxExitRdtscp;373 static FNVM EXITHANDLER hmR0VmxExitPreemptTimer;374 static FNVM EXITHANDLER hmR0VmxExitWbinvd;375 static FNVM EXITHANDLER hmR0VmxExitXsetbv;376 static FNVM EXITHANDLER hmR0VmxExitRdrand;377 static FNVM EXITHANDLER hmR0VmxExitInvpcid;334 static FNVMXEXITHANDLER hmR0VmxExitXcptOrNmi; 335 static FNVMXEXITHANDLER hmR0VmxExitExtInt; 336 static FNVMXEXITHANDLER hmR0VmxExitTripleFault; 337 static FNVMXEXITHANDLER hmR0VmxExitInitSignal; 338 static FNVMXEXITHANDLER hmR0VmxExitSipi; 339 static FNVMXEXITHANDLER hmR0VmxExitIoSmi; 340 static FNVMXEXITHANDLER hmR0VmxExitSmi; 341 static FNVMXEXITHANDLER hmR0VmxExitIntWindow; 342 static FNVMXEXITHANDLER hmR0VmxExitNmiWindow; 343 static FNVMXEXITHANDLER hmR0VmxExitTaskSwitch; 344 static FNVMXEXITHANDLER hmR0VmxExitCpuid; 345 static FNVMXEXITHANDLER hmR0VmxExitGetsec; 346 static FNVMXEXITHANDLER hmR0VmxExitHlt; 347 static FNVMXEXITHANDLER hmR0VmxExitInvd; 348 static FNVMXEXITHANDLER hmR0VmxExitInvlpg; 349 static FNVMXEXITHANDLER hmR0VmxExitRdpmc; 350 static FNVMXEXITHANDLER hmR0VmxExitRdtsc; 351 static FNVMXEXITHANDLER hmR0VmxExitRsm; 352 static FNVMXEXITHANDLER hmR0VmxExitSetPendingXcptUD; 353 static FNVMXEXITHANDLER hmR0VmxExitMovCRx; 354 static FNVMXEXITHANDLER hmR0VmxExitMovDRx; 355 static FNVMXEXITHANDLER hmR0VmxExitIoInstr; 356 static FNVMXEXITHANDLER hmR0VmxExitRdmsr; 357 static FNVMXEXITHANDLER hmR0VmxExitWrmsr; 358 static FNVMXEXITHANDLER hmR0VmxExitErrInvalidGuestState; 359 static FNVMXEXITHANDLER hmR0VmxExitErrMsrLoad; 360 static FNVMXEXITHANDLER hmR0VmxExitErrUndefined; 361 static FNVMXEXITHANDLER hmR0VmxExitMwait; 362 static FNVMXEXITHANDLER hmR0VmxExitMtf; 363 static FNVMXEXITHANDLER hmR0VmxExitMonitor; 364 static FNVMXEXITHANDLER hmR0VmxExitPause; 365 static FNVMXEXITHANDLER hmR0VmxExitErrMachineCheck; 366 static FNVMXEXITHANDLER hmR0VmxExitTprBelowThreshold; 367 static FNVMXEXITHANDLER hmR0VmxExitApicAccess; 368 static FNVMXEXITHANDLER hmR0VmxExitXdtrAccess; 369 static FNVMXEXITHANDLER hmR0VmxExitXdtrAccess; 370 static FNVMXEXITHANDLER hmR0VmxExitEptViolation; 371 static FNVMXEXITHANDLER hmR0VmxExitEptMisconfig; 372 static FNVMXEXITHANDLER hmR0VmxExitRdtscp; 373 static FNVMXEXITHANDLER hmR0VmxExitPreemptTimer; 374 static FNVMXEXITHANDLER hmR0VmxExitWbinvd; 375 static FNVMXEXITHANDLER hmR0VmxExitXsetbv; 376 static FNVMXEXITHANDLER hmR0VmxExitRdrand; 377 static FNVMXEXITHANDLER hmR0VmxExitInvpcid; 378 378 /** @} */ 379 379 … … 395 395 * VMX_EXIT dispatch table. 396 396 */ 397 static const PFNVM EXITHANDLER g_apfnVMExitHandlers[VMX_EXIT_MAX + 1] =397 static const PFNVMXEXITHANDLER g_apfnVMExitHandlers[VMX_EXIT_MAX + 1] = 398 398 { 399 399 /* 00 VMX_EXIT_XCPT_OR_NMI */ hmR0VmxExitXcptOrNmi,
Note:
See TracChangeset
for help on using the changeset viewer.