Index: /trunk/src/VBox/ValidationKit/bootsectors/Makefile.kmk
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/Makefile.kmk	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/Makefile.kmk	(revision 60609)
@@ -232,5 +232,5 @@
 bs3-cpu-basic-2_TEMPLATE = VBoxBS3KitImg
 bs3-cpu-basic-2_INCS  = .
-bs3-cpu-basic-2_DEFS  = BS3_CMN_INSTANTIATE_FILE1=bs3-cpu-basic-2-template.c
+bs3-cpu-basic-2_DEFS  =  BS3_CMN_INSTANTIATE_FILE1=bs3-cpu-basic-2-template.c
 bs3-cpu-basic-2_DEFS += BS3_MODE_INSTANTIATE_FILE1=bs3-cpu-basic-2-template.c
  ifeq ($(KBUILD_HOST),win)
@@ -239,6 +239,6 @@
 bs3-cpu-basic-2_SOURCES = \
 	bs3kit/bs3-first-rm.asm \
-	bs3-cpu-basic-2-c.c \
-	bs3-cpu-basic-2.asm \
+	bs3-cpu-basic-2.c \
+	bs3-cpu-basic-2-asm.asm \
        bs3kit/bs3-cmn-instantiate-x0.c16 \
        bs3kit/bs3-cmn-instantiate.c32 \
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm	(revision 60609)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-asm.asm	(revision 60609)
@@ -0,0 +1,88 @@
+; $Id$
+;; @file
+; BS3Kit - bs3-cpu-basic-2
+;
+
+;
+; Copyright (C) 2007-2016 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+
+;*********************************************************************************************************************************
+;*  Header Files                                                                                                                 *
+;*********************************************************************************************************************************
+%include "bs3kit.mac"
+
+
+;*********************************************************************************************************************************
+;*      Global Variables                                                                                                         *
+;*********************************************************************************************************************************
+BS3_BEGIN_DATA16
+BS3_GLOBAL_DATA g_bs3CpuBasic2_ud2_FlatAddr, 4
+        dd  bs3CpuBasic2_ud2 wrt FLAT
+
+
+
+;
+; CPU mode agnostic test code snippets.
+;
+BS3_BEGIN_TEXT16
+
+BS3_PROC_BEGIN  bs3CpuBasic2_ud2, BS3_PB_WITH_US_ALIAS
+.again:
+        ud2
+        jmp     .again
+BS3_PROC_END    bs3CpuBasic2_ud2
+
+
+BS3_PROC_BEGIN bs3CpuBasic2_Int80, BS3_PB_WITH_US_ALIAS
+        int     80h
+.again: ud2
+        jmp     .again
+BS3_PROC_END   bs3CpuBasic2_Int80
+
+
+BS3_PROC_BEGIN bs3CpuBasic2_Int81, BS3_PB_WITH_US_ALIAS
+        int     81h
+.again: ud2
+        jmp     .again
+BS3_PROC_END   bs3CpuBasic2_Int81
+
+
+BS3_PROC_BEGIN bs3CpuBasic2_Int82, BS3_PB_WITH_US_ALIAS
+        int     82h
+.again: ud2
+        jmp     .again
+BS3_PROC_END   bs3CpuBasic2_Int82
+
+
+BS3_PROC_BEGIN bs3CpuBasic2_Int83, BS3_PB_WITH_US_ALIAS
+        int     83h
+.again: ud2
+        jmp     .again
+BS3_PROC_END   bs3CpuBasic2_Int83
+
+
+;
+; Instantiate code templates.
+;
+BS3_INSTANTIATE_COMMON_TEMPLATE          "bs3-cpu-basic-2-template.mac"
+BS3_INSTANTIATE_TEMPLATE_WITH_WEIRD_ONES "bs3-cpu-basic-2-template.mac"
+
Index: unk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-c.c
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-c.c	(revision 60608)
+++ 	(revision )
@@ -1,69 +1,0 @@
-/* $Id$ */
-/** @file
- * BS3Kit - bs3-cpu-basic-2, 16-bit C code.
- */
-
-/*
- * Copyright (C) 2007-2016 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-
-/*********************************************************************************************************************************
-*   Header Files                                                                                                                 *
-*********************************************************************************************************************************/
-#include <bs3kit.h>
-#include <iprt/asm-amd64-x86.h>
-
-
-/*********************************************************************************************************************************
-*   Internal Functions                                                                                                           *
-*********************************************************************************************************************************/
-BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_TssGateEsp);
-BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_RaiseXcpt1);
-//BS3TESTMODE_PROTOTYPES_CMN(bs3CpuBasic2_iret);
-BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_iret);
-BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_sidt);
-
-
-/*********************************************************************************************************************************
-*   Global Variables                                                                                                             *
-*********************************************************************************************************************************/
-static const BS3TESTMODEENTRY g_aModeTest[] =
-{
-    //BS3TESTMODEENTRY_MODE("tss / gate / esp", bs3CpuBasic2_TssGateEsp),
-    BS3TESTMODEENTRY_MODE("raise xcpt #1", bs3CpuBasic2_RaiseXcpt1),
-    //BS3TESTMODEENTRY_CMN("iret", bs3CpuBasic2_iret),
-    BS3TESTMODEENTRY_MODE("iret", bs3CpuBasic2_iret),
-//    BS3TESTMODEENTRY_MODE("sidt", bs3CpuBasic2_sidt),
-};
-
-
-BS3_DECL(void) Main_rm()
-{
-    Bs3InitAll_rm();
-    Bs3TestInit("bs3-cpu-basic-2");
-    Bs3TestPrintf("g_uBs3CpuDetected=%#x\n", g_uBs3CpuDetected);
-
-    Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
-
-    Bs3TestTerm();
-for (;;) { }
-}
-
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.c
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.c	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.c	(revision 60609)
@@ -26,6 +26,4 @@
 
 
-#ifdef BS3_INSTANTIATING_MODE
-
 /*********************************************************************************************************************************
 *   Header Files                                                                                                                 *
@@ -38,4 +36,13 @@
 *   Defined Constants And Macros                                                                                                 *
 *********************************************************************************************************************************/
+#undef  CHECK_MEMBER
+#define CHECK_MEMBER(a_szName, a_szFmt, a_Actual, a_Expected) \
+    do \
+    { \
+        if ((a_Actual) == (a_Expected)) { /* likely */ } \
+        else bs3CpuBasic2_FailedF(a_szName "=" a_szFmt " expected " a_szFmt, (a_Actual), (a_Expected)); \
+    } while (0)
+
+#ifdef BS3_INSTANTIATING_MODE
 # undef MyBs3Idt
 # undef MY_SYS_SEL_R0_CS
@@ -64,18 +71,10 @@
 #  error "TMPL_MODE"
 # endif
-#undef  CHECK_MEMBER
-#define CHECK_MEMBER(a_szName, a_szFmt, a_Actual, a_Expected) \
-    do \
-    { \
-        if ((a_Actual) == (a_Expected)) { /* likely */ } \
-        else bs3CpuBasic2_FailedF(a_szName "=" a_szFmt " expected " a_szFmt, (a_Actual), (a_Expected)); \
-    } while (0)
-
+#endif
 
 /*********************************************************************************************************************************
 *   Structures and Typedefs                                                                                                      *
 *********************************************************************************************************************************/
-#ifndef DONE_MODE_TYPES
-#define DONE_MODE_TYPES
+#ifdef BS3_INSTANTIATING_CMN
 typedef struct BS3CB2INVLDESCTYPE
 {
@@ -89,15 +88,17 @@
 *   External Symbols                                                                                                             *
 *********************************************************************************************************************************/
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_Int80)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_Int81)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_Int82)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_Int83)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_ud2)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_sidt_bx_ud2)(void);
-extern BS3_DECL(void) TMPL_NM(bs3CpuBasic2_lidt_bx_ud2)(void);
-#ifndef DOXYGEN_RUNNING
-# define g_bs3CpuBasic2_ud2_FlatAddr BS3_DATA_NM(g_bs3CpuBasic2_ud2_FlatAddr)
+#ifdef BS3_INSTANTIATING_CMN
+extern BS3_DECL(void)   bs3CpuBasic2_Int80(void);
+extern BS3_DECL(void)   bs3CpuBasic2_Int81(void);
+extern BS3_DECL(void)   bs3CpuBasic2_Int82(void);
+extern BS3_DECL(void)   bs3CpuBasic2_Int83(void);
+extern BS3_DECL(void)   bs3CpuBasic2_ud2(void);
+#define                 bs3CpuBasic2_sidt_bx_ud2 BS3_CMN_NM(bs3CpuBasic2_sidt_bx_ud2)
+extern BS3_DECL(void)   bs3CpuBasic2_sidt_bx_ud2(void);
+#define                 bs3CpuBasic2_lidt_bx_ud2 BS3_CMN_NM(bs3CpuBasic2_lidt_bx_ud2)
+extern BS3_DECL(void)   bs3CpuBasic2_lidt_bx_ud2(void);
+#define                 g_bs3CpuBasic2_ud2_FlatAddr BS3_DATA_NM(g_bs3CpuBasic2_ud2_FlatAddr)
+extern uint32_t         g_bs3CpuBasic2_ud2_FlatAddr;
 #endif
-extern uint32_t g_bs3CpuBasic2_ud2_FlatAddr;
 
 
@@ -105,10 +106,10 @@
 *   Global Variables                                                                                                             *
 *********************************************************************************************************************************/
-#if TMPL_MODE == BS3_MODE_RM || TMPL_MODE == BS3_MODE_PE16_32 || TMPL_MODE == BS3_MODE_LM64
-#define g_pszTestMode   BS3_CMN_NM(g_pszTestMode)
+#ifdef BS3_INSTANTIATING_CMN
+# define                    g_pszTestMode   BS3_CMN_NM(g_pszTestMode)
 static const char BS3_FAR  *g_pszTestMode = (const char *)1;
-#define g_bTestMode     BS3_CMN_NM(g_bTestMode)
+# define                    g_bTestMode     BS3_CMN_NM(g_bTestMode)
 static uint8_t              g_bTestMode = 1;
-#define g_f16BitSys     BS3_CMN_NM(g_f16BitSys)
+# define                    g_f16BitSys     BS3_CMN_NM(g_f16BitSys)
 static bool                 g_f16BitSys = 1;
 
@@ -171,7 +172,7 @@
 };
 
-#endif
-
-#if TMPL_MODE == BS3_MODE_RM || TMPL_MODE == BS3_MODE_PE16_32 || TMPL_MODE == BS3_MODE_LM64
+#endif /* BS3_INSTANTIATING_CMN - global */
+
+#ifdef BS3_INSTANTIATING_CMN
 
 /**
@@ -179,6 +180,6 @@
  * and g_pszTestMode.
  */
-#define bs3CpuBasic2_FailedF BS3_CMN_NM(bs3CpuBasic2_FailedF)
-void bs3CpuBasic2_FailedF(const char *pszFormat, ...)
+# define bs3CpuBasic2_FailedF BS3_CMN_NM(bs3CpuBasic2_FailedF)
+BS3_DECL_NEAR(void) bs3CpuBasic2_FailedF(const char *pszFormat, ...)
 {
     va_list va;
@@ -196,6 +197,6 @@
  * Compares trap stuff.
  */
-#define bs3CpuBasic2_CompareIntCtx1 BS3_CMN_NM(bs3CpuBasic2_CompareIntCtx1)
-void bs3CpuBasic2_CompareIntCtx1(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint8_t bXcpt)
+# define bs3CpuBasic2_CompareIntCtx1 BS3_CMN_NM(bs3CpuBasic2_CompareIntCtx1)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareIntCtx1(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint8_t bXcpt)
 {
     uint16_t const cErrorsBefore = Bs3TestSubErrorCount();
@@ -218,7 +219,7 @@
  * Compares trap stuff.
  */
-#define bs3CpuBasic2_CompareTrapCtx2 BS3_CMN_NM(bs3CpuBasic2_CompareTrapCtx2)
-void bs3CpuBasic2_CompareTrapCtx2(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t cbIpAdjust, uint8_t bXcpt,
-                                  uint16_t uHandlerCs)
+# define bs3CpuBasic2_CompareTrapCtx2 BS3_CMN_NM(bs3CpuBasic2_CompareTrapCtx2)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareTrapCtx2(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t cbIpAdjust,
+                                                 uint8_t bXcpt, uint16_t uHandlerCs)
 {
     uint16_t const cErrorsBefore = Bs3TestSubErrorCount();
@@ -241,7 +242,7 @@
  * Compares a CPU trap.
  */
-#define bs3CpuBasic2_CompareCpuTrapCtx BS3_CMN_NM(bs3CpuBasic2_CompareCpuTrapCtx)
-void bs3CpuBasic2_CompareCpuTrapCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd, uint8_t bXcpt,
-                                    bool f486ResumeFlagHint)
+# define bs3CpuBasic2_CompareCpuTrapCtx BS3_CMN_NM(bs3CpuBasic2_CompareCpuTrapCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareCpuTrapCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd,
+                                                   uint8_t bXcpt, bool f486ResumeFlagHint)
 {
     uint16_t const cErrorsBefore = Bs3TestSubErrorCount();
@@ -277,6 +278,6 @@
  * Compares \#GP trap.
  */
-#define bs3CpuBasic2_CompareGpCtx BS3_CMN_NM(bs3CpuBasic2_CompareGpCtx)
-void bs3CpuBasic2_CompareGpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
+# define bs3CpuBasic2_CompareGpCtx BS3_CMN_NM(bs3CpuBasic2_CompareGpCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareGpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
 {
     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_GP, true /*f486ResumeFlagHint*/);
@@ -286,6 +287,6 @@
  * Compares \#NP trap.
  */
-#define bs3CpuBasic2_CompareNpCtx BS3_CMN_NM(bs3CpuBasic2_CompareNpCtx)
-void bs3CpuBasic2_CompareNpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
+# define bs3CpuBasic2_CompareNpCtx BS3_CMN_NM(bs3CpuBasic2_CompareNpCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareNpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
 {
     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_NP, true /*f486ResumeFlagHint*/);
@@ -295,6 +296,6 @@
  * Compares \#SS trap.
  */
-#define bs3CpuBasic2_CompareSsCtx BS3_CMN_NM(bs3CpuBasic2_CompareSsCtx)
-void bs3CpuBasic2_CompareSsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd, bool f486ResumeFlagHint)
+# define bs3CpuBasic2_CompareSsCtx BS3_CMN_NM(bs3CpuBasic2_CompareSsCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareSsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd, bool f486ResumeFlagHint)
 {
     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_SS, f486ResumeFlagHint);
@@ -304,6 +305,6 @@
  * Compares \#TS trap.
  */
-#define bs3CpuBasic2_CompareTsCtx BS3_CMN_NM(bs3CpuBasic2_CompareTsCtx)
-void bs3CpuBasic2_CompareTsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
+# define bs3CpuBasic2_CompareTsCtx BS3_CMN_NM(bs3CpuBasic2_CompareTsCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareTsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
 {
     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_TS, false /*f486ResumeFlagHint*/);
@@ -313,6 +314,6 @@
  * Compares \#PF trap.
  */
-#define bs3CpuBasic2_ComparePfCtx BS3_CMN_NM(bs3CpuBasic2_ComparePfCtx)
-void bs3CpuBasic2_ComparePfCtx(PCBS3TRAPFRAME pTrapCtx, PBS3REGCTX pStartCtx, uint16_t uErrCd, uint64_t uCr2Expected)
+# define bs3CpuBasic2_ComparePfCtx BS3_CMN_NM(bs3CpuBasic2_ComparePfCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_ComparePfCtx(PCBS3TRAPFRAME pTrapCtx, PBS3REGCTX pStartCtx, uint16_t uErrCd, uint64_t uCr2Expected)
 {
     uint64_t const uCr2Saved     = pStartCtx->cr2.u;
@@ -325,6 +326,6 @@
  * Compares \#UD trap.
  */
-#define bs3CpuBasic2_CompareUdCtx BS3_CMN_NM(bs3CpuBasic2_CompareUdCtx)
-void bs3CpuBasic2_CompareUdCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
+# define bs3CpuBasic2_CompareUdCtx BS3_CMN_NM(bs3CpuBasic2_CompareUdCtx)
+BS3_DECL_NEAR(void) bs3CpuBasic2_CompareUdCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
 {
     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*no error code*/, X86_XCPT_UD, true /*f486ResumeFlagHint*/);
@@ -332,8 +333,7 @@
 
 
-#define bs3CpuBasic2_RaiseXcpt1Common BS3_CMN_NM(bs3CpuBasic2_RaiseXcpt1Common)
-static void bs3CpuBasic2_RaiseXcpt1Common(bool const g_f16BitSys,
-                                          uint16_t const uSysR0Cs, uint16_t const uSysR0CsConf, uint16_t const uSysR0Ss,
-                                          PX86DESC const paIdt, unsigned const cIdteShift)
+# define bs3CpuBasic2_RaiseXcpt1Common BS3_CMN_NM(bs3CpuBasic2_RaiseXcpt1Common)
+BS3_DECL_NEAR(void) bs3CpuBasic2_RaiseXcpt1Common(uint16_t const uSysR0Cs, uint16_t const uSysR0CsConf, uint16_t const uSysR0Ss,
+                                                  PX86DESC const paIdt, unsigned const cIdteShift)
 {
     BS3TRAPFRAME    TrapCtx;
@@ -406,5 +406,5 @@
     Bs3RegCtxSave(&Ctx80);
     Ctx80.rsp.u -= 0x300;
-    Ctx80.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_Int80));
+    Ctx80.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_Int80);
 # if TMPL_BITS == 16
     Ctx80.cs = BS3_MODE_IS_RM_OR_V86(g_bTestMode) ? BS3_SEL_TEXT16 : BS3_SEL_R0_CS16;
@@ -413,9 +413,9 @@
 # endif
     Bs3MemCpy(&Ctx81, &Ctx80, sizeof(Ctx80));
-    Ctx81.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_Int81));
+    Ctx81.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_Int81);
     Bs3MemCpy(&Ctx82, &Ctx80, sizeof(Ctx80));
-    Ctx82.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_Int82));
+    Ctx82.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_Int82);
     Bs3MemCpy(&Ctx83, &Ctx80, sizeof(Ctx80));
-    Ctx83.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_Int83));
+    Ctx83.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_Int83);
 
     /*
@@ -1283,5 +1283,5 @@
                 }
 
-                paIdt[(0x80 + iCtx) << cIdteShift].Gate.u16Sel     = MY_SYS_SEL_R0_CS;
+                paIdt[(0x80 + iCtx) << cIdteShift].Gate.u16Sel     = uSysR0Cs;
                 paIdt[(0x80 + iCtx) << cIdteShift].Gate.u4Type     = bSavedType;
                 paIdt[(0x80 + iCtx) << cIdteShift].Gate.u1DescType = 0;
@@ -1305,6 +1305,6 @@
 
 
-#define bs3CpuBasic2_sidt_Common BS3_CMN_NM(bs3CpuBasic2_sidt_Common)
-void bs3CpuBasic2_sidt_Common(void)
+# define bs3CpuBasic2_sidt_Common BS3_CMN_NM(bs3CpuBasic2_sidt_Common)
+BS3_DECL_NEAR(void) bs3CpuBasic2_sidt_Common(void)
 {
     BS3TRAPFRAME        TrapCtx;
@@ -1324,5 +1324,5 @@
     Bs3RegCtxSave(&Ctx);
     Ctx.rsp.u -= 0x80;
-    Ctx.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_sidt_bx_ud2));
+    Ctx.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_sidt_bx_ud2);
 # if TMPL_BITS == 32
     g_uBs3TrapEipHint = Ctx.rip.u32;
@@ -1343,15 +1343,13 @@
 }
 
-#endif /* once for each bitcount */
-
-
-#if TMPL_MODE == BS3_MODE_PE16 || TMPL_MODE == BS3_MODE_PE16_32
+# if ARCH_BITS != 64
 
 /**
  * Worker for bs3CpuBasic2_TssGateEsp that tests the INT 80 from outer rings.
  */
-#define bs3CpuBasic2_TssGateEsp_AltStackOuterRing BS3_CMN_NM(bs3CpuBasic2_TssGateEsp_AltStackOuterRing)
-void bs3CpuBasic2_TssGateEsp_AltStackOuterRing(PCBS3REGCTX pCtx, uint8_t bRing, uint8_t *pbAltStack, size_t cbAltStack,
-                                               bool f16BitStack, bool f16BitTss, bool f16BitHandler, unsigned uLine)
+#  define bs3CpuBasic2_TssGateEsp_AltStackOuterRing BS3_CMN_NM(bs3CpuBasic2_TssGateEsp_AltStackOuterRing)
+BS3_DECL_NEAR(void) bs3CpuBasic2_TssGateEsp_AltStackOuterRing(PCBS3REGCTX pCtx, uint8_t bRing, uint8_t *pbAltStack,
+                                                              size_t cbAltStack, bool f16BitStack, bool f16BitTss,
+                                                              bool f16BitHandler, unsigned uLine)
 {
     uint8_t const   cbIretFrame = f16BitHandler ? 5*2 : 5*4;
@@ -1401,13 +1399,13 @@
 }
 
-#define bs3CpuBasic2_TssGateEspCommon BS3_CMN_NM(bs3CpuBasic2_TssGateEspCommon)
-void bs3CpuBasic2_TssGateEspCommon(bool const g_f16BitSys, PX86DESC const paIdt, unsigned const cIdteShift)
+#  define bs3CpuBasic2_TssGateEspCommon BS3_CMN_NM(bs3CpuBasic2_TssGateEspCommon)
+BS3_DECL_NEAR(void) bs3CpuBasic2_TssGateEspCommon(bool const g_f16BitSys, PX86DESC const paIdt, unsigned const cIdteShift)
 {
     BS3TRAPFRAME    TrapCtx;
     BS3REGCTX       Ctx;
     BS3REGCTX       Ctx2;
-# if TMPL_BITS == 16
+#  if TMPL_BITS == 16
     uint8_t        *pbTmp;
-# endif
+#  endif
 
     /* make sure they're allocated  */
@@ -1418,8 +1416,8 @@
     Bs3RegCtxSave(&Ctx);
     Ctx.rsp.u -= 0x80;
-    Ctx.rip.u  = (uintptr_t)BS3_FP_OFF(&TMPL_NM(bs3CpuBasic2_Int80));
-# if TMPL_BITS == 32
+    Ctx.rip.u  = (uintptr_t)BS3_FP_OFF(&bs3CpuBasic2_Int80);
+#  if TMPL_BITS == 32
     g_uBs3TrapEipHint = Ctx.rip.u32;
-# endif
+#  endif
 
     /*
@@ -1458,12 +1456,12 @@
                 Bs3RegCtxRestore(&Ctx2, 0); /* (does not return) */
             bs3CpuBasic2_CompareIntCtx1(&TrapCtx, &Ctx2, 0x80 /*bXcpt*/);
-# if TMPL_BITS == 16
+#  if TMPL_BITS == 16
             if ((pbTmp = (uint8_t *)ASMMemFirstNonZero(pbAltStack, cbAltStack)) != NULL)
                 bs3CpuBasic2_FailedF("someone touched the alt stack (%p) with SS:ESP=%04x:%#RX32: %p=%02x\n",
                                      pbAltStack, Ctx2.ss, Ctx2.rsp.u32, pbTmp, *pbTmp);
-# else
+#  else
             if (ASMMemIsZero(pbAltStack, cbAltStack))
                 bs3CpuBasic2_FailedF("alt stack wasn't used despite SS:ESP=%04x:%#RX32\n", Ctx2.ss, Ctx2.rsp.u32);
-# endif
+#  endif
 
             /* Different rings (load SS0:SP0 from TSS). */
@@ -1500,6 +1498,14 @@
 }
 
-#endif /* PE16 || PE32 */
-
+# endif /* ARCH_BITS != 64 */
+#endif /* BS3_INSTANTIATING_CMN */
+
+
+/*
+ * Mode specific code.
+ * Mode specific code.
+ * Mode specific code.
+ */
+#ifdef BS3_INSTANTIATING_MODE
 
 BS3_DECL_FAR(uint8_t) TMPL_NM(bs3CpuBasic2_TssGateEsp)(uint8_t bMode)
@@ -1511,5 +1517,5 @@
     g_f16BitSys   = BS3_MODE_IS_16BIT_SYS(TMPL_MODE);
 
-#if TMPL_MODE == BS3_MODE_PE16 \
+# if TMPL_MODE == BS3_MODE_PE16 \
  || TMPL_MODE == BS3_MODE_PE16_32 \
  || TMPL_MODE == BS3_MODE_PP16 \
@@ -1521,7 +1527,7 @@
                                   (PX86DESC)MyBs3Idt,
                                   BS3_MODE_IS_64BIT_SYS(TMPL_MODE) ? 1 : 0);
-#else
+# else
     bRet = BS3TESTDOMODE_SKIPPED;
-#endif
+# endif
 
     /*
@@ -1539,11 +1545,10 @@
     g_f16BitSys   = BS3_MODE_IS_16BIT_SYS(TMPL_MODE);
 
-#if !BS3_MODE_IS_RM_OR_V86(TMPL_MODE)
+# if !BS3_MODE_IS_RM_OR_V86(TMPL_MODE)
 
     /*
      * Pass to common worker which is only compiled once per mode.
      */
-    bs3CpuBasic2_RaiseXcpt1Common(BS3_MODE_IS_16BIT_SYS(TMPL_MODE),
-                                  MY_SYS_SEL_R0_CS,
+    bs3CpuBasic2_RaiseXcpt1Common(MY_SYS_SEL_R0_CS,
                                   MY_SYS_SEL_R0_CS_CNF,
                                   MY_SYS_SEL_R0_SS,
@@ -1556,5 +1561,5 @@
     Bs3TrapInit();
     return 0;
-#elif TMPL_MODE == BS3_MODE_RM
+# elif TMPL_MODE == BS3_MODE_RM
 
     /*
@@ -1564,7 +1569,7 @@
     return BS3TESTDOMODE_SKIPPED;
 
-#else
+# else
     return BS3TESTDOMODE_SKIPPED;
-#endif
+# endif
 }
 
@@ -1577,7 +1582,7 @@
 
     Bs3PrintStrN(RT_STR_TUPLE("Hello world!\n"));
-#if !BS3_MODE_IS_V86(TMPL_MODE)
+# if !BS3_MODE_IS_V86(TMPL_MODE)
     Bs3TestPrintf(RT_STR_TUPLE("Hi there!\n"));
-#endif
+# endif
     return BS3TESTDOMODE_SKIPPED;
 }
@@ -1604,5 +1609,4 @@
 }
 
-
 #endif /* BS3_INSTANTIATING_MODE */
 
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac	(revision 60609)
@@ -39,5 +39,10 @@
 TMPL_BEGIN_TEXT
 
-%if 0 ; Will be doing the testing in C, I think.
+;
+; Code that is instantiated for every possible CPU mode
+;
+%ifdef BS3_INSTANTIATING_MODE
+
+ %if 0 ; Will be doing the testing in C, I think.
 BS3_PROC_BEGIN_MODE bs3CpuBasic2_iret, BS3_PBC_FAR
         BS3_CALL_CONV_PROLOG 1
@@ -46,6 +51,6 @@
         sub     xSP, 20h
 
-%if TMPL_BITS == 64
-%if TMPL_BITS == 16
+ %if TMPL_BITS == 64
+  %if TMPL_BITS == 16
         xor     ax, ax
         mov     al, [xBP + xCB*2]
@@ -55,5 +60,5 @@
         call    Bs3Printf
         add     sp, 6
-%else
+  %else
         movzx   xDX, byte [xBP + xCB*2]
         push    xDX
@@ -61,6 +66,6 @@
         BS3_CALL Bs3Printf, 2
         add     xSP, xCB * 2
-%endif
-%endif
+  %endif
+ %endif
 
         ; Return
@@ -76,49 +81,29 @@
 
 BS3_PROC_END_MODE   bs3CpuBasic2_iret
-%endif
+ %endif
+
+%endif ; BS3_INSTANTIATING_MODE
 
 
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_Int80, BS3_PBC_NEAR
-        int     80h
-.again: ud2
-        jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_Int80
+;
+; Test code snippets containing code which differs between 16-bit, 32-bit
+; and 64-bit CPUs modes.
+;
+%ifdef BS3_INSTANTIATING_CMN
 
-
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_Int81, BS3_PBC_NEAR
-        int     81h
-.again: ud2
-        jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_Int81
-
-
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_Int82, BS3_PBC_NEAR
-        int     82h
-.again: ud2
-        jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_Int82
-
-
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_Int83, BS3_PBC_NEAR
-        int     83h
-.again: ud2
-        jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_Int83
-
-
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_sidt_bx_ud2, BS3_PBC_NEAR
+BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_bx_ud2, BS3_PBC_NEAR
         sidt    [xBX]
 .again: ud2
         jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_sidt_bx_ud2
+BS3_PROC_END_CMN   bs3CpuBasic2_sidt_bx_ud2
 
 
-BS3_PROC_BEGIN_MODE bs3CpuBasic2_lidt_bx_ud2, BS3_PBC_NEAR
+BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_bx_ud2, BS3_PBC_NEAR
         lidt    [xBX]
 .again: ud2
         jmp     .again
-BS3_PROC_END_MODE   bs3CpuBasic2_lidt_bx_ud2
+BS3_PROC_END_CMN   bs3CpuBasic2_lidt_bx_ud2
 
-
+%endif ; BS3_INSTANTIATING_CMN
 
 %include "bs3kit-template-footer.mac"   ; reset environment
Index: unk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.asm
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.asm	(revision 60608)
+++ 	(revision )
@@ -1,54 +1,0 @@
-; $Id$
-;; @file
-; BS3Kit - bs3-cpu-basic-2
-;
-
-;
-; Copyright (C) 2007-2016 Oracle Corporation
-;
-; This file is part of VirtualBox Open Source Edition (OSE), as
-; available from http://www.virtualbox.org. This file is free software;
-; you can redistribute it and/or modify it under the terms of the GNU
-; General Public License (GPL) as published by the Free Software
-; Foundation, in version 2 as it comes in the "COPYING" file of the
-; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-;
-; The contents of this file may alternatively be used under the terms
-; of the Common Development and Distribution License Version 1.0
-; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
-; VirtualBox OSE distribution, in which case the provisions of the
-; CDDL are applicable instead of those of the GPL.
-;
-; You may elect to license modified versions of this file under the
-; terms and conditions of either the GPL or the CDDL or both.
-;
-
-
-;*********************************************************************************************************************************
-;*  Header Files                                                                                                                 *
-;*********************************************************************************************************************************
-%include "bs3kit.mac"
-
-
-;*********************************************************************************************************************************
-;*      Global Variables                                                                                                         *
-;*********************************************************************************************************************************
-BS3_BEGIN_DATA16
-BS3_GLOBAL_DATA g_bs3CpuBasic2_ud2_FlatAddr, 4
-        dd  bs3CpuBasic2_ud2 wrt FLAT
-
-
-BS3_BEGIN_TEXT16
-BS3_PROC_BEGIN  bs3CpuBasic2_ud2
-.again:
-        ud2
-        jmp     .again
-BS3_PROC_END    bs3CpuBasic2_ud2
-
-
-
-;BS3_INSTANTIATE_COMMON_TEMPLATE "bs3-cpu-basic-2-template.mac"
-BS3_INSTANTIATE_TEMPLATE_WITH_WEIRD_ONES "bs3-cpu-basic-2-template.mac"
-
-
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c	(revision 60609)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c	(revision 60609)
@@ -0,0 +1,69 @@
+/* $Id$ */
+/** @file
+ * BS3Kit - bs3-cpu-basic-2, 16-bit C code.
+ */
+
+/*
+ * Copyright (C) 2007-2016 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <bs3kit.h>
+#include <iprt/asm-amd64-x86.h>
+
+
+/*********************************************************************************************************************************
+*   Internal Functions                                                                                                           *
+*********************************************************************************************************************************/
+BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_TssGateEsp);
+BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_RaiseXcpt1);
+//BS3TESTMODE_PROTOTYPES_CMN(bs3CpuBasic2_iret);
+BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_iret);
+BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_sidt);
+
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
+static const BS3TESTMODEENTRY g_aModeTest[] =
+{
+    //BS3TESTMODEENTRY_MODE("tss / gate / esp", bs3CpuBasic2_TssGateEsp),
+    BS3TESTMODEENTRY_MODE("raise xcpt #1", bs3CpuBasic2_RaiseXcpt1),
+    //BS3TESTMODEENTRY_CMN("iret", bs3CpuBasic2_iret),
+    BS3TESTMODEENTRY_MODE("iret", bs3CpuBasic2_iret),
+//    BS3TESTMODEENTRY_MODE("sidt", bs3CpuBasic2_sidt),
+};
+
+
+BS3_DECL(void) Main_rm()
+{
+    Bs3InitAll_rm();
+    Bs3TestInit("bs3-cpu-basic-2");
+    Bs3TestPrintf("g_uBs3CpuDetected=%#x\n", g_uBs3CpuDetected);
+
+    Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
+
+    Bs3TestTerm();
+for (;;) { }
+}
+
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-instantiate-common.h
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-instantiate-common.h	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-instantiate-common.h	(revision 60609)
@@ -1,6 +1,37 @@
+/* $Id$ */
+/** @file
+ * BS3Kit - Common template instantiator body.
+ */
+
+/*
+ * Copyright (C) 2007-2016 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
 
 
 /*
  * Instantiating common code (c16, c32, c64).
+ * This must be done first.
+ */
+
+/** @def BS3_INSTANTIATING_CMN
+ * @ingroup grp_bs3kit_tmpl
+ * Indicates that we're instantiating common code (c16, c32, c64).
  */
 #define BS3_INSTANTIATING_CMN
@@ -37,5 +68,10 @@
 
 /*
- * Instantiating code for each individual mode (rm, pe16, pe16_32, ..).
+ * Instantiating code for each individual mode (rm, pe16, pe16_32, ...).
+ */
+
+/** @def BS3_INSTANTIATING_MODE
+ * @ingroup grp_bs3kit_tmpl
+ * Indicates that we're instantiating mode specific code (rm, pe16, ...).
  */
 #define BS3_INSTANTIATING_MODE
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h	(revision 60609)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2007-2015 Oracle Corporation
+ * Copyright (C) 2007-2016 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -37,4 +37,67 @@
 #endif
 
+
+
+/** @def BS3_USE_ALT_16BIT_TEXT_SEG
+ * @ingroup grp_bs3kit
+ * Combines the BS3_USE_RM_TEXT_SEG,  BS3_USE_X0_TEXT_SEG, and
+ * BS3_USE_X1_TEXT_SEG indicators into a single one.
+ */
+#if defined(BS3_USE_RM_TEXT_SEG) || defined(BS3_USE_X0_TEXT_SEG) || defined(BS3_USE_X1_TEXT_SEG)
+# define BS3_USE_ALT_16BIT_TEXT_SEG
+#else
+# undef  BS3_USE_ALT_16BIT_TEXT_SEG
+#endif
+
+/** @def BS3_USE_X0_TEXT_SEG
+ * @ingroup grp_bs3kit
+ * Emit 16-bit code to the BS3X0TEXT16 segment - ignored for 32-bit and 64-bit.
+ *
+ * Calling directly into the BS3X0TEXT16 segment is only possible in real-mode
+ * and v8086 mode.  In protected mode the real far pointer have to be converted
+ * to a protected mode pointer that uses BS3_SEL_X0TEXT16_CS, Bs3TestDoModes and
+ * associates does this automatically.
+ */
+#ifdef DOXYGEN_RUNNING
+# define BS3_USE_X0_TEXT_SEG
+#endif
+
+/** @def BS3_USE_X1_TEXT_SEG
+ * @ingroup grp_bs3kit
+ * Emit 16-bit code to the BS3X1TEXT16 segment - ignored for 32-bit and 64-bit.
+ *
+ * Calling directly into the BS3X1TEXT16 segment is only possible in real-mode
+ * and v8086 mode.  In protected mode the real far pointer have to be converted
+ * to a protected mode pointer that uses BS3_SEL_X1TEXT16_CS, Bs3TestDoModes and
+ * associates does this automatically.
+ */
+#ifdef DOXYGEN_RUNNING
+# define BS3_USE_X1_TEXT_SEG
+#endif
+
+/** @def BS3_USE_RM_TEXT_SEG
+ * @ingroup grp_bs3kit
+ * Emit 16-bit code to the BS3RMTEXT16 segment - ignored for 32-bit and 64-bit.
+ *
+ * This segment is normally used for real-mode only code, though
+ * BS3_SEL_RMTEXT16_CS can be used to call it from protected mode.  Unlike the
+ * BS3X0TEXT16 and BS3X1TEXT16 segments which are empty by default, this segment
+ * is used by common BS3Kit code.
+ */
+#ifdef DOXYGEN_RUNNING
+# define BS3_USE_X0_TEXT_SEG
+#endif
+
+/** @def BS3_MODEL_FAR_CODE
+ * @ingroup grp_bs3kit
+ * Default compiler model indicates far code.
+ */
+#ifdef DOXYGEN_RUNNING
+# define BS3_MODEL_FAR_CODE
+#elif !defined(BS3_MODEL_FAR_CODE) && (defined(__LARGE__) || defined(__MEDIUM__) || defined(__HUGE__)) && ARCH_BITS == 16
+# define BS3_MODEL_FAR_CODE
+#endif
+
+
 /*
  * We normally don't want the noreturn / aborts attributes as they mess up stack traces.
@@ -47,25 +110,4 @@
 # undef  DECL_NO_RETURN
 # define DECL_NO_RETURN(type) type
-#endif
-
-/** @def BS3_USE_ALT_16BIT_TEXT_SEG
- * @ingroup grp_bs3kit
- * Combines the BS3_USE_RM_TEXT_SEG,  BS3_USE_X0_TEXT_SEG, and
- * BS3_USE_X1_TEXT_SEG indicators into a single one.
- */
-#if defined(BS3_USE_RM_TEXT_SEG) || defined(BS3_USE_X0_TEXT_SEG) || defined(BS3_USE_X1_TEXT_SEG)
-# define BS3_USE_ALT_16BIT_TEXT_SEG
-#else
-# undef  BS3_USE_ALT_16BIT_TEXT_SEG
-#endif
-
-/** @def BS3_MODEL_FAR_CODE
- * @ingroup grp_bs3kit
- * Default compiler model indicates far code.
- */
-#ifdef DOXYGEN_RUNNING
-# define BS3_MODEL_FAR_CODE
-#elif !defined(BS3_MODEL_FAR_CODE) && (defined(__LARGE__) || defined(__MEDIUM__) || defined(__HUGE__)) && ARCH_BITS == 16
-# define BS3_MODEL_FAR_CODE
 #endif
 
@@ -98,4 +140,5 @@
  */
 #include "bs3kit-mangling-data.h"
+
 
 
@@ -579,7 +622,7 @@
  * @param a_Type        The return type. */
 #ifdef IN_BS3KIT
-# define BS3_DECL_CALLBACK(a_Type)   a_Type BS3_NEAR_CODE BS3_CALL
+# define BS3_DECL_CALLBACK(a_Type)   a_Type BS3_FAR_CODE BS3_CALL
 #else
-# define BS3_DECL_CALLBACK(a_Type)   a_Type BS3_NEAR_CODE BS3_CALL
+# define BS3_DECL_CALLBACK(a_Type)   a_Type BS3_FAR_CODE BS3_CALL
 #endif
 
@@ -1298,7 +1341,12 @@
  */
 #if ARCH_BITS == 16
-# define BS3_CMN_PROTO_INT(a_RetType, a_Name, a_Params) \
+# ifndef BS3_USE_ALT_16BIT_TEXT_SEG
+#  define BS3_CMN_PROTO_INT(a_RetType, a_Name, a_Params) \
     BS3_DECL_NEAR(a_RetType) BS3_CMN_NM(a_Name) a_Params;  \
     BS3_DECL_FAR(a_RetType)  BS3_CMN_FAR_NM(a_Name) a_Params
+# else
+#  define BS3_CMN_PROTO_INT(a_RetType, a_Name, a_Params) \
+    BS3_DECL_FAR(a_RetType)  BS3_CMN_FAR_NM(a_Name) a_Params
+# endif
 #else
 # define BS3_CMN_PROTO_INT(a_RetType, a_Name, a_Params) \
@@ -2449,9 +2497,7 @@
  * @param   bMode       The current CPU mode.
  */
-typedef BS3_DECL_CALLBACK(uint8_t) FNBS3TESTDOMODE(uint8_t bMode);
-/** Near pointer to a test (for 16-bit code). */
-typedef FNBS3TESTDOMODE               *PFNBS3TESTDOMODE;
-/** Far pointer to a test (for 32-bit and 64-bit code, will be flatten). */
-typedef FNBS3TESTDOMODE BS3_FAR_CODE  *FPFNBS3TESTDOMODE;
+typedef BS3_DECL_CALLBACK(uint8_t)  FNBS3TESTDOMODE(uint8_t bMode);
+/** Pointer (far) to a test (for 32-bit and 64-bit code, will be flatten). */
+typedef FNBS3TESTDOMODE            *PFNBS3TESTDOMODE;
 
 /** Special FNBS3TESTDOMODE return code for indicating a skipped mode test.  */
@@ -2472,30 +2518,30 @@
     const char * BS3_FAR    pszSubTest;
 
-    FPFNBS3TESTDOMODE       pfnDoRM;
-
-    FPFNBS3TESTDOMODE       pfnDoPE16;
-    FPFNBS3TESTDOMODE       pfnDoPE16_32;
-    FPFNBS3TESTDOMODE       pfnDoPE16_V86;
-    FPFNBS3TESTDOMODE       pfnDoPE32;
-    FPFNBS3TESTDOMODE       pfnDoPE32_16;
-    FPFNBS3TESTDOMODE       pfnDoPEV86;
-
-    FPFNBS3TESTDOMODE       pfnDoPP16;
-    FPFNBS3TESTDOMODE       pfnDoPP16_32;
-    FPFNBS3TESTDOMODE       pfnDoPP16_V86;
-    FPFNBS3TESTDOMODE       pfnDoPP32;
-    FPFNBS3TESTDOMODE       pfnDoPP32_16;
-    FPFNBS3TESTDOMODE       pfnDoPPV86;
-
-    FPFNBS3TESTDOMODE       pfnDoPAE16;
-    FPFNBS3TESTDOMODE       pfnDoPAE16_32;
-    FPFNBS3TESTDOMODE       pfnDoPAE16_V86;
-    FPFNBS3TESTDOMODE       pfnDoPAE32;
-    FPFNBS3TESTDOMODE       pfnDoPAE32_16;
-    FPFNBS3TESTDOMODE       pfnDoPAEV86;
-
-    FPFNBS3TESTDOMODE       pfnDoLM16;
-    FPFNBS3TESTDOMODE       pfnDoLM32;
-    FPFNBS3TESTDOMODE       pfnDoLM64;
+    PFNBS3TESTDOMODE        pfnDoRM;
+
+    PFNBS3TESTDOMODE        pfnDoPE16;
+    PFNBS3TESTDOMODE        pfnDoPE16_32;
+    PFNBS3TESTDOMODE        pfnDoPE16_V86;
+    PFNBS3TESTDOMODE        pfnDoPE32;
+    PFNBS3TESTDOMODE        pfnDoPE32_16;
+    PFNBS3TESTDOMODE        pfnDoPEV86;
+
+    PFNBS3TESTDOMODE        pfnDoPP16;
+    PFNBS3TESTDOMODE        pfnDoPP16_32;
+    PFNBS3TESTDOMODE        pfnDoPP16_V86;
+    PFNBS3TESTDOMODE        pfnDoPP32;
+    PFNBS3TESTDOMODE        pfnDoPP32_16;
+    PFNBS3TESTDOMODE        pfnDoPPV86;
+
+    PFNBS3TESTDOMODE        pfnDoPAE16;
+    PFNBS3TESTDOMODE        pfnDoPAE16_32;
+    PFNBS3TESTDOMODE        pfnDoPAE16_V86;
+    PFNBS3TESTDOMODE        pfnDoPAE32;
+    PFNBS3TESTDOMODE        pfnDoPAE32_16;
+    PFNBS3TESTDOMODE        pfnDoPAEV86;
+
+    PFNBS3TESTDOMODE        pfnDoLM16;
+    PFNBS3TESTDOMODE        pfnDoLM32;
+    PFNBS3TESTDOMODE        pfnDoLM64;
 
 } BS3TESTMODEENTRY;
@@ -2571,26 +2617,26 @@
  * A set of standard protypes to go with #BS3TESTMODEENTRY_MODE. */
 #define BS3TESTMODE_PROTOTYPES_MODE(a_BaseNm) \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _rm); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pe16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pe16_32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pe16_v86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pe32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pe32_16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pev86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pp16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pp16_32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pp16_v86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pp32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pp32_16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _ppv86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pae16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pae16_32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pae16_v86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pae32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _pae32_16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _paev86); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _lm16); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _lm32); \
-    FNBS3TESTDOMODE BS3_FAR_CODE RT_CONCAT(a_BaseNm, _lm64)
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _rm); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pe16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pe16_32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pe16_v86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pe32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pe32_16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pev86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pp16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pp16_32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pp16_v86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pp32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pp32_16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _ppv86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pae16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pae16_32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pae16_v86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pae32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _pae32_16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _paev86); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _lm16); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _lm32); \
+    FNBS3TESTDOMODE   RT_CONCAT(a_BaseNm, _lm64)
 
 /** @} */
Index: /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac
===================================================================
--- /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac	(revision 60608)
+++ /trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac	(revision 60609)
@@ -653,11 +653,16 @@
 ;
 ; @param    %1      The mangled name.
-;
-%macro BS3_PROC_BEGIN 1
-%if __BITS__ == 64
- BS3_GLOBAL_NAME_EX _ %+ %1, function, (_ %+ %1 %+ _EndProc - %1)
+; @param    %2      Create an underscore prefixed alias if present and
+;                   BS3_PB_WITH_US_ALIAS (automatic in 64-bit code).
+;
+%macro BS3_PROC_BEGIN 1-2 0
+%if __BITS__ == 64 || ((%2) & BS3_PB_WITH_US_ALIAS)
+BS3_GLOBAL_NAME_EX _ %+ %1, function, (%1 %+ _EndProc - %1)
 %endif
 BS3_GLOBAL_NAME_EX %1, function, (%1 %+ _EndProc - %1)
 %endmacro
+
+;; For use with BS3_PROC_BEGIN for making it produce an underscore prefixed alias.
+%define BS3_PB_WITH_US_ALIAS 1
 
 ;;
@@ -1191,4 +1196,7 @@
 ; @param 1      Double quoted include file name.
 %macro BS3_INSTANTIATE_TEMPLATE_WITH_WEIRD_ONES 1
+ %define BS3_INSTANTIATING_MODE
+ %define BS3_INSTANTIATING_ALL_MODES
+
  %define TMPL_MODE BS3_MODE_RM
  %include %1
@@ -1242,4 +1250,7 @@
  %define TMPL_MODE BS3_MODE_LM64
  %include %1
+
+ %undef BS3_INSTANTIATING_MODE
+ %undef BS3_INSTANTIATING_ALL_MODES
 %endmacro
 
@@ -1249,4 +1260,7 @@
 ; @param 1      Double quoted include file name.
 %macro BS3_INSTANTIATE_TEMPLATE_ESSENTIALS 1
+ %define BS3_INSTANTIATING_MODE
+ %define BS3_INSTANTIATING_ESSENTIAL_MODES
+
  %define TMPL_MODE BS3_MODE_RM
  %include %1
@@ -1282,4 +1296,7 @@
  %define TMPL_MODE BS3_MODE_LM64
  %include %1
+
+ %undef  BS3_INSTANTIATING_MODE
+ %undef  BS3_INSTANTIATING_ESSENTIAL_MODES
 %endmacro
 
@@ -1288,4 +1305,6 @@
 ; @param 1      Double quoted include file name.
 %macro BS3_INSTANTIATE_COMMON_TEMPLATE 1
+ %define BS3_INSTANTIATING_CMN
+
  %define TMPL_MODE BS3_MODE_RM
  %include %1
@@ -1294,4 +1313,6 @@
  %define TMPL_MODE BS3_MODE_LM64
  %include %1
+
+ %undef  BS3_INSTANTIATING_CMN
 %endmacro
 
