VirtualBox

Changeset 91921 in vbox


Ignore:
Timestamp:
Oct 21, 2021 7:41:36 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
147726
Message:

VMM,Devices: Eliminate direct calls to PGMR3SharedModule* APIs and introduce callbacks in the device helper callback table, bugref:10074

Location:
trunk
Files:
3 edited

Legend:

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

    r91920 r91921  
    24242424
    24252425/** Current PDMDEVHLPR3 version number. */
    2426 #define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 53, 0)
     2426#define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 54, 0)
    24272427
    24282428/**
     
    31403140
    31413141    /**
     3142     * Inflate or deflate a memory balloon
     3143     *
     3144     * @returns VBox status code.
     3145     * @param   pDevIns             The device instance.
     3146     * @param   fInflate            Inflate or deflate memory balloon
     3147     * @param   cPages              Number of pages to free
     3148     * @param   paPhysPage          Array of guest physical addresses
     3149     */
     3150    DECLR3CALLBACKMEMBER(int, pfnPhysChangeMemBalloon,(PPDMDEVINS pDevIns, bool fInflate, unsigned cPages, RTGCPHYS *paPhysPage));
     3151
     3152    /**
    31423153     * Allocate memory which is associated with current VM instance
    31433154     * and automatically freed on it's destruction.
     
    46674678     */
    46684679    DECLR3CALLBACKMEMBER(int, pfnVMMDeregisterPatchMemory, (PPDMDEVINS pDevIns, RTGCPTR GCPtrPatchMem, uint32_t cbPatchMem));
     4680
     4681    /**
     4682     * Registers a new shared module for the VM
     4683     *
     4684     * @returns VBox status code.
     4685     * @param   pDevIns             The device instance.
     4686     * @param   enmGuestOS          Guest OS type.
     4687     * @param   pszModuleName       Module name.
     4688     * @param   pszVersion          Module version.
     4689     * @param   GCBaseAddr          Module base address.
     4690     * @param   cbModule            Module size.
     4691     * @param   cRegions            Number of shared region descriptors.
     4692     * @param   paRegions           Shared region(s).
     4693     */
     4694    DECLR3CALLBACKMEMBER(int, pfnSharedModuleRegister,(PPDMDEVINS pDevIns, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion,
     4695                                                       RTGCPTR GCBaseAddr, uint32_t cbModule,
     4696                                                       uint32_t cRegions, VMMDEVSHAREDREGIONDESC const *paRegions));
     4697
     4698    /**
     4699     * Unregisters a shared module for the VM
     4700     *
     4701     * @returns VBox status code.
     4702     * @param   pDevIns             The device instance.
     4703     * @param   pszModuleName       Module name.
     4704     * @param   pszVersion          Module version.
     4705     * @param   GCBaseAddr          Module base address.
     4706     * @param   cbModule            Module size.
     4707     */
     4708    DECLR3CALLBACKMEMBER(int, pfnSharedModuleUnregister,(PPDMDEVINS pDevIns, char *pszModuleName, char *pszVersion,
     4709                                                         RTGCPTR GCBaseAddr, uint32_t cbModule));
     4710
     4711    /**
     4712     * Query the state of a page in a shared module
     4713     *
     4714     * @returns VBox status code.
     4715     * @param   pVM                 The cross context VM structure.
     4716     * @param   GCPtrPage           Page address.
     4717     * @param   pfShared            Shared status (out).
     4718     * @param   pfPageFlags         Page flags (out).
     4719     */
     4720    DECLR3CALLBACKMEMBER(int, pfnSharedModuleGetPageState, (PPDMDEVINS pDevIns, RTGCPTR GCPtrPage, bool *pfShared, uint64_t *pfPageFlags));
     4721
     4722    /**
     4723     * Check all registered modules for changes.
     4724     *
     4725     * @returns VBox status code.
     4726     * @param   pDevIns             The device instance.
     4727     */
     4728    DECLR3CALLBACKMEMBER(int, pfnSharedModuleCheckAll,(PPDMDEVINS pDevIns));
    46694729
    46704730    /** @} */
     
    67596819{
    67606820    return pDevIns->CTX_SUFF(pHlp)->pfnPhysIsGCPhysNormal(pDevIns, GCPhys);
     6821}
     6822
     6823/**
     6824 * @copydoc PDMDEVHLPR3::pfnPhysChangeMemBalloon
     6825 */
     6826DECLINLINE(int) PDMDevHlpPhysChangeMemBalloon(PPDMDEVINS pDevIns, bool fInflate, unsigned cPages, RTGCPHYS *paPhysPage)
     6827{
     6828    return pDevIns->CTX_SUFF(pHlp)->pfnPhysChangeMemBalloon(pDevIns, fInflate, cPages, paPhysPage);
    67616829}
    67626830
     
    88518919}
    88528920
     8921/**
     8922 * @copydoc PDMDEVHLPR3::pfnSharedModuleRegister
     8923 */
     8924DECLINLINE(int) PDMDevHlpSharedModuleRegister(PPDMDEVINS pDevIns, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion,
     8925                                              RTGCPTR GCBaseAddr, uint32_t cbModule,
     8926                                              uint32_t cRegions, VMMDEVSHAREDREGIONDESC const *paRegions)
     8927{
     8928    return pDevIns->pHlpR3->pfnSharedModuleRegister(pDevIns, enmGuestOS, pszModuleName, pszVersion,
     8929                                                    GCBaseAddr, cbModule, cRegions, paRegions);
     8930}
     8931
     8932/**
     8933 * @copydoc PDMDEVHLPR3::pfnSharedModuleUnregister
     8934 */
     8935DECLINLINE(int) PDMDevHlpSharedModuleUnregister(PPDMDEVINS pDevIns, char *pszModuleName, char *pszVersion,
     8936                                                RTGCPTR GCBaseAddr, uint32_t cbModule)
     8937{
     8938    return pDevIns->pHlpR3->pfnSharedModuleUnregister(pDevIns, pszModuleName, pszVersion, GCBaseAddr, cbModule);
     8939}
     8940
     8941/**
     8942 * @copydoc PDMDEVHLPR3::pfnSharedModuleGetPageState
     8943 */
     8944DECLINLINE(int) PDMDevHlpSharedModuleGetPageState(PPDMDEVINS pDevIns, RTGCPTR GCPtrPage, bool *pfShared,
     8945                                                  uint64_t *pfPageFlags)
     8946{
     8947    return pDevIns->pHlpR3->pfnSharedModuleGetPageState(pDevIns, GCPtrPage, pfShared, pfPageFlags);
     8948}
     8949
     8950/**
     8951 * @copydoc PDMDEVHLPR3::pfnSharedModuleCheckAll
     8952 */
     8953DECLINLINE(int) PDMDevHlpSharedModuleCheckAll(PPDMDEVINS pDevIns)
     8954{
     8955    return pDevIns->pHlpR3->pfnSharedModuleCheckAll(pDevIns);
     8956}
     8957
    88538958/** Wrapper around SSMR3GetU32 for simplifying getting enum values saved as uint32_t. */
    88548959# define PDMDEVHLP_SSM_GET_ENUM32_RET(a_pHlp, a_pSSM, a_enmDst, a_EnumType) \
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r91920 r91921  
    21262126
    21272127    Log(("VMMDevReq_ChangeMemBalloon\n"));
    2128     int rc = PGMR3PhysChangeMemBalloon(PDMDevHlpGetVM(pDevIns), !!pReq->fInflate, pReq->cPages, pReq->aPhysPage);
     2128    int rc = PDMDevHlpPhysChangeMemBalloon(pDevIns, !!pReq->fInflate, pReq->cPages, pReq->aPhysPage);
    21292129    if (pReq->fInflate)
    21302130        STAM_REL_U32_INC(&pThis->StatMemBalloonChunks);
     
    24912491     * Forward the request to the VMM.
    24922492     */
    2493     return PGMR3SharedModuleRegister(PDMDevHlpGetVM(pDevIns), pReq->enmGuestOS, pReq->szName, pReq->szVersion,
    2494                                      pReq->GCBaseAddr, pReq->cbModule, pReq->cRegions, pReq->aRegions);
     2493    return PDMDevHlpSharedModuleRegister(pDevIns, pReq->enmGuestOS, pReq->szName, pReq->szVersion,
     2494                                         pReq->GCBaseAddr, pReq->cbModule, pReq->cRegions, pReq->aRegions);
    24952495}
    24962496
     
    25212521     * Forward the request to the VMM.
    25222522     */
    2523     return PGMR3SharedModuleUnregister(PDMDevHlpGetVM(pDevIns), pReq->szName, pReq->szVersion,
    2524                                        pReq->GCBaseAddr, pReq->cbModule);
     2523    return PDMDevHlpSharedModuleUnregister(pDevIns, pReq->szName, pReq->szVersion,
     2524                                           pReq->GCBaseAddr, pReq->cbModule);
    25252525}
    25262526
     
    25372537    AssertMsgReturn(pReq->header.size == sizeof(VMMDevSharedModuleCheckRequest),
    25382538                    ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    2539     return PGMR3SharedModuleCheckAll(PDMDevHlpGetVM(pDevIns));
     2539    return PDMDevHlpSharedModuleCheckAll(pDevIns);
    25402540}
    25412541
     
    25742574                    ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    25752575
    2576 # ifdef DEBUG
    2577     return PGMR3SharedModuleGetPageState(PDMDevHlpGetVM(pDevIns), pReq->GCPtrPage, &pReq->fShared, &pReq->uPageFlags);
    2578 # else
    2579     RT_NOREF(pDevIns);
    2580     return VERR_NOT_IMPLEMENTED;
    2581 # endif
     2576    return PDMDevHlpSharedModuleGetPageState(pDevIns, pReq->GCPtrPage, &pReq->fShared, &pReq->uPageFlags);
    25822577}
    25832578
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r91920 r91921  
    974974    Log(("pdmR3DevHlp_PhysIsGCPhysNormal: caller='%s'/%d: returns %RTbool\n", pDevIns->pReg->szName, pDevIns->iInstance, fNormal));
    975975    return fNormal;
     976}
     977
     978
     979/** @interface_method_impl{PDMDEVHLPR3,pfnPhysChangeMemBalloon} */
     980static DECLCALLBACK(int) pdmR3DevHlp_PhysChangeMemBalloon(PPDMDEVINS pDevIns, bool fInflate, unsigned cPages, RTGCPHYS *paPhysPage)
     981{
     982    PDMDEV_ASSERT_DEVINS(pDevIns);
     983    LogFlow(("pdmR3DevHlp_PhysChangeMemBalloon: caller='%s'/%d: fInflate=%RTbool cPages=%u paPhysPage=%p\n",
     984             pDevIns->pReg->szName, pDevIns->iInstance, fInflate, cPages, paPhysPage));
     985
     986    int rc = PGMR3PhysChangeMemBalloon(pDevIns->Internal.s.pVMR3, fInflate, cPages, paPhysPage);
     987
     988    Log(("pdmR3DevHlp_PhysChangeMemBalloon: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     989    return rc;
    976990}
    977991
     
    43564370static DECLCALLBACK(int) pdmR3DevHlp_VMMRegisterPatchMemory(PPDMDEVINS pDevIns, RTGCPTR GCPtrPatchMem, uint32_t cbPatchMem)
    43574371{
    4358     PDMDEV_ASSERT_DEVINS(pDevIns); RT_NOREF(pDevIns);
     4372    PDMDEV_ASSERT_DEVINS(pDevIns);
    43594373
    43604374    LogFlow(("pdmR3DevHlp_VMMRegisterPatchMemory: caller='%s'/%d: GCPtrPatchMem=%RGv cbPatchMem=%RU32\n",
     
    43714385static DECLCALLBACK(int) pdmR3DevHlp_VMMDeregisterPatchMemory(PPDMDEVINS pDevIns, RTGCPTR GCPtrPatchMem, uint32_t cbPatchMem)
    43724386{
    4373     PDMDEV_ASSERT_DEVINS(pDevIns); RT_NOREF(pDevIns);
     4387    PDMDEV_ASSERT_DEVINS(pDevIns);
    43744388
    43754389    LogFlow(("pdmR3DevHlp_VMMDeregisterPatchMemory: caller='%s'/%d: GCPtrPatchMem=%RGv cbPatchMem=%RU32\n",
     
    43794393
    43804394    LogFlow(("pdmR3DevHlp_VMMDeregisterPatchMemory: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     4395    return rc;
     4396}
     4397
     4398
     4399/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleRegister} */
     4400static DECLCALLBACK(int) pdmR3DevHlp_SharedModuleRegister(PPDMDEVINS pDevIns, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion,
     4401                                                          RTGCPTR GCBaseAddr, uint32_t cbModule,
     4402                                                          uint32_t cRegions, VMMDEVSHAREDREGIONDESC const *paRegions)
     4403{
     4404    PDMDEV_ASSERT_DEVINS(pDevIns);
     4405
     4406    LogFlow(("pdmR3DevHlp_SharedModuleRegister: caller='%s'/%d: enmGuestOS=%u pszModuleName=%p:{%s} pszVersion=%p:{%s} GCBaseAddr=%RGv cbModule=%#x cRegions=%u paRegions=%p\n",
     4407             pDevIns->pReg->szName, pDevIns->iInstance, enmGuestOS, pszModuleName, pszVersion, GCBaseAddr, cbModule, cRegions, paRegions));
     4408
     4409    int rc = PGMR3SharedModuleRegister(pDevIns->Internal.s.pVMR3, enmGuestOS, pszModuleName, pszVersion,
     4410                                       GCBaseAddr, cbModule, cRegions, paRegions);
     4411
     4412    LogFlow(("pdmR3DevHlp_SharedModuleRegister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     4413    return rc;
     4414}
     4415
     4416
     4417/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleUnregister} */
     4418static DECLCALLBACK(int) pdmR3DevHlp_SharedModuleUnregister(PPDMDEVINS pDevIns, char *pszModuleName, char *pszVersion,
     4419                                                            RTGCPTR GCBaseAddr, uint32_t cbModule)
     4420{
     4421    PDMDEV_ASSERT_DEVINS(pDevIns);
     4422
     4423    LogFlow(("pdmR3DevHlp_SharedModuleUnregister: caller='%s'/%d: enmGuestOS=%u pszModuleName=%p:{%s} pszVersion=%p:{%s} GCBaseAddr=%RGv cbModule=%#x\n",
     4424             pDevIns->pReg->szName, pDevIns->iInstance, pszModuleName, pszVersion, GCBaseAddr, cbModule));
     4425
     4426    int rc = PGMR3SharedModuleUnregister(pDevIns->Internal.s.pVMR3, pszModuleName, pszVersion, GCBaseAddr, cbModule);
     4427
     4428    LogFlow(("pdmR3DevHlp_SharedModuleUnregister: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
     4429    return rc;
     4430}
     4431
     4432
     4433/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleGetPageState} */
     4434static DECLCALLBACK(int) pdmR3DevHlp_SharedModuleGetPageState(PPDMDEVINS pDevIns, RTGCPTR GCPtrPage, bool *pfShared, uint64_t *pfPageFlags)
     4435{
     4436    PDMDEV_ASSERT_DEVINS(pDevIns);
     4437
     4438    LogFlow(("pdmR3DevHlp_SharedModuleGetPageState: caller='%s'/%d: GCPtrPage=%RGv pfShared=%p pfPageFlags=%p\n",
     4439             pDevIns->pReg->szName, pDevIns->iInstance, GCPtrPage, pfShared, pfPageFlags));
     4440
     4441#ifdef DEBUG
     4442    int rc = PGMR3SharedModuleGetPageState(PDMDevHlpGetVM(pDevIns), GCPtrPage, pfShared, pfPageFlags);
     4443#else
     4444    int rc = VERR_NOT_IMPLEMENTED;
     4445#endif
     4446
     4447    LogFlow(("pdmR3DevHlp_SharedModuleGetPageState: caller='%s'/%d: returns %Rrc *pfShared=%RTbool *pfPageFlags=%#RX64\n",
     4448             pDevIns->pReg->szName, pDevIns->iInstance, rc, *pfShared, *pfPageFlags));
     4449    return rc;
     4450}
     4451
     4452
     4453/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleCheckAll} */
     4454static DECLCALLBACK(int) pdmR3DevHlp_SharedModuleCheckAll(PPDMDEVINS pDevIns)
     4455{
     4456    PDMDEV_ASSERT_DEVINS(pDevIns);
     4457
     4458    LogFlow(("pdmR3DevHlp_SharedModuleCheckAll: caller='%s'/%d:\n", pDevIns->pReg->szName, pDevIns->iInstance));
     4459
     4460    int rc = PGMR3SharedModuleCheckAll(pDevIns->Internal.s.pVMR3);
     4461
     4462    LogFlow(("pdmR3DevHlp_SharedModuleCheckAll: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
    43814463    return rc;
    43824464}
     
    45844666    pdmR3DevHlp_PhysGCPtr2GCPhys,
    45854667    pdmR3DevHlp_PhysIsGCPhysNormal,
     4668    pdmR3DevHlp_PhysChangeMemBalloon,
    45864669    pdmR3DevHlp_MMHeapAlloc,
    45874670    pdmR3DevHlp_MMHeapAllocZ,
     
    47484831    pdmR3DevHlp_VMMRegisterPatchMemory,
    47494832    pdmR3DevHlp_VMMDeregisterPatchMemory,
     4833    pdmR3DevHlp_SharedModuleRegister,
     4834    pdmR3DevHlp_SharedModuleUnregister,
     4835    pdmR3DevHlp_SharedModuleGetPageState,
     4836    pdmR3DevHlp_SharedModuleCheckAll,
    47504837    PDM_DEVHLPR3_VERSION /* the end */
    47514838};
     
    49545041    pdmR3DevHlp_PhysGCPtr2GCPhys,
    49555042    pdmR3DevHlp_PhysIsGCPhysNormal,
     5043    pdmR3DevHlp_PhysChangeMemBalloon,
    49565044    pdmR3DevHlp_MMHeapAlloc,
    49575045    pdmR3DevHlp_MMHeapAllocZ,
     
    51185206    pdmR3DevHlp_VMMRegisterPatchMemory,
    51195207    pdmR3DevHlp_VMMDeregisterPatchMemory,
     5208    pdmR3DevHlp_SharedModuleRegister,
     5209    pdmR3DevHlp_SharedModuleUnregister,
     5210    pdmR3DevHlp_SharedModuleGetPageState,
     5211    pdmR3DevHlp_SharedModuleCheckAll,
    51205212    PDM_DEVHLPR3_VERSION /* the end */
    51215213};
     
    52965388    PDMDEV_ASSERT_DEVINS(pDevIns);
    52975389    RT_NOREF(GCPtrPatchMem, cbPatchMem);
     5390    AssertReleaseMsgFailed(("Untrusted device called trusted helper! '%s'/%d\n",
     5391                            pDevIns->pReg->szName, pDevIns->iInstance));
     5392    return VERR_ACCESS_DENIED;
     5393}
     5394
     5395
     5396/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleRegister} */
     5397static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_SharedModuleRegister(PPDMDEVINS pDevIns, VBOXOSFAMILY enmGuestOS, char *pszModuleName, char *pszVersion,
     5398                                                                    RTGCPTR GCBaseAddr, uint32_t cbModule,
     5399                                                                    uint32_t cRegions, VMMDEVSHAREDREGIONDESC const *paRegions)
     5400{
     5401    PDMDEV_ASSERT_DEVINS(pDevIns);
     5402    RT_NOREF(enmGuestOS, pszModuleName, pszVersion, GCBaseAddr, cbModule, cRegions, paRegions);
     5403    AssertReleaseMsgFailed(("Untrusted device called trusted helper! '%s'/%d\n",
     5404                            pDevIns->pReg->szName, pDevIns->iInstance));
     5405    return VERR_ACCESS_DENIED;
     5406}
     5407
     5408
     5409/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleUnregister} */
     5410static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_SharedModuleUnregister(PPDMDEVINS pDevIns, char *pszModuleName, char *pszVersion,
     5411                                                                      RTGCPTR GCBaseAddr, uint32_t cbModule)
     5412{
     5413    PDMDEV_ASSERT_DEVINS(pDevIns);
     5414    RT_NOREF(pszModuleName, pszVersion, GCBaseAddr, cbModule);
     5415    AssertReleaseMsgFailed(("Untrusted device called trusted helper! '%s'/%d\n",
     5416                            pDevIns->pReg->szName, pDevIns->iInstance));
     5417    return VERR_ACCESS_DENIED;
     5418}
     5419
     5420
     5421/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleGetPageState} */
     5422static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_SharedModuleGetPageState(PPDMDEVINS pDevIns, RTGCPTR GCPtrPage, bool *pfShared, uint64_t *pfPageFlags)
     5423{
     5424    PDMDEV_ASSERT_DEVINS(pDevIns);
     5425    RT_NOREF(GCPtrPage, pfShared, pfPageFlags);
     5426    AssertReleaseMsgFailed(("Untrusted device called trusted helper! '%s'/%d\n",
     5427                            pDevIns->pReg->szName, pDevIns->iInstance));
     5428    return VERR_ACCESS_DENIED;
     5429}
     5430
     5431
     5432/** @interface_method_impl{PDMDEVHLPR3,pfnSharedModuleCheckAll} */
     5433static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_SharedModuleCheckAll(PPDMDEVINS pDevIns)
     5434{
     5435    PDMDEV_ASSERT_DEVINS(pDevIns);
    52985436    AssertReleaseMsgFailed(("Untrusted device called trusted helper! '%s'/%d\n",
    52995437                            pDevIns->pReg->szName, pDevIns->iInstance));
     
    55035641    pdmR3DevHlp_PhysGCPtr2GCPhys,
    55045642    pdmR3DevHlp_PhysIsGCPhysNormal,
     5643    pdmR3DevHlp_PhysChangeMemBalloon,
    55055644    pdmR3DevHlp_MMHeapAlloc,
    55065645    pdmR3DevHlp_MMHeapAllocZ,
     
    56675806    pdmR3DevHlp_Untrusted_VMMRegisterPatchMemory,
    56685807    pdmR3DevHlp_Untrusted_VMMDeregisterPatchMemory,
     5808    pdmR3DevHlp_Untrusted_SharedModuleRegister,
     5809    pdmR3DevHlp_Untrusted_SharedModuleUnregister,
     5810    pdmR3DevHlp_Untrusted_SharedModuleGetPageState,
     5811    pdmR3DevHlp_Untrusted_SharedModuleCheckAll,
    56695812    PDM_DEVHLPR3_VERSION /* the end */
    56705813};
Note: See TracChangeset for help on using the changeset viewer.

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