Index: /trunk/src/VBox/VMM/VMMR3/NEMR3.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/NEMR3.cpp	(revision 92524)
+++ /trunk/src/VBox/VMM/VMMR3/NEMR3.cpp	(revision 92525)
@@ -393,8 +393,9 @@
     switch ((NEMEXITTYPE)uExit)
     {
+        case NEMEXITTYPE_INTTERRUPT_WINDOW:             return "NEM interrupt window";
+        case NEMEXITTYPE_HALT:                          return "NEM halt";
+
         case NEMEXITTYPE_UNRECOVERABLE_EXCEPTION:       return "NEM unrecoverable exception";
         case NEMEXITTYPE_INVALID_VP_REGISTER_VALUE:     return "NEM invalid vp register value";
-        case NEMEXITTYPE_INTTERRUPT_WINDOW:             return "NEM interrupt window";
-        case NEMEXITTYPE_HALT:                          return "NEM halt";
         case NEMEXITTYPE_XCPT_UD:                       return "NEM #UD";
         case NEMEXITTYPE_XCPT_DB:                       return "NEM #DB";
@@ -402,4 +403,13 @@
         case NEMEXITTYPE_CANCELED:                      return "NEM canceled";
         case NEMEXITTYPE_MEMORY_ACCESS:                 return "NEM memory access";
+
+        case NEMEXITTYPE_INTERNAL_ERROR_EMULATION:      return "NEM emulation IPE";
+        case NEMEXITTYPE_INTERNAL_ERROR_FATAL:          return "NEM fatal IPE";
+        case NEMEXITTYPE_INTERRUPTED:                   return "NEM interrupted";
+        case NEMEXITTYPE_FAILED_ENTRY:                  return "NEM failed VT-x/AMD-V entry";
+
+        case NEMEXITTYPE_INVALID:
+        case NEMEXITTYPE_END:
+            break;
     }
 
Index: /trunk/src/VBox/VMM/VMMR3/NEMR3Native-linux.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/NEMR3Native-linux.cpp	(revision 92524)
+++ /trunk/src/VBox/VMM/VMMR3/NEMR3Native-linux.cpp	(revision 92525)
@@ -621,5 +621,7 @@
  *
  * The KVM_SET_CPUID2 call replaces any previous leaves, so we have to redo
- * everything when there really just are single bit changes.
+ * everything when there really just are single bit changes.  That said, it
+ * looks like KVM update the XCR/XSAVE related stuff as well as the APIC enabled
+ * bit(s), so it should suffice if we do this at startup, I hope.
  */
 static int nemR3LnxUpdateCpuIdsLeaves(PVM pVM, PVMCPU pVCpu)
@@ -2066,7 +2068,4 @@
          pRun->internal.suberror, pRun->internal.ndata, sizeof(pRun->internal.data), &pRun->internal.data[0]));
 
-    EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, KVM_EXIT_INTERNAL_ERROR),
-                     pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
-
     /*
      * Deal with each suberror, returning if we don't want IEM to handle it.
@@ -2076,4 +2075,6 @@
         case KVM_INTERNAL_ERROR_EMULATION:
         {
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_INTERNAL_ERROR_EMULATION),
+                             pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
             STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitInternalErrorEmulation);
             break;
@@ -2085,4 +2086,7 @@
         default:
         {
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_INTERNAL_ERROR_FATAL),
+                             pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
+            STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitInternalErrorFatal);
             const char *pszName;
             switch (pRun->internal.suberror)
@@ -2094,5 +2098,4 @@
                 default:                                        pszName = "unknown"; break;
             }
-            STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitInternalErrorFatal);
             LogRel(("NEM: KVM_EXIT_INTERNAL_ERROR! suberror=%#x (%s) ndata=%u data=%.*Rhxs\n", pRun->internal.suberror, pszName,
                     pRun->internal.ndata, sizeof(pRun->internal.data), &pRun->internal.data[0]));
@@ -2268,5 +2271,5 @@
 
         case KVM_EXIT_IRQ_WINDOW_OPEN:
-            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, KVM_EXIT_IRQ_WINDOW_OPEN),
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_INTTERRUPT_WINDOW),
                              pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
             STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitIrqWindowOpen);
@@ -2296,5 +2299,5 @@
 
         case KVM_EXIT_HLT:
-            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, KVM_EXIT_HLT),
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_HALT),
                              pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
             STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitHalt);
@@ -2303,5 +2306,5 @@
 
         case KVM_EXIT_INTR: /* EINTR */
-            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, KVM_EXIT_INTR),
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_INTERRUPTED),
                              pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
             STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatExitIntr);
@@ -2348,4 +2351,6 @@
             LogRel(("NEM: KVM_EXIT_FAIL_ENTRY! hardware_entry_failure_reason=%#x cpu=%#x\n",
                     pRun->fail_entry.hardware_entry_failure_reason, pRun->fail_entry.cpu));
+            EMHistoryAddExit(pVCpu, EMEXIT_MAKE_FT(EMEXIT_F_KIND_NEM, NEMEXITTYPE_FAILED_ENTRY),
+                             pRun->s.regs.regs.rip + pRun->s.regs.sregs.cs.base, ASMReadTSC());
             return VERR_NEM_IPE_1;
 
@@ -2556,5 +2561,5 @@
         int rcLnx = ioctl(pVCpu->nem.s.fdVCpu, KVM_RUN, 0UL);
         pRun->immediate_exit = 0;
-        Log(("NEM/%u: Flushed stateful exit -> %d/%d exit_reason=%d\n", pVCpu->idCpu, rcLnx, errno, pRun->exit_reason));
+        Log(("NEM/%u: Flushed stateful exit -> %d/%d exit_reason=%d\n", pVCpu->idCpu, rcLnx, errno, pRun->exit_reason)); RT_NOREF(rcLnx);
         STAM_REL_COUNTER_INC(&pVCpu->nem.s.StatFlushExitOnReturn);
     }
Index: /trunk/src/VBox/VMM/include/NEMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/NEMInternal.h	(revision 92524)
+++ /trunk/src/VBox/VMM/include/NEMInternal.h	(revision 92525)
@@ -157,14 +157,27 @@
 typedef enum NEMEXITTYPE
 {
-    /* windows: */
-    NEMEXITTYPE_UNRECOVERABLE_EXCEPTION = 1,
-    NEMEXITTYPE_INVALID_VP_REGISTER_VALUE,
+    NEMEXITTYPE_INVALID = 0,
+
+    /* Common: */
     NEMEXITTYPE_INTTERRUPT_WINDOW,
     NEMEXITTYPE_HALT,
+
+    /* Windows: */
+    NEMEXITTYPE_UNRECOVERABLE_EXCEPTION,
+    NEMEXITTYPE_INVALID_VP_REGISTER_VALUE,
     NEMEXITTYPE_XCPT_UD,
     NEMEXITTYPE_XCPT_DB,
     NEMEXITTYPE_XCPT_BP,
     NEMEXITTYPE_CANCELED,
-    NEMEXITTYPE_MEMORY_ACCESS
+    NEMEXITTYPE_MEMORY_ACCESS,
+
+    /* Linux: */
+    NEMEXITTYPE_INTERNAL_ERROR_EMULATION,
+    NEMEXITTYPE_INTERNAL_ERROR_FATAL,
+    NEMEXITTYPE_INTERRUPTED,
+    NEMEXITTYPE_FAILED_ENTRY,
+
+    /* End of valid types. */
+    NEMEXITTYPE_END
 } NEMEXITTYPE;
 
