Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/Makefile.kmk
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/Makefile.kmk	(revision 59877)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/Makefile.kmk	(revision 59878)
@@ -190,4 +190,5 @@
 #
 VBOX_BS3KIT_MODE_SOURCES = \
+	bs3-mode-Name.asm \
 	bs3-mode-SwitchToRM.asm \
 	bs3-mode-SwitchToPE16.asm \
@@ -207,4 +208,6 @@
 	bs3-mode-PagingGetRootForLM64.asm \
 	bs3-mode-TrapSystemCallHandler.asm \
+	bs3-mode-TestDoModes.c \
+	bs3-mode-TestDoModesHlp.asm \
 
 # The 16-bit real mode BS3Kit library.
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-CpuDetectData.c
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-CpuDetectData.c	(revision 59877)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-CpuDetectData.c	(revision 59878)
@@ -38,5 +38,6 @@
 #if ARCH_BITS == 16
 
-uint16_t BS3_DATA_NM(g_uBs3CpuDetected) = BS3CPU_TYPE_MASK | BS3CPU_F_CPUID | BS3CPU_F_CPUID_EXT_LEAVES | BS3CPU_F_LONG_MODE;
+uint16_t BS3_DATA_NM(g_uBs3CpuDetected) = BS3CPU_TYPE_MASK | BS3CPU_F_CPUID | BS3CPU_F_CPUID_EXT_LEAVES
+                                         | BS3CPU_F_PAE | BS3CPU_F_LONG_MODE;
 
 #endif /* ARCH_BITS == 16 */
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-CpuDetect.asm
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-CpuDetect.asm	(revision 59877)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-CpuDetect.asm	(revision 59878)
@@ -184,23 +184,35 @@
         ;
         ; Do a very simple minded check here using the (standard) family field.
+        ; While here, we also check for PAE.
         ;
         mov     eax, 1
         cpuid
+
+        ; Calc the basic family value before we mess up EAX.
         mov     cl, ah
-        and     cl, 0fh                 ; Family.
+        and     cl, 0fh
+
+        ; Start assembling return flags, checking for PAE.
+        mov     xAX, BS3CPU_F_CPUID
+        and     dx, X86_CPUID_FEATURE_EDX_PAE
+        shl     dx, BS3CPU_F_PAE_BIT - X86_CPUID_FEATURE_EDX_PAE_BIT
+        or      ax, dx
+
+        ; Add the CPU type based on the family value.
         cmp     cl, 6
-        mov     xAX, BS3CPU_PPro | BS3CPU_F_CPUID
+        or      al, BS3CPU_PPro
         jz      .return
         ja      .NewerThanPPro
         cmp     cl, 5
-        mov     xAX, BS3CPU_Pentium | BS3CPU_F_CPUID
+        or      al, BS3CPU_Pentium
         je      .return
         cmp     cl, 4
-        mov     xAX, BS3CPU_80486 | BS3CPU_F_CPUID
+        or      al, BS3CPU_80486
         je      .return
         cmp     cl, 3
-        mov     xAX, BS3CPU_80386 | BS3CPU_F_CPUID
+        or      al, BS3CPU_80386
         je      .return
 .NewerThanPPro:
+
         ; Check for extended leaves and long mode.
         mov     eax, 0x80000000
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h	(revision 59877)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h	(revision 59878)
@@ -2131,4 +2131,5 @@
  */
 
+
 /**
  * Macro for reducing typing.
@@ -2137,17 +2138,60 @@
  */
 #define BS3_MODE_EXPAND_PROTOTYPES(a_RetType, a_BaseFnNm, a_Parameters) \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_rm)     a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe16)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe32)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pev86)  a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp16)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp32)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_ppv86)  a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae16)  a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae32)  a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_paev86) a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm16)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm32)   a_Parameters; \
-    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm64)   a_Parameters
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_rm)       a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe16)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe16_32)  a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe16_v86) a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe32)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pe32_16)  a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pev86)    a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp16)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp16_32)  a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp16_v86) a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp32)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pp32_16)  a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_ppv86)    a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae16)    a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae16_16) a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae16_v86)a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae32)    a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_pae32_16) a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_paev86)   a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm16)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm32)     a_Parameters; \
+    BS3_DECL(a_RetType) RT_CONCAT(a_BaseFnNm,_lm64)     a_Parameters
+
+/**
+ * Macro for reducing typing.
+ *
+ * Doxygen knows how to expand this, well, kind of.
+ */
+#define BS3_MODE_EXPAND_EXTERN_DATA16(a_VarType, a_VarName, a_Suffix) \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_rm))       a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pe16))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pe16_32))  a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pe16_v86)) a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pe32))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pe32_16))  a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pev86))    a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pp16))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pp16_32))  a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pp16_v86)) a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pp32))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pp32_16))  a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_ppv86))    a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pae16))    a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pae16_32)) a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pae16_v86))a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pae32))    a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_pae32_16)) a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_paev86))   a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_lm16))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_lm32))     a_Suffix; \
+    extern BS3_DECL(a_VarType) BS3_FAR_DATA BS3_DATA_NM(RT_CONCAT(a_VarName,_lm64))     a_Suffix
+
+
+/** The TMPL_MODE_STR value for each mode.
+ * These are all in DATA16 so they can be accessed from any code.  */
+BS3_MODE_EXPAND_EXTERN_DATA16(const char *, g_szBs3ModeName, []);
 
 /**
@@ -2179,6 +2223,8 @@
 /** Flag indicating that extend CPUID leaves are available (at least two).   */
 #define BS3CPU_F_CPUID_EXT_LEAVES   UINT16_C(0x0200)
+/** Flag indicating that the CPU supports PAE. */
+#define BS3CPU_F_PAE                UINT16_C(0x0400)
 /** Flag indicating that the CPU supports long mode. */
-#define BS3CPU_F_LONG_MODE          UINT16_C(0x0400)
+#define BS3CPU_F_LONG_MODE          UINT16_C(0x0800)
 /** @} */
 
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac	(revision 59877)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac	(revision 59878)
@@ -1271,5 +1271,7 @@
 %define BS3CPU_F_CPUID              0x0100
 %define BS3CPU_F_CPUID_EXT_LEAVES   0x0200
-%define BS3CPU_F_LONG_MODE          0x0400
+%define BS3CPU_F_PAE                0x0400
+%define BS3CPU_F_PAE_BIT            10
+%define BS3CPU_F_LONG_MODE          0x0800
 ;; @}
 
