VirtualBox

Changeset 28422 in vbox


Ignore:
Timestamp:
Apr 16, 2010 3:47:03 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60188
Message:

Shared paging updates

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/gmm.h

    r28036 r28422  
    3434#include <VBox/gvmm.h>
    3535#include <VBox/sup.h>
     36#include <VBox/VMMDev.h> /* for VMMDEVSHAREDREGIONDESC */
    3637
    3738RT_C_DECLS_BEGIN
     
    297298GMMR0DECL(int)  GMMR0MapUnmapChunk(PVM pVM, VMCPUID idCpu, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3);
    298299GMMR0DECL(int)  GMMR0SeedChunk(PVM pVM, VMCPUID idCpu, RTR3PTR pvR3);
     300GMMR0DECL(int)  GMMR0RegisterSharedModule(PVM pVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule, unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions);
     301GMMR0DECL(int)  GMMR0UnregisterSharedModule(PVM pVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule);
     302GMMR0DECL(int)  GMMR0CheckSharedModules(PVM pVM, VMCPUID idCpu);
    299303
    300304
     
    454458
    455459GMMR0DECL(int) GMMR0FreeLargePageReq(PVM pVM, VMCPUID idCpu, PGMMFREELARGEPAGEREQ pReq);
     460
     461/**
     462 * Request buffer for GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE.
     463 * @see GMMR0RegisterSharedModule.
     464 */
     465typedef struct GMMREGISTERSHAREDMODULEREQ
     466{
     467    /** The header. */
     468    SUPVMMR0REQHDR              Hdr;
     469    /** Shared module size. */
     470    uint32_t                    cbModule;
     471    /** Number of included region descriptors */
     472    uint32_t                    cRegions;
     473    /** Base address of the shared module. */
     474    RTGCPTR64                   GCBaseAddr;
     475    /** Module name */
     476    char                        szName[128];
     477    /** Module version */
     478    char                        szVersion[16];
     479    /** Shared region descriptor(s). */
     480    VMMDEVSHAREDREGIONDESC      aRegions[1];
     481} GMMREGISTERSHAREDMODULEREQ;
     482/** Pointer to a GMMR0RegisterSharedModuleReq / VMMR0_DO_GMM_REGISTER_SHARED_MODULE request buffer. */
     483typedef GMMREGISTERSHAREDMODULEREQ *PGMMREGISTERSHAREDMODULEREQ;
     484
     485GMMR0DECL(int) GMMR0RegisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMREGISTERSHAREDMODULEREQ pReq);
     486
     487
     488/**
     489 * Request buffer for GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE.
     490 * @see GMMR0UnregisterSharedModule.
     491 */
     492typedef struct GMMUNREGISTERSHAREDMODULEREQ
     493{
     494    /** The header. */
     495    SUPVMMR0REQHDR              Hdr;
     496    /** Shared module size. */
     497    uint32_t                    cbModule;
     498    /** Align at 8 byte boundary. */
     499    uint32_t                    u32Alignment;
     500    /** Base address of the shared module. */
     501    RTGCPTR64                   GCBaseAddr;
     502    /** Module name */
     503    char                        szName[128];
     504    /** Module version */
     505    char                        szVersion[16];
     506} GMMUNREGISTERSHAREDMODULEREQ;
     507/** Pointer to a GMMR0UnregisterSharedModuleReq / VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE request buffer. */
     508typedef GMMUNREGISTERSHAREDMODULEREQ *PGMMUNREGISTERSHAREDMODULEREQ;
     509
     510GMMR0DECL(int) GMMR0UnregisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMUNREGISTERSHAREDMODULEREQ pReq);
    456511
    457512
     
    478533GMMR3DECL(int)  GMMR3BalloonedPages(PVM pVM, GMMBALLOONACTION enmAction, uint32_t cBalloonedPages);
    479534GMMR3DECL(int)  GMMR3QueryVMMMemoryStats(PVM pVM, uint64_t *pcTotalAllocPages, uint64_t *pcTotalFreePages, uint64_t *pcTotalBalloonPages);
     535GMMR3DECL(int)  GMMR3RegisterSharedModule(PVM pVM, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule,
     536                                          unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions);
     537GMMR3DECL(int)  GMMR3UnregisterSharedModule(PVM pVM, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule);
     538GMMR3DECL(int)  GMMR3CheckSharedModules(PVM pVM);
    480539/** @} */
    481540#endif /* IN_RING3 */
  • trunk/include/VBox/vmm.h

    r28036 r28422  
    308308    /** Call GMMR0SeedChunk(). */
    309309    VMMR0_DO_GMM_SEED_CHUNK,
     310    /** Call GMMR0RegisterSharedModule. */
     311    VMMR0_DO_GMM_REGISTER_SHARED_MODULE,
     312    /** Call GMMR0UnregisterSharedModule. */
     313    VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE,
     314    /** Call GMMR0CheckSharedModules. */
     315    VMMR0_DO_GMM_CHECK_SHARED_MODULES,
    310316
    311317    /** Set a GVMM or GMM configuration value. */
  • trunk/src/VBox/VMM/GMM.cpp

    r28039 r28422  
    3535#include <VBox/log.h>
    3636#include <iprt/mem.h>
     37#include <iprt/string.h>
    3738
    3839
     
    354355}
    355356
     357
     358/**
     359 * @see GMMR0RegisterSharedModule
     360 */
     361GMMR3DECL(int) GMMR3RegisterSharedModule(PVM pVM, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule,
     362                                         unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions)
     363{
     364    PGMMREGISTERSHAREDMODULEREQ pReq;
     365    int rc;
     366
     367    /* Sanity check. */
     368    AssertReturn(cRegions < VMMDEVSHAREDREGIONDESC_MAX, VERR_INVALID_PARAMETER);
     369
     370    pReq = (PGMMREGISTERSHAREDMODULEREQ)RTMemAllocZ(RT_OFFSETOF(GMMREGISTERSHAREDMODULEREQ, aRegions[cRegions]));
     371    AssertReturn(pReq, VERR_NO_MEMORY);
     372
     373    pReq->Hdr.u32Magic  = SUPVMMR0REQHDR_MAGIC;
     374    pReq->Hdr.cbReq     = sizeof(*pReq);
     375    pReq->GCBaseAddr    = GCBaseAddr;
     376    pReq->cbModule      = cbModule;
     377    pReq->cRegions      = cRegions;
     378    for (unsigned i = 0; i < cRegions; i++)
     379        pReq->aRegions[i] = pRegions[i];
     380
     381    if (    RTStrCopy(pReq->szName, sizeof(pReq->szName), pszModuleName) != VINF_SUCCESS
     382        ||  RTStrCopy(pReq->szVersion, sizeof(pReq->szVersion), pszVersion) != VINF_SUCCESS)
     383    {
     384        rc = VERR_BUFFER_OVERFLOW;
     385        goto end;
     386    }
     387
     388    rc = VMMR3CallR0(pVM, VMMR0_DO_GMM_REGISTER_SHARED_MODULE, 0, &pReq->Hdr);
     389end:
     390    RTMemFree(pReq);
     391    return rc;
     392}
     393
     394/**
     395 * @see GMMR0RegisterSharedModule
     396 */
     397GMMR3DECL(int) GMMR3UnregisterSharedModule(PVM pVM, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule)
     398{
     399    GMMUNREGISTERSHAREDMODULEREQ Req;
     400    Req.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
     401    Req.Hdr.cbReq = sizeof(Req);
     402   
     403    Req.GCBaseAddr    = GCBaseAddr;
     404    Req.cbModule      = cbModule;
     405
     406    if (    RTStrCopy(Req.szName, sizeof(Req.szName), pszModuleName) != VINF_SUCCESS
     407        ||  RTStrCopy(Req.szVersion, sizeof(Req.szVersion), pszVersion) != VINF_SUCCESS)
     408    {
     409        return VERR_BUFFER_OVERFLOW;
     410    }
     411
     412    return VMMR3CallR0(pVM, VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE, 0, &Req.Hdr);
     413}
     414
     415/**
     416 * @see GMMR0CheckSharedModules
     417 */
     418GMMR3DECL(int) GMMR3CheckSharedModules(PVM pVM)
     419{
     420    return VMMR3CallR0(pVM, VMMR0_DO_GMM_CHECK_SHARED_MODULES, 0, NULL);
     421}
  • trunk/src/VBox/VMM/PGMSharedPage.cpp

    r28421 r28422  
    5252                                         unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions)
    5353{
    54     return VERR_NOT_IMPLEMENTED;
     54    return GMMR3RegisterSharedModule(pVM, pszModuleName, pszVersion, GCBaseAddr, cbModule, cRegions, pRegions);
    5555}
    5656
     
    6868VMMR3DECL(int) PGMR3SharedModuleUnregister(PVM pVM, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule)
    6969{
    70     return VERR_NOT_IMPLEMENTED;
     70    return GMMR3UnregisterSharedModule(pVM, pszModuleName, pszVersion, GCBaseAddr, cbModule);
    7171}
    7272
     
    8080VMMR3DECL(int) PGMR3SharedModuleCheck(PVM pVM)
    8181{
    82     return VERR_NOT_IMPLEMENTED;
     82    return GMMR3CheckSharedModules(pVM);
    8383}
  • trunk/src/VBox/VMM/VMMR0/GMMR0.cpp

    r28043 r28422  
    33143314}
    33153315
     3316
     3317/**
     3318 * Registers a new shared module for the VM
     3319 *
     3320 * @returns VBox status code.
     3321 * @param   pVM                 VM handle
     3322 * @param   idCpu               VCPU id
     3323 * @param   pszModuleName       Module name
     3324 * @param   pszVersion          Module version
     3325 * @param   GCBaseAddr          Module base address
     3326 * @param   cbModule            Module size
     3327 * @param   cRegions            Number of shared region descriptors
     3328 * @param   pRegions            Shared region(s)
     3329 */
     3330GMMR0DECL(int) GMMR0RegisterSharedModule(PVM pVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule,
     3331                                         unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions)
     3332{
     3333    return VERR_NOT_IMPLEMENTED;
     3334}
     3335
     3336
     3337/**
     3338 * VMMR0 request wrapper for GMMR0RegisterSharedModule.
     3339 *
     3340 * @returns see GMMR0RegisterSharedModule.
     3341 * @param   pVM             Pointer to the shared VM structure.
     3342 * @param   idCpu           VCPU id
     3343 * @param   pReq            The request packet.
     3344 */
     3345GMMR0DECL(int)  GMMR0RegisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMREGISTERSHAREDMODULEREQ pReq)
     3346{
     3347    /*
     3348     * Validate input and pass it on.
     3349     */
     3350    AssertPtrReturn(pVM, VERR_INVALID_POINTER);
     3351    AssertPtrReturn(pReq, VERR_INVALID_POINTER);
     3352    AssertMsgReturn(pReq->Hdr.cbReq >= sizeof(*pReq) && pReq->Hdr.cbReq == RT_OFFSETOF(GMMREGISTERSHAREDMODULEREQ, aRegions[pReq->cRegions]), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);
     3353
     3354    return GMMR0RegisterSharedModule(pVM, idCpu, pReq->szName, pReq->szVersion, pReq->GCBaseAddr, pReq->cbModule, pReq->cRegions, pReq->aRegions);
     3355}
     3356
     3357/**
     3358 * Unregisters a shared module for the VM
     3359 *
     3360 * @returns VBox status code.
     3361 * @param   pVM                 VM handle
     3362 * @param   idCpu               VCPU id
     3363 * @param   pszModuleName       Module name
     3364 * @param   pszVersion          Module version
     3365 * @param   GCBaseAddr          Module base address
     3366 * @param   cbModule            Module size
     3367 */
     3368GMMR0DECL(int) GMMR0UnregisterSharedModule(PVM pVM, VMCPUID idCpu, char *pszModuleName, char *pszVersion, RTGCPTR GCBaseAddr, uint32_t cbModule)
     3369{
     3370    return VERR_NOT_IMPLEMENTED;
     3371}
     3372
     3373/**
     3374 * VMMR0 request wrapper for GMMR0UnregisterSharedModule.
     3375 *
     3376 * @returns see GMMR0UnregisterSharedModule.
     3377 * @param   pVM             Pointer to the shared VM structure.
     3378 * @param   idCpu           VCPU id
     3379 * @param   pReq            The request packet.
     3380 */
     3381GMMR0DECL(int)  GMMR0UnregisterSharedModuleReq(PVM pVM, VMCPUID idCpu, PGMMUNREGISTERSHAREDMODULEREQ pReq)
     3382{
     3383    /*
     3384     * Validate input and pass it on.
     3385     */
     3386    AssertPtrReturn(pVM, VERR_INVALID_POINTER);
     3387    AssertPtrReturn(pReq, VERR_INVALID_POINTER);
     3388    AssertMsgReturn(pReq->Hdr.cbReq == sizeof(*pReq), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);
     3389
     3390    return GMMR0UnregisterSharedModule(pVM, idCpu, pReq->szName, pReq->szVersion, pReq->GCBaseAddr, pReq->cbModule);
     3391}
     3392
     3393
     3394/**
     3395 * Checks regsitered modules for shared pages
     3396 *
     3397 * @returns VBox status code.
     3398 * @param   pVM                 VM handle
     3399 * @param   idCpu               VCPU id
     3400 */
     3401GMMR0DECL(int) GMMR0CheckSharedModules(PVM pVM, VMCPUID idCpu)
     3402{
     3403    return VERR_NOT_IMPLEMENTED;
     3404}
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r28320 r28422  
    936936            return GMMR0SeedChunk(pVM, idCpu, (RTR3PTR)u64Arg);
    937937
     938        case VMMR0_DO_GMM_REGISTER_SHARED_MODULE:
     939            if (u64Arg)
     940                return VERR_INVALID_PARAMETER;
     941            return GMMR0RegisterSharedModuleReq(pVM, idCpu, (PGMMREGISTERSHAREDMODULEREQ)pReqHdr);
     942
     943        case VMMR0_DO_GMM_UNREGISTER_SHARED_MODULE:
     944            if (u64Arg)
     945                return VERR_INVALID_PARAMETER;
     946            return GMMR0UnregisterSharedModuleReq(pVM, idCpu, (PGMMUNREGISTERSHAREDMODULEREQ)pReqHdr);
     947
     948        case VMMR0_DO_GMM_CHECK_SHARED_MODULES:
     949            if (    u64Arg
     950                ||  pReqHdr)
     951                return VERR_INVALID_PARAMETER;
     952            return GMMR0CheckSharedModules(pVM, idCpu);
     953
    938954        /*
    939955         * A quick GCFGM mock-up.
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