Index: /trunk/Config.kmk
===================================================================
--- /trunk/Config.kmk	(revision 41337)
+++ /trunk/Config.kmk	(revision 41338)
@@ -1534,7 +1534,9 @@
 #
 ifeq ($(KBUILD_TARGET_ARCH),amd64)
- ARCH_BITS_DEFS := HC_ARCH_BITS=64
+ VBOX_HC_ARCH_BITS := 64
+ ARCH_BITS_DEFS    := HC_ARCH_BITS=64
 else ifeq ($(KBUILD_TARGET_ARCH),x86)
- ARCH_BITS_DEFS := HC_ARCH_BITS=32
+ VBOX_HC_ARCH_BITS := 32
+ ARCH_BITS_DEFS    := HC_ARCH_BITS=32
 else
  error KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH)
@@ -2658,10 +2660,10 @@
 TOOL_VBoxTpG = The VirtualBox Tracepoint Generator
 TOOL_VBoxTpG_DTRACE_DEPEND         = $(VBOX_VBOXTPG)
-TOOL_VBoxTpG_DTRACE_HDR_FLAGS      := -h #-vvv
+TOOL_VBoxTpG_DTRACE_HDR_FLAGS      := -h --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
 define TOOL_VBoxTpG_DTRACE_HDR_CMDS
 	$(QUIET)$(VBOX_VBOXTPG) $(flags) -o "$(out)" -s "$(source)"
 endef
 TOOL_VBoxTpG_DTRACE_OBJ_NOT_NEEDED :=
-TOOL_VBoxTpG_DTRACE_OBJ_FLAGS      := -G #-vvv
+TOOL_VBoxTpG_DTRACE_OBJ_FLAGS      := -G --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
 define TOOL_VBoxTpG_DTRACE_OBJ_CMDS
 	$(QUIET)$(VBOX_VBOXTPG) \
@@ -2700,5 +2702,6 @@
   TEMPLATE_VBoxRc_DTRACETOOL         = VBoxTpG
   TEMPLATE_VBoxRc_DEFS              += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_RC
-  TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS   = --probe-fn-name "VMMRCProbeFire"
+  TEMPLATE_VBoxRc_DTRACE_HDR_FLAGS   = --raw-mode-context
+  TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS   = --raw-mode-context --probe-fn-name "VMMRCProbeFire"
  else
   TEMPLATE_VBoxRc_DTRACETOOL         = VBoxTpG-Disabled
@@ -3221,5 +3224,6 @@
  else
   TEMPLATE_VBOXR3EXE_DTRACETOOL        = VBoxTpG
-  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
+  TEMPLATE_VBOXR3EXE_DTRACE_HDR_FLAGS  = --ring-3-context
+  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
   TEMPLATE_VBOXR3EXE_DEFS             += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3
  endif
Index: /trunk/include/VBox/VBoxTpG.h
===================================================================
--- /trunk/include/VBox/VBoxTpG.h	(revision 41337)
+++ /trunk/include/VBox/VBoxTpG.h	(revision 41338)
@@ -164,4 +164,6 @@
 /** The type context mask. */
 #define VTG_TYPE_CTX_MASK       UINT32_C(0x0f000000)
+/** The type is automatically converted to a ring-0 pointer. */
+#define VTG_TYPE_AUTO_CONV_PTR  RT_BIT_32(28)
 /** The type is a physical address. */
 #define VTG_TYPE_PHYS           RT_BIT_32(29)
@@ -171,5 +173,5 @@
 #define VTG_TYPE_SIGNED         RT_BIT_32(31)
 /** Mask of valid bits (for simple validation). */
-#define VTG_TYPE_VALID_MASK     UINT32_C(0xef000fff)
+#define VTG_TYPE_VALID_MASK     UINT32_C(0xff000fff)
 /** @} */
 
@@ -403,4 +405,19 @@
 extern VTGOBJHDR            g_VTGObjHeader;
 
+
+/** @name Macros for converting typical pointer arguments to ring-0 pointers.
+ * @{ */
+#ifdef IN_RING0
+# define VTG_VM_TO_R0(a_pVM)                     (a_pVM)
+# define VTG_VMCPU_TO_R0(a_pVCpu)                (a_pVCpu)
+# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      (a_pCtx)
+#else
+# define VTG_VM_TO_R0(a_pVM)                     ((a_pVM)->pVMR0)
+# define VTG_VMCPU_TO_R0(a_pVCpu)                VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pVCpu)
+# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pCtx)
+#endif
+/** @} */
+
+
 RT_C_DECLS_END
 
Index: /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp	(revision 41337)
+++ /trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp	(revision 41338)
@@ -554,5 +554,5 @@
         if (pProbe->offObjHdr != (intptr_t)pVtgHdr - (intptr_t)pProbe)
         {
-            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u offObjHdr=%d expected %zd\n",
+            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_PROBE - iProbe=%u offObjHdr=%d expected %zd\n",
                         i, pProbe->offObjHdr, (intptr_t)pVtgHdr - (intptr_t)pProbe);
             return VERR_SUPDRV_VTG_BAD_PROBE;
@@ -562,10 +562,10 @@
         if (pArgList->cArgs > 16)
         {
-            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u cArgs=%u\n", i, pArgList->cArgs);
+            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - iProbe=%u cArgs=%u\n", i, pArgList->cArgs);
             return VERR_SUPDRV_VTG_BAD_ARGLIST;
         }
         if (pArgList->fHaveLargeArgs >= 2)
         {
-            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u fHaveLargeArgs=%d\n", i, pArgList->fHaveLargeArgs);
+            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - iProbe=%u fHaveLargeArgs=%d\n", i, pArgList->fHaveLargeArgs);
             return VERR_SUPDRV_VTG_BAD_ARGLIST;
         }
@@ -573,5 +573,5 @@
             || pArgList->abReserved[1])
         {
-            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - reserved MBZ iProbe=%u\n", i);
+            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - reserved MBZ iProbe=%u\n", i);
             return VERR_SUPDRV_VTG_BAD_ARGLIST;
         }
Index: /trunk/src/VBox/VMM/VBoxVMM.d
===================================================================
--- /trunk/src/VBox/VMM/VBoxVMM.d	(revision 41337)
+++ /trunk/src/VBox/VMM/VBoxVMM.d	(revision 41338)
@@ -52,8 +52,8 @@
 
     probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, uint32_t a_Pid, void *a_hEMT0, uint32_t a_cCpus);
-    probe r0__hmsvm__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode,
+    probe r0__hmsvm__vmexit(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode,
                             uint64_t a_ExitInfo1, uint64_t a_ExitInfo2, uint64_t a_ExitIntInfo,
                             uint64_t a_TestArgument);
-    probe r0__hmvmx__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitReason);
+    probe r0__hmvmx__vmexit(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint64_t a_ExitReason);
 
 };
Index: /trunk/src/VBox/VMM/VMMRC/VMMRCA.asm
===================================================================
--- /trunk/src/VBox/VMM/VMMRC/VMMRCA.asm	(revision 41337)
+++ /trunk/src/VBox/VMM/VMMRC/VMMRCA.asm	(revision 41338)
@@ -223,5 +223,5 @@
 
 ;;
-; The raw-mode context equivalent of SUPTracerFireProbe.  
+; The raw-mode context equivalent of SUPTracerFireProbe.
 ;
 ; See also SUPLibTracerA.asm.
@@ -238,5 +238,5 @@
 
         ;
-        ; Get the address of the tracer context record after first checking 
+        ; Get the address of the tracer context record after first checking
         ; that host calls hasn't been disabled.
         ;
@@ -275,5 +275,5 @@
         ; Copy the arguments off the stack.
 %macro COPY_ONE_ARG 1
-        mov     eax, [ebp + 8 + %1 * 4]
+        mov     eax, [ebp + 12 + %1 * 4]
         mov     [edx + SUPDRVTRACERUSRCTX32.u.X86.aArgs + %1*4], eax
 %endmacro
Index: /trunk/src/bldprogs/VBoxTpG.cpp
===================================================================
--- /trunk/src/bldprogs/VBoxTpG.cpp	(revision 41337)
+++ /trunk/src/bldprogs/VBoxTpG.cpp	(revision 41338)
@@ -58,6 +58,14 @@
 {
     RTLISTNODE      ListEntry;
+    /** The argument name. (heap) */
     char           *pszName;
-    const char     *pszType;
+    /** The type presented to the tracer (in string table). */
+    const char     *pszTracerType;
+    /** The argument type used in the probe method in that context. (heap) */
+    char           *pszCtxType;
+    /** Argument passing format string.  First and only argument is the name.
+     *  (const string) */
+    const char     *pszArgPassingFmt;
+    /** The type flags. */
     uint32_t        fType;
 } VTGARG;
@@ -119,7 +127,7 @@
 /** List of providers created by the parser. */
 static RTLISTANCHOR     g_ProviderHead;
-
 /** The number of type errors. */
-static uint32_t        g_cTypeErrors = 0;
+static uint32_t         g_cTypeErrors = 0;
+
 
 /** @name Options
@@ -131,5 +139,7 @@
     kVBoxTpGAction_GenerateObject
 }                           g_enmAction                 = kVBoxTpGAction_Nothing;
-static uint32_t             g_cBits                     = ARCH_BITS;
+static uint32_t             g_cBits                     = HC_ARCH_BITS;
+static uint32_t             g_cHostBits                 = HC_ARCH_BITS;
+static uint32_t             g_fTypeContext              = VTG_TYPE_CTX_R0;
 static bool                 g_fApplyCpp                 = false;
 static uint32_t             g_cVerbosity                = 0;
@@ -174,5 +184,5 @@
 # endif
 #endif
-static const char          *g_pszAssemblerFmtVal        = RT_CONCAT(g_szAssemblerFmtVal, ARCH_BITS);
+static const char          *g_pszAssemblerFmtVal        = RT_CONCAT(g_szAssemblerFmtVal, HC_ARCH_BITS);
 static const char          *g_pszAssemblerDefOpt        = "-D";
 static const char          *g_pszAssemblerIncOpt        = "-I";
@@ -274,8 +284,22 @@
         apszArgs[iArg++] = "ARCH_BITS=64";
     apszArgs[iArg++] = g_pszAssemblerDefOpt;
+    if (g_cHostBits == 32)
+        apszArgs[iArg++] = "HC_ARCH_BITS=32";
+    else
+        apszArgs[iArg++] = "HC_ARCH_BITS=64";
+    apszArgs[iArg++] = g_pszAssemblerDefOpt;
     if (g_cBits == 32)
         apszArgs[iArg++] = "RT_ARCH_X86";
     else
         apszArgs[iArg++] = "RT_ARCH_AMD64";
+    apszArgs[iArg++] = g_pszAssemblerDefOpt;
+    if (g_fTypeContext == VTG_TYPE_CTX_R0)
+        apszArgs[iArg++] = "IN_RING0";
+    else if (g_fTypeContext == VTG_TYPE_CTX_R3)
+        apszArgs[iArg++] = "IN_RING3";
+    else if (g_fTypeContext == VTG_TYPE_CTX_RC)
+        apszArgs[iArg++] = "IN_RC";
+    else
+        apszArgs[iArg++] = "IN_UNKNOWN";
     if (g_szAssemblerOsDef[0])
     {
@@ -442,5 +466,5 @@
                     " ; With the ld64-97.17 linker there was a problem with it determin the section\n"
                     " ; order based on symbol references. The references to the start and end of the\n"
-                    " ; __VTGPrLc section forced it in front of __VTGObj. \n"
+                    " ; __VTGPrLc section forced it in front of __VTGObj.\n"
                     " extern section$start$__VTG$__VTGObj\n"
                     " extern section$end$__VTG$__VTGObj\n"
@@ -474,5 +498,5 @@
                     "VTG_GLOBAL g_aVTGPrLc_End, data\n"
                     " dd 0,0,0,0, 0,0,0,0\n"
-                    " [section .VTGData progbits alloc noexec write align=4096]\n"
+                    " [section .VTGData]\n"
                     "\n"
                     "%%else\n"
@@ -585,5 +609,5 @@
                                 "    dd  %8u  ; type '%s' (name '%s')\n"
                                 "    dd 0%08xh ; type flags\n",
-                                strtabGetOff(pArg->pszType), pArg->pszType, pArg->pszName,
+                                strtabGetOff(pArg->pszTracerType), pArg->pszTracerType, pArg->pszName,
                                 pArg->fType);
                 off += 8;
@@ -607,6 +631,6 @@
                     int32_t cArgs = pProbe->cArgs;
                     while (   cArgs-- > 0
-                           && pArg2->pszType == pArg->pszType
-                           && pArg2->fType   == pArg->fType)
+                           && pArg2->pszTracerType == pArg->pszTracerType
+                           && pArg2->fType         == pArg->fType)
                     {
                         pArg  = RTListNodeGetNext(&pArg->ListEntry, VTGARG, ListEntry);
@@ -765,5 +789,5 @@
             RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
             {
-                ScmStreamPrintf(pStrm, ", %s %s", pArg->pszType, pArg->pszName);
+                ScmStreamPrintf(pStrm, ", %s %s", pArg->pszTracerType, pArg->pszName);
             }
             ScmStreamPrintf(pStrm,
@@ -878,4 +902,10 @@
 }
 
+/**
+ * Called via generateFile to generate the header file.
+ *
+ * @returns Exit code status.
+ * @param   pStrm               The output stream.
+ */
 static RTEXITCODE generateHeaderInner(PSCMSTREAM pStrm)
 {
@@ -904,8 +934,18 @@
     }
 
+    const char *pszCtxDefine = "UNKNOWN_DEFINE";
+    if (g_fTypeContext == VTG_TYPE_CTX_R0)
+        pszCtxDefine = "IN_RING0";
+    else if (g_fTypeContext == VTG_TYPE_CTX_R3)
+        pszCtxDefine = "IN_RING3";
+    else if (g_fTypeContext == VTG_TYPE_CTX_RC)
+        pszCtxDefine = "IN_RC";
+    else
+        AssertFailed();
+
     ScmStreamPrintf(pStrm,
                     "/* $Id$ */\n"
                     "/** @file\n"
-                    " * Automatically generated from %s. Do NOT edit!\n"
+                    " * Automatically generated from %s.  Do NOT edit!\n"
                     " */\n"
                     "\n"
@@ -914,4 +954,8 @@
                     "\n"
                     "#include <VBox/VBoxTpG.h>\n"
+                    "\n"
+                    "#ifndef %s\n"
+                    "# error \"Expected '%s' to be defined\"\n"
+                    "#endif\n"
                     "\n"
                     "RT_C_DECLS_BEGIN\n"
@@ -927,5 +971,6 @@
                     g_pszScript,
                     szTmp,
-                    szTmp);
+                    szTmp,
+                    pszCtxDefine);
 
     /*
@@ -939,4 +984,6 @@
         RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
         {
+            PVTGARG const pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
+
             ScmStreamPrintf(pStrm,
                             "extern uint32_t        g_cVTGProbeEnabled_%s_%s;\n"
@@ -948,5 +995,5 @@
             RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
             {
-                ScmStreamPrintf(pStrm, ", %s", pArg->pszType);
+                ScmStreamPrintf(pStrm, ", %s", pArg->pszCtxType);
             }
             generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
@@ -979,5 +1026,5 @@
             RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
             {
-                ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
+                ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt, pArg->pszName);
             }
             ScmStreamPrintf(pStrm,
@@ -988,9 +1035,9 @@
             RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
             {
-                if (pArg->fType & VTG_TYPE_FIXED_SIZED)
+                if ((pArg->fType & (VTG_TYPE_FIXED_SIZED | VTG_TYPE_AUTO_CONV_PTR)) == VTG_TYPE_FIXED_SIZED)
                     ScmStreamPrintf(pStrm,
                                     "        AssertCompile(sizeof(%s) == %u); \\\n"
                                     "        AssertCompile(sizeof(%s) <= %u); \\\n",
-                                    pArg->pszType, pArg->fType & VTG_TYPE_SIZE_MASK,
+                                    pArg->pszTracerType, pArg->fType & VTG_TYPE_SIZE_MASK,
                                     pArg->pszName, pArg->fType & VTG_TYPE_SIZE_MASK);
                 else if (pArg->fType & (VTG_TYPE_POINTER | VTG_TYPE_HC_ARCH_SIZED))
@@ -999,5 +1046,5 @@
                                     "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n",
                                     pArg->pszName,
-                                    pArg->pszType);
+                                    pArg->pszTracerType);
                 iArg++;
             }
@@ -1542,6 +1589,7 @@
      * The special VBox types.
      */
-    if (MY_STRMATCH("PVM"))             return VTG_TYPE_CTX_POINTER;
-    if (MY_STRMATCH("PVMCPU"))          return VTG_TYPE_CTX_POINTER;
+    if (MY_STRMATCH("PVM"))             return VTG_TYPE_POINTER;
+    if (MY_STRMATCH("PVMCPU"))          return VTG_TYPE_POINTER;
+    if (MY_STRMATCH("PCPUMCTX"))        return VTG_TYPE_POINTER;
 
     /*
@@ -1605,4 +1653,77 @@
 
 /**
+ * Initializes the members of an argument.
+ *
+ * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
+ * @param   pProbe              The probe.
+ * @param   pArg                The argument.
+ * @param   pStrm               The input stream (for errors).
+ * @param   pchType             The type.
+ * @param   cchType             The type length.
+ * @param   pchName             The name.
+ * @param   cchName             The name length.
+ */
+static RTEXITCODE parseInitArgument(PVTGPROBE pProbe, PVTGARG pArg, PSCMSTREAM pStrm,
+                                    char *pchType, size_t cchType, char *pchName, size_t cchName)
+{
+    Assert(!pArg->pszName); Assert(!pArg->pszTracerType); Assert(!pArg->pszCtxType); Assert(!pArg->fType);
+
+    pArg->pszArgPassingFmt  = ", %s";
+    pArg->pszName           = RTStrDupN(pchName, cchName);
+    pArg->pszTracerType     = strtabInsertN(pchType, cchType);
+    if (!pArg->pszTracerType || !pArg->pszName)
+        return parseError(pStrm, 1, "Out of memory");
+    pArg->fType             = parseTypeExpression(pArg->pszTracerType);
+
+    if (   (pArg->fType & VTG_TYPE_POINTER)
+        && !(g_fTypeContext & VTG_TYPE_CTX_R0) )
+    {
+        pArg->fType &= ~VTG_TYPE_POINTER;
+        if (   !strcmp(pArg->pszTracerType, "struct VM *")          || !strcmp(pArg->pszTracerType, "PVM")
+            || !strcmp(pArg->pszTracerType, "struct VMCPU *")       || !strcmp(pArg->pszTracerType, "PVMCPU")
+            || !strcmp(pArg->pszTracerType, "struct CPUMCTX *")     || !strcmp(pArg->pszTracerType, "PCPUMCTX")
+            )
+        {
+            pArg->fType |= VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0
+                         | VTG_TYPE_FIXED_SIZED | (g_cHostBits / 8)
+                         | VTG_TYPE_AUTO_CONV_PTR;
+            pArg->pszCtxType = RTStrDup("RTR0PTR");
+
+            if (!strcmp(pArg->pszTracerType, "struct VM *")         || !strcmp(pArg->pszTracerType, "PVM"))
+                pArg->pszArgPassingFmt = ", VTG_VM_TO_R0(%s)";
+            else if (!strcmp(pArg->pszTracerType, "struct VMCPU *") || !strcmp(pArg->pszTracerType, "PVMCPU"))
+                pArg->pszArgPassingFmt = ", VTG_VMCPU_TO_R0(%s)";
+            else
+            {
+                PVTGARG pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
+                if (   !pFirstArg
+                    || pFirstArg == pArg
+                    || strcmp(pFirstArg->pszName, "a_pVCpu")
+                    || (   strcmp(pFirstArg->pszTracerType, "struct VMCPU *")
+                        && strcmp(pFirstArg->pszTracerType, "PVMCPU *")) )
+                    return parseError(pStrm, 1, "The automatic ring-0 pointer conversion requires 'a_pVCpu' with type 'struct VMCPU *' as the first argument");
+
+                if (!strcmp(pArg->pszTracerType, "struct CPUMCTX *")|| !strcmp(pArg->pszTracerType, "PCPUMCTX"))
+                    pArg->pszArgPassingFmt = ", VTG_CPUMCTX_TO_R0(a_pVCpu, %s)";
+                else
+                    pArg->pszArgPassingFmt = ", VBoxTpG-Is-Buggy!!";
+            }
+        }
+        else
+        {
+            pArg->fType |= VTG_TYPE_CTX_POINTER | g_fTypeContext | VTG_TYPE_FIXED_SIZED | (g_cBits / 8);
+            pArg->pszCtxType = RTStrDupN(pchType, cchType);
+        }
+    }
+    else
+        pArg->pszCtxType = RTStrDupN(pchType, cchType);
+    if (!pArg->pszCtxType)
+        return parseError(pStrm, 1, "Out of memory");
+
+    return RTEXITCODE_SUCCESS;
+}
+
+
+/**
  * Unmangles the probe name.
  *
@@ -1693,12 +1814,11 @@
                     if (cchArg - cchName - 1 >= 128)
                         return parseError(pStrm, 1, "Argument type too long");
-                    pArg->pszType = strtabInsertN(szArg, cchArg - cchName - 1);
-                    pArg->pszName = RTStrDupN(&szArg[cchArg - cchName], cchName);
-                    if (!pArg->pszType || !pArg->pszName)
-                        return parseError(pStrm, 1, "Out of memory");
-                    pArg->fType   = parseTypeExpression(pArg->pszType);
+                    RTEXITCODE rcExit = parseInitArgument(pProbe, pArg, pStrm,
+                                                          szArg, cchArg - cchName - 1,
+                                                          &szArg[cchArg - cchName], cchName);
+                    if (rcExit != RTEXITCODE_SUCCESS)
+                        return rcExit;
                     if (VTG_TYPE_IS_LARGE(pArg->fType))
                         pProbe->fHaveLargeArgs = true;
-
                     pArg = NULL;
                     cchName = cchArg = 0;
@@ -1936,4 +2056,9 @@
         kVBoxTpGOpt_ProbeFnImported,
         kVBoxTpGOpt_ProbeFnNotImported,
+        kVBoxTpGOpt_Host32Bit,
+        kVBoxTpGOpt_Host64Bit,
+        kVBoxTpGOpt_RawModeContext,
+        kVBoxTpGOpt_Ring0Context,
+        kVBoxTpGOpt_Ring3Context,
         kVBoxTpGOpt_End
     };
@@ -1960,4 +2085,9 @@
         { "--probe-fn-imported",                kVBoxTpGOpt_ProbeFnImported,            RTGETOPT_REQ_NOTHING },
         { "--probe-fn-not-imported",            kVBoxTpGOpt_ProbeFnNotImported,         RTGETOPT_REQ_NOTHING },
+        { "--host-32-bit",                      kVBoxTpGOpt_Host32Bit,                  RTGETOPT_REQ_NOTHING },
+        { "--host-64-bit",                      kVBoxTpGOpt_Host64Bit,                  RTGETOPT_REQ_NOTHING },
+        { "--raw-mode-context",                 kVBoxTpGOpt_RawModeContext,             RTGETOPT_REQ_NOTHING },
+        { "--ring-0-context",                   kVBoxTpGOpt_Ring0Context,               RTGETOPT_REQ_NOTHING },
+        { "--ring-3-context",                   kVBoxTpGOpt_Ring3Context,               RTGETOPT_REQ_NOTHING },
         /** @todo We're missing a bunch of assembler options! */
     };
@@ -1979,10 +2109,10 @@
              */
             case kVBoxTpGOpt_32Bit:
-                g_cBits = 32;
+                g_cHostBits = g_cBits = 32;
                 g_pszAssemblerFmtVal = g_szAssemblerFmtVal32;
                 break;
 
             case kVBoxTpGOpt_64Bit:
-                g_cBits = 64;
+                g_cHostBits = g_cBits = 64;
                 g_pszAssemblerFmtVal = g_szAssemblerFmtVal64;
                 break;
@@ -2098,4 +2228,25 @@
                 break;
 
+            case kVBoxTpGOpt_Host32Bit:
+                g_cHostBits = 32;
+                break;
+
+            case kVBoxTpGOpt_Host64Bit:
+                g_cHostBits = 64;
+                break;
+
+            case kVBoxTpGOpt_RawModeContext:
+                g_fTypeContext = VTG_TYPE_CTX_RC;
+                break;
+
+            case kVBoxTpGOpt_Ring0Context:
+                g_fTypeContext = VTG_TYPE_CTX_R0;
+                break;
+
+            case kVBoxTpGOpt_Ring3Context:
+                g_fTypeContext = VTG_TYPE_CTX_R3;
+                break;
+
+
             /*
              * Errors and bugs.
