Index: /trunk/include/VBox/vmm/iem.h
===================================================================
--- /trunk/include/VBox/vmm/iem.h	(revision 65933)
+++ /trunk/include/VBox/vmm/iem.h	(revision 65934)
@@ -137,4 +137,5 @@
 VMM_INT_DECL(VBOXSTRICTRC)  IEMExecDecodedVmload(PVMCPU pVCpu, uint8_t cbInstr);
 VMM_INT_DECL(VBOXSTRICTRC)  IEMExecDecodedVmsave(PVMCPU pVCpu, uint8_t cbInstr);
+VMM_INT_DECL(VBOXSTRICTRC)  IEMExecDecodedInvlpga(PVMCPU pVCpu, uint8_t cbInstr);
 #endif
 /** @}  */
Index: /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 65933)
+++ /trunk/src/VBox/VMM/VMMAll/IEMAll.cpp	(revision 65934)
@@ -15023,4 +15023,22 @@
     return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
 }
+
+
+/**
+ * Interface for HM and EM to emulate the INVLPGA instruction.
+ *
+ * @returns Strict VBox status code.
+ * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
+ * @param   cbInstr     The instruction length in bytes.
+ * @thread  EMT(pVCpu)
+ */
+VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedInvlpga(PVMCPU pVCpu, uint8_t cbInstr)
+{
+    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
+
+    iemInitExec(pVCpu, false /*fBypassHandlers*/);
+    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_invlpga);
+    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
+}
 #endif /* VBOX_WITH_NESTED_HWVIRT */
 
Index: /trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp	(revision 65933)
+++ /trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp	(revision 65934)
@@ -275,4 +275,5 @@
 static FNSVMEXITHANDLER hmR0SvmExitVmload;
 static FNSVMEXITHANDLER hmR0SvmExitVmsave;
+static FNSVMEXITHANDLER hmR0SvmExitInvlpga;
 #endif
 /** @} */
@@ -3656,4 +3657,5 @@
                 case SVM_EXIT_VMLOAD:   return hmR0SvmExitVmload(pVCpu, pCtx, pSvmTransient);
                 case SVM_EXIT_VMSAVE:   return hmR0SvmExitVmsave(pVCpu, pCtx, pSvmTransient);
+                case SVM_EXIT_INVLPGA:  return hmR0SvmExitInvlpga(pVCpu, pCtx, pSvmTransient);
 #else
                 case SVM_EXIT_CLGI:
@@ -3661,6 +3663,6 @@
                 case SVM_EXIT_VMLOAD:
                 case SVM_EXIT_VMSAVE:
+                case SVM_EXIT_INVLPGA:
 #endif
-                case SVM_EXIT_INVLPGA:
                 case SVM_EXIT_RSM:
                 case SVM_EXIT_VMRUN:
@@ -5670,4 +5672,5 @@
     /** @todo Stat. */
     /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitClgi); */
+    /** @todo Decode Assist. */
     VBOXSTRICTRC rcStrict = IEMExecDecodedClgi(pVCpu, 3);
     return VBOXSTRICTRC_VAL(rcStrict);
@@ -5683,4 +5686,5 @@
     /** @todo Stat. */
     /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitStgi); */
+    /** @todo Decode Assist. */
     VBOXSTRICTRC rcStrict = IEMExecDecodedStgi(pVCpu, 3);
     return VBOXSTRICTRC_VAL(rcStrict);
@@ -5696,4 +5700,5 @@
     /** @todo Stat. */
     /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitVmload); */
+    /** @todo Decode Assist. */
     VBOXSTRICTRC rcStrict = IEMExecDecodedVmload(pVCpu, 3);
     return VBOXSTRICTRC_VAL(rcStrict);
@@ -5709,7 +5714,22 @@
     /** @todo Stat. */
     /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitVmsave); */
+    /** @todo Decode Assist. */
     VBOXSTRICTRC rcStrict = IEMExecDecodedVmsave(pVCpu, 3);
     return VBOXSTRICTRC_VAL(rcStrict);
 }
+
+
+/**
+ * \#VMEXIT handler for INVLPGA (SVM_EXIT_INVLPGA). Conditional \#VMEXIT.
+ */
+HMSVM_EXIT_DECL hmR0SvmExitInvlpga(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient)
+{
+    HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
+    /** @todo Stat. */
+    /* STAM_COUNTER_INC(&pVCpu->hm.s.StatExitInvlpga); */
+    /** @todo Decode Assist. */
+    VBOXSTRICTRC rcStrict = IEMExecDecodedInvlpga(pVCpu, 3);
+    return VBOXSTRICTRC_VAL(rcStrict);
+}
 #endif /* VBOX_WITH_NESTED_HWVIRT */
 
