VirtualBox

Changeset 41338 in vbox


Ignore:
Timestamp:
May 16, 2012 2:39:21 PM (12 years ago)
Author:
vboxsync
Message:

Pass ring-0 address to the tracer when possible (makes accessing much easier).

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Config.kmk

    r41259 r41338  
    15341534#
    15351535ifeq ($(KBUILD_TARGET_ARCH),amd64)
    1536  ARCH_BITS_DEFS := HC_ARCH_BITS=64
     1536 VBOX_HC_ARCH_BITS := 64
     1537 ARCH_BITS_DEFS    := HC_ARCH_BITS=64
    15371538else ifeq ($(KBUILD_TARGET_ARCH),x86)
    1538  ARCH_BITS_DEFS := HC_ARCH_BITS=32
     1539 VBOX_HC_ARCH_BITS := 32
     1540 ARCH_BITS_DEFS    := HC_ARCH_BITS=32
    15391541else
    15401542 error KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH)
     
    26582660TOOL_VBoxTpG = The VirtualBox Tracepoint Generator
    26592661TOOL_VBoxTpG_DTRACE_DEPEND         = $(VBOX_VBOXTPG)
    2660 TOOL_VBoxTpG_DTRACE_HDR_FLAGS      := -h #-vvv
     2662TOOL_VBoxTpG_DTRACE_HDR_FLAGS      := -h --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
    26612663define TOOL_VBoxTpG_DTRACE_HDR_CMDS
    26622664        $(QUIET)$(VBOX_VBOXTPG) $(flags) -o "$(out)" -s "$(source)"
    26632665endef
    26642666TOOL_VBoxTpG_DTRACE_OBJ_NOT_NEEDED :=
    2665 TOOL_VBoxTpG_DTRACE_OBJ_FLAGS      := -G #-vvv
     2667TOOL_VBoxTpG_DTRACE_OBJ_FLAGS      := -G --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
    26662668define TOOL_VBoxTpG_DTRACE_OBJ_CMDS
    26672669        $(QUIET)$(VBOX_VBOXTPG) \
     
    27002702  TEMPLATE_VBoxRc_DTRACETOOL         = VBoxTpG
    27012703  TEMPLATE_VBoxRc_DEFS              += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_RC
    2702   TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS   = --probe-fn-name "VMMRCProbeFire"
     2704  TEMPLATE_VBoxRc_DTRACE_HDR_FLAGS   = --raw-mode-context
     2705  TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS   = --raw-mode-context --probe-fn-name "VMMRCProbeFire"
    27032706 else
    27042707  TEMPLATE_VBoxRc_DTRACETOOL         = VBoxTpG-Disabled
     
    32213224 else
    32223225  TEMPLATE_VBOXR3EXE_DTRACETOOL        = VBoxTpG
    3223   TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
     3226  TEMPLATE_VBOXR3EXE_DTRACE_HDR_FLAGS  = --ring-3-context
     3227  TEMPLATE_VBOXR3EXE_DTRACE_OBJ_FLAGS  = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
    32243228  TEMPLATE_VBOXR3EXE_DEFS             += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3
    32253229 endif
  • trunk/include/VBox/VBoxTpG.h

    r41311 r41338  
    164164/** The type context mask. */
    165165#define VTG_TYPE_CTX_MASK       UINT32_C(0x0f000000)
     166/** The type is automatically converted to a ring-0 pointer. */
     167#define VTG_TYPE_AUTO_CONV_PTR  RT_BIT_32(28)
    166168/** The type is a physical address. */
    167169#define VTG_TYPE_PHYS           RT_BIT_32(29)
     
    171173#define VTG_TYPE_SIGNED         RT_BIT_32(31)
    172174/** Mask of valid bits (for simple validation). */
    173 #define VTG_TYPE_VALID_MASK     UINT32_C(0xef000fff)
     175#define VTG_TYPE_VALID_MASK     UINT32_C(0xff000fff)
    174176/** @} */
    175177
     
    403405extern VTGOBJHDR            g_VTGObjHeader;
    404406
     407
     408/** @name Macros for converting typical pointer arguments to ring-0 pointers.
     409 * @{ */
     410#ifdef IN_RING0
     411# define VTG_VM_TO_R0(a_pVM)                     (a_pVM)
     412# define VTG_VMCPU_TO_R0(a_pVCpu)                (a_pVCpu)
     413# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      (a_pCtx)
     414#else
     415# define VTG_VM_TO_R0(a_pVM)                     ((a_pVM)->pVMR0)
     416# define VTG_VMCPU_TO_R0(a_pVCpu)                VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pVCpu)
     417# define VTG_CPUMCTX_TO_R0(a_pVCpu, a_pCtx)      VM_R0_ADDR((a_pVCpu)->CTX_SUFF(pVM), a_pCtx)
     418#endif
     419/** @} */
     420
     421
    405422RT_C_DECLS_END
    406423
  • trunk/src/VBox/HostDrivers/Support/SUPDrvTracer.cpp

    r41311 r41338  
    554554        if (pProbe->offObjHdr != (intptr_t)pVtgHdr - (intptr_t)pProbe)
    555555        {
    556             SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u offObjHdr=%d expected %zd\n",
     556            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_PROBE - iProbe=%u offObjHdr=%d expected %zd\n",
    557557                        i, pProbe->offObjHdr, (intptr_t)pVtgHdr - (intptr_t)pProbe);
    558558            return VERR_SUPDRV_VTG_BAD_PROBE;
     
    562562        if (pArgList->cArgs > 16)
    563563        {
    564             SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u cArgs=%u\n", i, pArgList->cArgs);
     564            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - iProbe=%u cArgs=%u\n", i, pArgList->cArgs);
    565565            return VERR_SUPDRV_VTG_BAD_ARGLIST;
    566566        }
    567567        if (pArgList->fHaveLargeArgs >= 2)
    568568        {
    569             SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - iProbe=%u fHaveLargeArgs=%d\n", i, pArgList->fHaveLargeArgs);
     569            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - iProbe=%u fHaveLargeArgs=%d\n", i, pArgList->fHaveLargeArgs);
    570570            return VERR_SUPDRV_VTG_BAD_ARGLIST;
    571571        }
     
    573573            || pArgList->abReserved[1])
    574574        {
    575             SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_TRACER_BAD_ARG_FLAGS - reserved MBZ iProbe=%u\n", i);
     575            SUPR0Printf("supdrvVtgValidate: VERR_SUPDRV_VTG_BAD_ARGLIST - reserved MBZ iProbe=%u\n", i);
    576576            return VERR_SUPDRV_VTG_BAD_ARGLIST;
    577577        }
  • trunk/src/VBox/VMM/VBoxVMM.d

    r40921 r41338  
    5252
    5353    probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, uint32_t a_Pid, void *a_hEMT0, uint32_t a_cCpus);
    54     probe r0__hmsvm__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode,
     54    probe r0__hmsvm__vmexit(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode,
    5555                            uint64_t a_ExitInfo1, uint64_t a_ExitInfo2, uint64_t a_ExitIntInfo,
    5656                            uint64_t a_TestArgument);
    57     probe r0__hmvmx__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitReason);
     57    probe r0__hmvmx__vmexit(struct VMCPU *a_pVCpu, struct CPUMCTX *a_pCtx, uint64_t a_ExitReason);
    5858
    5959};
  • trunk/src/VBox/VMM/VMMRC/VMMRCA.asm

    r41150 r41338  
    223223
    224224;;
    225 ; The raw-mode context equivalent of SUPTracerFireProbe. 
     225; The raw-mode context equivalent of SUPTracerFireProbe.
    226226;
    227227; See also SUPLibTracerA.asm.
     
    238238
    239239        ;
    240         ; Get the address of the tracer context record after first checking 
     240        ; Get the address of the tracer context record after first checking
    241241        ; that host calls hasn't been disabled.
    242242        ;
     
    275275        ; Copy the arguments off the stack.
    276276%macro COPY_ONE_ARG 1
    277         mov     eax, [ebp + 8 + %1 * 4]
     277        mov     eax, [ebp + 12 + %1 * 4]
    278278        mov     [edx + SUPDRVTRACERUSRCTX32.u.X86.aArgs + %1*4], eax
    279279%endmacro
  • trunk/src/bldprogs/VBoxTpG.cpp

    r41311 r41338  
    5858{
    5959    RTLISTNODE      ListEntry;
     60    /** The argument name. (heap) */
    6061    char           *pszName;
    61     const char     *pszType;
     62    /** The type presented to the tracer (in string table). */
     63    const char     *pszTracerType;
     64    /** The argument type used in the probe method in that context. (heap) */
     65    char           *pszCtxType;
     66    /** Argument passing format string.  First and only argument is the name.
     67     *  (const string) */
     68    const char     *pszArgPassingFmt;
     69    /** The type flags. */
    6270    uint32_t        fType;
    6371} VTGARG;
     
    119127/** List of providers created by the parser. */
    120128static RTLISTANCHOR     g_ProviderHead;
    121 
    122129/** The number of type errors. */
    123 static uint32_t        g_cTypeErrors = 0;
     130static uint32_t         g_cTypeErrors = 0;
     131
    124132
    125133/** @name Options
     
    131139    kVBoxTpGAction_GenerateObject
    132140}                           g_enmAction                 = kVBoxTpGAction_Nothing;
    133 static uint32_t             g_cBits                     = ARCH_BITS;
     141static uint32_t             g_cBits                     = HC_ARCH_BITS;
     142static uint32_t             g_cHostBits                 = HC_ARCH_BITS;
     143static uint32_t             g_fTypeContext              = VTG_TYPE_CTX_R0;
    134144static bool                 g_fApplyCpp                 = false;
    135145static uint32_t             g_cVerbosity                = 0;
     
    174184# endif
    175185#endif
    176 static const char          *g_pszAssemblerFmtVal        = RT_CONCAT(g_szAssemblerFmtVal, ARCH_BITS);
     186static const char          *g_pszAssemblerFmtVal        = RT_CONCAT(g_szAssemblerFmtVal, HC_ARCH_BITS);
    177187static const char          *g_pszAssemblerDefOpt        = "-D";
    178188static const char          *g_pszAssemblerIncOpt        = "-I";
     
    274284        apszArgs[iArg++] = "ARCH_BITS=64";
    275285    apszArgs[iArg++] = g_pszAssemblerDefOpt;
     286    if (g_cHostBits == 32)
     287        apszArgs[iArg++] = "HC_ARCH_BITS=32";
     288    else
     289        apszArgs[iArg++] = "HC_ARCH_BITS=64";
     290    apszArgs[iArg++] = g_pszAssemblerDefOpt;
    276291    if (g_cBits == 32)
    277292        apszArgs[iArg++] = "RT_ARCH_X86";
    278293    else
    279294        apszArgs[iArg++] = "RT_ARCH_AMD64";
     295    apszArgs[iArg++] = g_pszAssemblerDefOpt;
     296    if (g_fTypeContext == VTG_TYPE_CTX_R0)
     297        apszArgs[iArg++] = "IN_RING0";
     298    else if (g_fTypeContext == VTG_TYPE_CTX_R3)
     299        apszArgs[iArg++] = "IN_RING3";
     300    else if (g_fTypeContext == VTG_TYPE_CTX_RC)
     301        apszArgs[iArg++] = "IN_RC";
     302    else
     303        apszArgs[iArg++] = "IN_UNKNOWN";
    280304    if (g_szAssemblerOsDef[0])
    281305    {
     
    442466                    " ; With the ld64-97.17 linker there was a problem with it determin the section\n"
    443467                    " ; order based on symbol references. The references to the start and end of the\n"
    444                     " ; __VTGPrLc section forced it in front of __VTGObj. \n"
     468                    " ; __VTGPrLc section forced it in front of __VTGObj.\n"
    445469                    " extern section$start$__VTG$__VTGObj\n"
    446470                    " extern section$end$__VTG$__VTGObj\n"
     
    474498                    "VTG_GLOBAL g_aVTGPrLc_End, data\n"
    475499                    " dd 0,0,0,0, 0,0,0,0\n"
    476                     " [section .VTGData progbits alloc noexec write align=4096]\n"
     500                    " [section .VTGData]\n"
    477501                    "\n"
    478502                    "%%else\n"
     
    585609                                "    dd  %8u  ; type '%s' (name '%s')\n"
    586610                                "    dd 0%08xh ; type flags\n",
    587                                 strtabGetOff(pArg->pszType), pArg->pszType, pArg->pszName,
     611                                strtabGetOff(pArg->pszTracerType), pArg->pszTracerType, pArg->pszName,
    588612                                pArg->fType);
    589613                off += 8;
     
    607631                    int32_t cArgs = pProbe->cArgs;
    608632                    while (   cArgs-- > 0
    609                            && pArg2->pszType == pArg->pszType
    610                            && pArg2->fType   == pArg->fType)
     633                           && pArg2->pszTracerType == pArg->pszTracerType
     634                           && pArg2->fType         == pArg->fType)
    611635                    {
    612636                        pArg  = RTListNodeGetNext(&pArg->ListEntry, VTGARG, ListEntry);
     
    765789            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    766790            {
    767                 ScmStreamPrintf(pStrm, ", %s %s", pArg->pszType, pArg->pszName);
     791                ScmStreamPrintf(pStrm, ", %s %s", pArg->pszTracerType, pArg->pszName);
    768792            }
    769793            ScmStreamPrintf(pStrm,
     
    878902}
    879903
     904/**
     905 * Called via generateFile to generate the header file.
     906 *
     907 * @returns Exit code status.
     908 * @param   pStrm               The output stream.
     909 */
    880910static RTEXITCODE generateHeaderInner(PSCMSTREAM pStrm)
    881911{
     
    904934    }
    905935
     936    const char *pszCtxDefine = "UNKNOWN_DEFINE";
     937    if (g_fTypeContext == VTG_TYPE_CTX_R0)
     938        pszCtxDefine = "IN_RING0";
     939    else if (g_fTypeContext == VTG_TYPE_CTX_R3)
     940        pszCtxDefine = "IN_RING3";
     941    else if (g_fTypeContext == VTG_TYPE_CTX_RC)
     942        pszCtxDefine = "IN_RC";
     943    else
     944        AssertFailed();
     945
    906946    ScmStreamPrintf(pStrm,
    907947                    "/* $Id$ */\n"
    908948                    "/** @file\n"
    909                     " * Automatically generated from %s. Do NOT edit!\n"
     949                    " * Automatically generated from %s.  Do NOT edit!\n"
    910950                    " */\n"
    911951                    "\n"
     
    914954                    "\n"
    915955                    "#include <VBox/VBoxTpG.h>\n"
     956                    "\n"
     957                    "#ifndef %s\n"
     958                    "# error \"Expected '%s' to be defined\"\n"
     959                    "#endif\n"
    916960                    "\n"
    917961                    "RT_C_DECLS_BEGIN\n"
     
    927971                    g_pszScript,
    928972                    szTmp,
    929                     szTmp);
     973                    szTmp,
     974                    pszCtxDefine);
    930975
    931976    /*
     
    939984        RTListForEach(&pProv->ProbeHead, pProbe, VTGPROBE, ListEntry)
    940985        {
     986            PVTGARG const pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
     987
    941988            ScmStreamPrintf(pStrm,
    942989                            "extern uint32_t        g_cVTGProbeEnabled_%s_%s;\n"
     
    948995            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    949996            {
    950                 ScmStreamPrintf(pStrm, ", %s", pArg->pszType);
     997                ScmStreamPrintf(pStrm, ", %s", pArg->pszCtxType);
    951998            }
    952999            generateProbeDefineName(szTmp, sizeof(szTmp), pProv->pszName, pProbe->pszMangledName);
     
    9791026            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    9801027            {
    981                 ScmStreamPrintf(pStrm, ", %s", pArg->pszName);
     1028                ScmStreamPrintf(pStrm, pArg->pszArgPassingFmt, pArg->pszName);
    9821029            }
    9831030            ScmStreamPrintf(pStrm,
     
    9881035            RTListForEach(&pProbe->ArgHead, pArg, VTGARG, ListEntry)
    9891036            {
    990                 if (pArg->fType & VTG_TYPE_FIXED_SIZED)
     1037                if ((pArg->fType & (VTG_TYPE_FIXED_SIZED | VTG_TYPE_AUTO_CONV_PTR)) == VTG_TYPE_FIXED_SIZED)
    9911038                    ScmStreamPrintf(pStrm,
    9921039                                    "        AssertCompile(sizeof(%s) == %u); \\\n"
    9931040                                    "        AssertCompile(sizeof(%s) <= %u); \\\n",
    994                                     pArg->pszType, pArg->fType & VTG_TYPE_SIZE_MASK,
     1041                                    pArg->pszTracerType, pArg->fType & VTG_TYPE_SIZE_MASK,
    9951042                                    pArg->pszName, pArg->fType & VTG_TYPE_SIZE_MASK);
    9961043                else if (pArg->fType & (VTG_TYPE_POINTER | VTG_TYPE_HC_ARCH_SIZED))
     
    9991046                                    "        AssertCompile(sizeof(%s) <= sizeof(uintptr_t)); \\\n",
    10001047                                    pArg->pszName,
    1001                                     pArg->pszType);
     1048                                    pArg->pszTracerType);
    10021049                iArg++;
    10031050            }
     
    15421589     * The special VBox types.
    15431590     */
    1544     if (MY_STRMATCH("PVM"))             return VTG_TYPE_CTX_POINTER;
    1545     if (MY_STRMATCH("PVMCPU"))          return VTG_TYPE_CTX_POINTER;
     1591    if (MY_STRMATCH("PVM"))             return VTG_TYPE_POINTER;
     1592    if (MY_STRMATCH("PVMCPU"))          return VTG_TYPE_POINTER;
     1593    if (MY_STRMATCH("PCPUMCTX"))        return VTG_TYPE_POINTER;
    15461594
    15471595    /*
     
    16051653
    16061654/**
     1655 * Initializes the members of an argument.
     1656 *
     1657 * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
     1658 * @param   pProbe              The probe.
     1659 * @param   pArg                The argument.
     1660 * @param   pStrm               The input stream (for errors).
     1661 * @param   pchType             The type.
     1662 * @param   cchType             The type length.
     1663 * @param   pchName             The name.
     1664 * @param   cchName             The name length.
     1665 */
     1666static RTEXITCODE parseInitArgument(PVTGPROBE pProbe, PVTGARG pArg, PSCMSTREAM pStrm,
     1667                                    char *pchType, size_t cchType, char *pchName, size_t cchName)
     1668{
     1669    Assert(!pArg->pszName); Assert(!pArg->pszTracerType); Assert(!pArg->pszCtxType); Assert(!pArg->fType);
     1670
     1671    pArg->pszArgPassingFmt  = ", %s";
     1672    pArg->pszName           = RTStrDupN(pchName, cchName);
     1673    pArg->pszTracerType     = strtabInsertN(pchType, cchType);
     1674    if (!pArg->pszTracerType || !pArg->pszName)
     1675        return parseError(pStrm, 1, "Out of memory");
     1676    pArg->fType             = parseTypeExpression(pArg->pszTracerType);
     1677
     1678    if (   (pArg->fType & VTG_TYPE_POINTER)
     1679        && !(g_fTypeContext & VTG_TYPE_CTX_R0) )
     1680    {
     1681        pArg->fType &= ~VTG_TYPE_POINTER;
     1682        if (   !strcmp(pArg->pszTracerType, "struct VM *")          || !strcmp(pArg->pszTracerType, "PVM")
     1683            || !strcmp(pArg->pszTracerType, "struct VMCPU *")       || !strcmp(pArg->pszTracerType, "PVMCPU")
     1684            || !strcmp(pArg->pszTracerType, "struct CPUMCTX *")     || !strcmp(pArg->pszTracerType, "PCPUMCTX")
     1685            )
     1686        {
     1687            pArg->fType |= VTG_TYPE_CTX_POINTER | VTG_TYPE_CTX_R0
     1688                         | VTG_TYPE_FIXED_SIZED | (g_cHostBits / 8)
     1689                         | VTG_TYPE_AUTO_CONV_PTR;
     1690            pArg->pszCtxType = RTStrDup("RTR0PTR");
     1691
     1692            if (!strcmp(pArg->pszTracerType, "struct VM *")         || !strcmp(pArg->pszTracerType, "PVM"))
     1693                pArg->pszArgPassingFmt = ", VTG_VM_TO_R0(%s)";
     1694            else if (!strcmp(pArg->pszTracerType, "struct VMCPU *") || !strcmp(pArg->pszTracerType, "PVMCPU"))
     1695                pArg->pszArgPassingFmt = ", VTG_VMCPU_TO_R0(%s)";
     1696            else
     1697            {
     1698                PVTGARG pFirstArg = RTListGetFirst(&pProbe->ArgHead, VTGARG, ListEntry);
     1699                if (   !pFirstArg
     1700                    || pFirstArg == pArg
     1701                    || strcmp(pFirstArg->pszName, "a_pVCpu")
     1702                    || (   strcmp(pFirstArg->pszTracerType, "struct VMCPU *")
     1703                        && strcmp(pFirstArg->pszTracerType, "PVMCPU *")) )
     1704                    return parseError(pStrm, 1, "The automatic ring-0 pointer conversion requires 'a_pVCpu' with type 'struct VMCPU *' as the first argument");
     1705
     1706                if (!strcmp(pArg->pszTracerType, "struct CPUMCTX *")|| !strcmp(pArg->pszTracerType, "PCPUMCTX"))
     1707                    pArg->pszArgPassingFmt = ", VTG_CPUMCTX_TO_R0(a_pVCpu, %s)";
     1708                else
     1709                    pArg->pszArgPassingFmt = ", VBoxTpG-Is-Buggy!!";
     1710            }
     1711        }
     1712        else
     1713        {
     1714            pArg->fType |= VTG_TYPE_CTX_POINTER | g_fTypeContext | VTG_TYPE_FIXED_SIZED | (g_cBits / 8);
     1715            pArg->pszCtxType = RTStrDupN(pchType, cchType);
     1716        }
     1717    }
     1718    else
     1719        pArg->pszCtxType = RTStrDupN(pchType, cchType);
     1720    if (!pArg->pszCtxType)
     1721        return parseError(pStrm, 1, "Out of memory");
     1722
     1723    return RTEXITCODE_SUCCESS;
     1724}
     1725
     1726
     1727/**
    16071728 * Unmangles the probe name.
    16081729 *
     
    16931814                    if (cchArg - cchName - 1 >= 128)
    16941815                        return parseError(pStrm, 1, "Argument type too long");
    1695                     pArg->pszType = strtabInsertN(szArg, cchArg - cchName - 1);
    1696                     pArg->pszName = RTStrDupN(&szArg[cchArg - cchName], cchName);
    1697                     if (!pArg->pszType || !pArg->pszName)
    1698                         return parseError(pStrm, 1, "Out of memory");
    1699                     pArg->fType   = parseTypeExpression(pArg->pszType);
     1816                    RTEXITCODE rcExit = parseInitArgument(pProbe, pArg, pStrm,
     1817                                                          szArg, cchArg - cchName - 1,
     1818                                                          &szArg[cchArg - cchName], cchName);
     1819                    if (rcExit != RTEXITCODE_SUCCESS)
     1820                        return rcExit;
    17001821                    if (VTG_TYPE_IS_LARGE(pArg->fType))
    17011822                        pProbe->fHaveLargeArgs = true;
    1702 
    17031823                    pArg = NULL;
    17041824                    cchName = cchArg = 0;
     
    19362056        kVBoxTpGOpt_ProbeFnImported,
    19372057        kVBoxTpGOpt_ProbeFnNotImported,
     2058        kVBoxTpGOpt_Host32Bit,
     2059        kVBoxTpGOpt_Host64Bit,
     2060        kVBoxTpGOpt_RawModeContext,
     2061        kVBoxTpGOpt_Ring0Context,
     2062        kVBoxTpGOpt_Ring3Context,
    19382063        kVBoxTpGOpt_End
    19392064    };
     
    19602085        { "--probe-fn-imported",                kVBoxTpGOpt_ProbeFnImported,            RTGETOPT_REQ_NOTHING },
    19612086        { "--probe-fn-not-imported",            kVBoxTpGOpt_ProbeFnNotImported,         RTGETOPT_REQ_NOTHING },
     2087        { "--host-32-bit",                      kVBoxTpGOpt_Host32Bit,                  RTGETOPT_REQ_NOTHING },
     2088        { "--host-64-bit",                      kVBoxTpGOpt_Host64Bit,                  RTGETOPT_REQ_NOTHING },
     2089        { "--raw-mode-context",                 kVBoxTpGOpt_RawModeContext,             RTGETOPT_REQ_NOTHING },
     2090        { "--ring-0-context",                   kVBoxTpGOpt_Ring0Context,               RTGETOPT_REQ_NOTHING },
     2091        { "--ring-3-context",                   kVBoxTpGOpt_Ring3Context,               RTGETOPT_REQ_NOTHING },
    19622092        /** @todo We're missing a bunch of assembler options! */
    19632093    };
     
    19792109             */
    19802110            case kVBoxTpGOpt_32Bit:
    1981                 g_cBits = 32;
     2111                g_cHostBits = g_cBits = 32;
    19822112                g_pszAssemblerFmtVal = g_szAssemblerFmtVal32;
    19832113                break;
    19842114
    19852115            case kVBoxTpGOpt_64Bit:
    1986                 g_cBits = 64;
     2116                g_cHostBits = g_cBits = 64;
    19872117                g_pszAssemblerFmtVal = g_szAssemblerFmtVal64;
    19882118                break;
     
    20982228                break;
    20992229
     2230            case kVBoxTpGOpt_Host32Bit:
     2231                g_cHostBits = 32;
     2232                break;
     2233
     2234            case kVBoxTpGOpt_Host64Bit:
     2235                g_cHostBits = 64;
     2236                break;
     2237
     2238            case kVBoxTpGOpt_RawModeContext:
     2239                g_fTypeContext = VTG_TYPE_CTX_RC;
     2240                break;
     2241
     2242            case kVBoxTpGOpt_Ring0Context:
     2243                g_fTypeContext = VTG_TYPE_CTX_R0;
     2244                break;
     2245
     2246            case kVBoxTpGOpt_Ring3Context:
     2247                g_fTypeContext = VTG_TYPE_CTX_R3;
     2248                break;
     2249
     2250
    21002251            /*
    21012252             * Errors and bugs.
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette