VirtualBox

Changeset 56052 in vbox


Ignore:
Timestamp:
May 24, 2015 2:56:38 PM (10 years ago)
Author:
vboxsync
Message:

VMM: Added non-PF raw-mode context virtual page access handler callback (not yet called).

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pgm.h

    r56051 r56052  
    291291 * @param   pvUser          User argument.
    292292 * @thread  EMT(pVCpu)
     293 *
     294 * @todo    FNPGMR3VIRTINVALIDATE might not longer actually be called! Don't
     295 *          know for how long...
    293296 */
    294297typedef DECLCALLBACK(int) FNPGMR3VIRTINVALIDATE(PVM pVM, PVMCPU pVCpu, RTGCPTR GCPtr, void *pvUser);
     
    701704                                                      PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
    702705                                                      PFNPGMVIRTHANDLER pfnHandlerR3,
     706                                                      RCPTRTYPE(FNPGMVIRTHANDLER) pfnHandlerRC,
    703707                                                      RCPTRTYPE(FNPGMRCVIRTPFHANDLER) pfnPfHandlerRC,
    704708                                                      const char *pszDesc, PPGMVIRTHANDLERTYPE phType);
     
    706710                                                    PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
    707711                                                    PFNPGMVIRTHANDLER pfnHandlerR3,
    708                                                     const char *pszPfHandlerRC, const char *pszDesc,
     712                                                    const char *pszHandlerRC, const char *pszPfHandlerRC, const char *pszDesc,
    709713                                                    PPGMVIRTHANDLERTYPE phType);
    710714VMMR3_INT_DECL(int) PGMR3HandlerVirtualRegister(PVM pVM, PVMCPU pVCpu, PGMVIRTHANDLERTYPE hType, RTGCPTR GCPtr,
  • trunk/src/VBox/VMM/VMMR3/CSAM.cpp

    r55937 r56052  
    255255                                         NULL /*pfnInvalidateR3 */,
    256256                                         csamCodePageWriteHandler,
    257                                          "csamRCCodePageWritePfHandler",
     257                                         "csamCodePageWriteHandler", "csamRCCodePageWritePfHandler",
    258258                                         "CSAM code page write handler",
    259259                                         &pVM->csam.s.hCodePageWriteType);
     
    262262                                         csamR3CodePageInvalidate,
    263263                                         csamCodePageWriteHandler,
    264                                          "csamRCCodePageWritePfHandler",
     264                                         "csamCodePageWriteHandler", "csamRCCodePageWritePfHandler",
    265265                                         "CSAM code page write and invlpg handler",
    266266                                         &pVM->csam.s.hCodePageWriteAndInvPgType);
  • trunk/src/VBox/VMM/VMMR3/PATM.cpp

    r55937 r56052  
    223223                                         NULL /*pfnInvalidateR3*/,
    224224                                         patmVirtPageHandler,
    225                                          "patmRCVirtPagePfHandler",
     225                                         "patmVirtPageHandler", "patmRCVirtPagePfHandler",
    226226                                         "PATMMonitorPatchJump", &pVM->patm.s.hMonitorPageType);
    227227    AssertRCReturn(rc, rc);
  • trunk/src/VBox/VMM/VMMR3/PGMHandler.cpp

    r56051 r56052  
    7373 * @param   enmKind         The kind of access handler.
    7474 * @param   pfnHandlerR3    Pointer to the ring-3 handler callback.
     75 * @param   pfnHandlerR0    Pointer to the ring-0 handler callback.
    7576 * @param   pfnPfHandlerR0  Pointer to the ring-0 \#PF handler callback.
     77 * @param   pfnHandlerRC    Pointer to the raw-mode context handler callback.
    7678 * @param   pfnPfHandlerRC  Pointer to the raw-mode context \#PF handler
    7779 *                          callback.
     
    313315 * @param   pfnInvalidateR3 Pointer to the ring-3 invalidation handler callback.
    314316 * @param   pfnHandlerR3    Pointer to the ring-3 handler callback.
    315  * @param   pfnPfHandlerRC  Pointer to the raw-mode context handler callback.
     317 * @param   pfnHandlerRC    Pointer to the raw-mode context handler callback.
     318 * @param   pfnPfHandlerRC  Pointer to the raw-mode context \#PF handler
     319 *                          callback.
    316320 * @param   pszDesc         The type description.
    317321 * @param   phType          Where to return the type handle (cross context
     
    322326                                                      PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
    323327                                                      PFNPGMVIRTHANDLER pfnHandlerR3,
     328                                                      RCPTRTYPE(FNPGMVIRTHANDLER) pfnHandlerRC,
    324329                                                      RCPTRTYPE(FNPGMRCVIRTPFHANDLER) pfnPfHandlerRC,
    325330                                                      const char *pszDesc, PPGMVIRTHANDLERTYPE phType)
    326331{
    327332    AssertReturn(!HMIsEnabled(pVM), VERR_NOT_AVAILABLE); /* Not supported/relevant for VT-x and AMD-V. */
    328     AssertReturn(RT_VALID_PTR(pfnHandlerR3) || enmKind == PGMVIRTHANDLERKIND_HYPERVISOR, VERR_INVALID_POINTER);
    329     AssertPtrNullReturn(pfnInvalidateR3, VERR_INVALID_POINTER);
    330     AssertReturn(pfnPfHandlerRC != NIL_RTRCPTR, VERR_INVALID_POINTER);
    331     AssertPtrReturn(pszDesc, VERR_INVALID_POINTER);
    332333    AssertReturn(   enmKind == PGMVIRTHANDLERKIND_WRITE
    333334                 || enmKind == PGMVIRTHANDLERKIND_ALL
    334335                 || enmKind == PGMVIRTHANDLERKIND_HYPERVISOR,
    335336                 VERR_INVALID_PARAMETER);
     337    if (enmKind != PGMVIRTHANDLERKIND_HYPERVISOR)
     338    {
     339        AssertPtrNullReturn(pfnInvalidateR3, VERR_INVALID_POINTER);
     340        AssertPtrReturn(pfnHandlerR3, VERR_INVALID_POINTER);
     341        AssertPtrReturn(pfnHandlerRC, VERR_INVALID_POINTER);
     342    }
     343    else
     344    {
     345        AssertReturn(pfnInvalidateR3 == NULL, VERR_INVALID_POINTER);
     346        AssertReturn(pfnHandlerR3 == NULL, VERR_INVALID_POINTER);
     347        AssertReturn(pfnHandlerRC == NIL_RTR0PTR, VERR_INVALID_POINTER);
     348    }
     349    AssertReturn(pfnPfHandlerRC != NIL_RTRCPTR, VERR_INVALID_POINTER);
     350    AssertPtrReturn(pszDesc, VERR_INVALID_POINTER);
    336351
    337352    PPGMVIRTHANDLERTYPEINT pType;
     
    347362        pType->pfnInvalidateR3  = pfnInvalidateR3;
    348363        pType->pfnHandlerR3     = pfnHandlerR3;
     364        pType->pfnHandlerRC     = pfnHandlerRC;
    349365        pType->pfnPfHandlerRC   = pfnPfHandlerRC;
    350366        pType->pszDesc          = pszDesc;
     
    375391 *                          (optional, can be NULL).
    376392 * @param   pfnHandlerR3    Pointer to the ring-3 handler callback.
    377  * @param   pszPfHandlerRC  The name of the raw-mode context handler.
     393 * @param   pszHandlerRC    The name of the raw-mode context handler callback
     394 *                          (in VMMRC.rc).
     395 * @param   pszPfHandlerRC  The name of the raw-mode context \#PF handler (in
     396 *                          VMMRC.rc).
    378397 * @param   pszDesc         The type description.
    379398 * @param   phType          Where to return the type handle (cross context
     
    384403                                                    PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
    385404                                                    PFNPGMVIRTHANDLER pfnHandlerR3,
    386                                                     const char *pszPfHandlerRC, const char *pszDesc,
     405                                                    const char *pszHandlerRC, const char *pszPfHandlerRC, const char *pszDesc,
    387406                                                    PPGMVIRTHANDLERTYPE phType)
    388407{
     
    393412     * Validate input.
    394413     */
     414    AssertPtrNullReturn(pszHandlerRC, VERR_INVALID_POINTER);
    395415    AssertPtrReturn(pszPfHandlerRC, VERR_INVALID_POINTER);
    396416
     
    398418     * Resolve the GC handler.
    399419     */
    400     RTRCPTR pfnPfHandlerRC = NIL_RTRCPTR;
    401     int rc = PDMR3LdrGetSymbolRCLazy(pVM, VMMRC_MAIN_MODULE_NAME, NULL /*pszSearchPath*/, pszPfHandlerRC, &pfnPfHandlerRC);
     420    RTRCPTR pfnHandlerRC = NIL_RTRCPTR;
     421    int rc = VINF_SUCCESS;
     422    if (pszHandlerRC)
     423        rc = PDMR3LdrGetSymbolRCLazy(pVM, VMMRC_MAIN_MODULE_NAME, NULL /*pszSearchPath*/, pszHandlerRC, &pfnHandlerRC);
    402424    if (RT_SUCCESS(rc))
    403         return PGMR3HandlerVirtualTypeRegisterEx(pVM, enmKind, fRelocUserRC,
    404                                                  pfnInvalidateR3, pfnHandlerR3,
    405                                                  pfnPfHandlerRC,
    406                                                  pszDesc, phType);
    407 
    408     AssertMsgFailed(("Failed to resolve %s.%s, rc=%Rrc.\n", VMMRC_MAIN_MODULE_NAME, pszPfHandlerRC, rc));
     425    {
     426        RTRCPTR pfnPfHandlerRC = NIL_RTRCPTR;
     427        int rc = PDMR3LdrGetSymbolRCLazy(pVM, VMMRC_MAIN_MODULE_NAME, NULL /*pszSearchPath*/, pszPfHandlerRC, &pfnPfHandlerRC);
     428        if (RT_SUCCESS(rc))
     429            return PGMR3HandlerVirtualTypeRegisterEx(pVM, enmKind, fRelocUserRC,
     430                                                     pfnInvalidateR3, pfnHandlerR3,
     431                                                     pfnHandlerRC, pfnPfHandlerRC,
     432                                                     pszDesc, phType);
     433
     434        AssertMsgFailed(("Failed to resolve %s.%s, rc=%Rrc.\n", VMMRC_MAIN_MODULE_NAME, pszPfHandlerRC, rc));
     435    }
     436    else
     437        AssertMsgFailed(("Failed to resolve %s.%s, rc=%Rrc.\n", VMMRC_MAIN_MODULE_NAME, pszHandlerRC, rc));
    409438    return rc;
    410439}
  • trunk/src/VBox/VMM/VMMR3/SELM.cpp

    r56013 r56052  
    200200        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_HYPERVISOR, false /*fRelocUserRC*/,
    201201                                             NULL /*pfnInvalidateR3*/, NULL /*pfnHandlerR3*/,
    202                                              "selmRCShadowGDTWritePfHandler",
     202                                             NULL /*pszHandlerRC*/, "selmRCShadowGDTWritePfHandler",
    203203                                             "Shadow GDT write access handler", &pVM->selm.s.hShadowGdtWriteHandlerType);
    204204        AssertRCReturn(rc, rc);
     
    207207        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_HYPERVISOR, false /*fRelocUserRC*/,
    208208                                             NULL /*pfnInvalidateR3*/, NULL /*pfnHandlerR3*/,
    209                                              "selmRCShadowTSSWritePfHandler",
     209                                             NULL /*pszHandlerRC*/, "selmRCShadowTSSWritePfHandler",
    210210                                             "Shadow TSS write access handler", &pVM->selm.s.hShadowTssWriteHandlerType);
    211211        AssertRCReturn(rc, rc);
     
    214214        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_HYPERVISOR, false /*fRelocUserRC*/,
    215215                                             NULL /*pfnInvalidateR3*/, NULL /*pfnHandlerR3*/,
    216                                              "selmRCShadowLDTWritePfHandler",
     216                                             NULL /*pszHandlerRC*/, "selmRCShadowLDTWritePfHandler",
    217217                                             "Shadow LDT write access handler", &pVM->selm.s.hShadowLdtWriteHandlerType);
    218218        AssertRCReturn(rc, rc);
     
    220220        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_WRITE, false /*fRelocUserRC*/,
    221221                                             NULL /*pfnInvalidateR3*/, selmGuestGDTWriteHandler,
    222                                              "selmRCGuestGDTWritePfHandler",
     222                                             "selmGuestGDTWriteHandler", "selmRCGuestGDTWritePfHandler",
    223223                                             "Guest GDT write access handler", &pVM->selm.s.hGuestGdtWriteHandlerType);
    224224        AssertRCReturn(rc, rc);
    225225        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_WRITE, false /*fRelocUserRC*/,
    226226                                             NULL /*pfnInvalidateR3*/, selmGuestLDTWriteHandler,
    227                                              "selmRCGuestLDTWritePfHandler",
     227                                             "selmGuestLDTWriteHandler", "selmRCGuestLDTWritePfHandler",
    228228                                             "Guest LDT write access handler", &pVM->selm.s.hGuestLdtWriteHandlerType);
    229229        AssertRCReturn(rc, rc);
    230230        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_WRITE, false /*fRelocUserRC*/,
    231231                                             NULL /*pfnInvalidateR3*/, selmGuestTSSWriteHandler,
    232                                              "selmRCGuestTSSWritePfHandler",
     232                                             "selmGuestTSSWriteHandler", "selmRCGuestTSSWritePfHandler",
    233233                                             "Guest TSS write access handler", &pVM->selm.s.hGuestTssWriteHandlerType);
    234234        AssertRCReturn(rc, rc);
  • trunk/src/VBox/VMM/VMMR3/TRPM.cpp

    r56051 r56052  
    508508        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_HYPERVISOR, false /*fRelocUserRC*/,
    509509                                             NULL /*pfnInvalidateR3*/, NULL /*pfnHandlerR3*/,
    510                                              "trpmRCShadowIDTWritePfHandler",
     510                                             NULL /*pszHandlerRC*/, "trpmRCShadowIDTWritePfHandler",
    511511                                             "Shadow IDT write access handler", &pVM->trpm.s.hShadowIdtWriteHandlerType);
    512512        AssertRCReturn(rc, rc);
     
    514514        rc = PGMR3HandlerVirtualTypeRegister(pVM, PGMVIRTHANDLERKIND_WRITE, false /*fRelocUserRC*/,
    515515                                             NULL /*pfnInvalidateR3*/, trpmGuestIDTWriteHandler,
    516                                              "trpmRCGuestIDTWritePfHandler",
     516                                             "trpmGuestIDTWriteHandler", "trpmRCGuestIDTWritePfHandler",
    517517                                             "Guest IDT write access handler", &pVM->trpm.s.hGuestIdtWriteHandlerType);
    518518        AssertRCReturn(rc, rc);
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r56051 r56052  
    711711    /** Whether the pvUserRC argument should be automatically relocated or not. */
    712712    bool                                fRelocUserRC;
    713     bool                                afPadding[3];
     713    bool                                afPadding[HC_ARCH_BITS == 64 ? 3 : 7];
     714    /** Pointer to RC callback function. */
     715    RCPTRTYPE(PFNPGMVIRTHANDLER)        pfnHandlerRC;
    714716    /** Pointer to RC callback function for \#PFs. */
    715717    RCPTRTYPE(PFNPGMRCVIRTPFHANDLER)    pfnPfHandlerRC;
     
    27122714    /** Virtual access handlers (AVL range + GC ptr tree). */
    27132715    AVLROGCPTRTREE                  VirtHandlers;
    2714     /** Virtual access handlers (Phys range AVL range + offsetptr tree). */
     2716    /** Virtual access handlers (Phys range AVL range + offsetptr tree).
     2717     * @remarks Handler of the hypervisor kind are of course not present.  */
    27152718    AVLROGCPHYSTREE                 PhysToVirtHandlers;
    27162719    /** Virtual access handlers for the hypervisor (AVL range + GC ptr tree). */
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r55896 r56052  
    791791    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, uState);
    792792    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerR3);
     793    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerR0);
    793794    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnPfHandlerR0);
     795    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerRC);
    794796    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnPfHandlerRC);
    795797    GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pszDesc);
     
    811813    GEN_CHECK_OFF(PGMVIRTHANDLERTYPEINT, uState);
    812814    GEN_CHECK_OFF(PGMVIRTHANDLERTYPEINT, fRelocUserRC);
     815    GEN_CHECK_OFF(PGMVIRTHANDLERTYPEINT, pfnHandlerRC);
    813816    GEN_CHECK_OFF(PGMVIRTHANDLERTYPEINT, pfnPfHandlerRC);
    814817    GEN_CHECK_OFF(PGMVIRTHANDLERTYPEINT, pfnInvalidateR3);
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