VirtualBox

Changeset 99554 in vbox for trunk/src/VBox/Devices/Security


Ignore:
Timestamp:
Apr 28, 2023 7:36:38 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
157063
Message:

Devices/Security/DevTpm: Query the established flag and buffer size only after the TPM got instantiated, fixes a crash early on during VM power on when TPM 1.2 is used, bugref:10075

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Security/DevTpm.cpp

    r99313 r99554  
    14541454
    14551455
     1456/**
     1457 * Resets the shared hardware TPM state.
     1458 *
     1459 * @returns nothing.
     1460 * @param   pThis               Pointer to the shared TPM device.
     1461 */
     1462static void tpmR3HwReset(PDEVTPM pThis)
     1463{
     1464    pThis->enmState       = DEVTPMSTATE_IDLE;
     1465    pThis->bLoc           = TPM_NO_LOCALITY_SELECTED;
     1466    pThis->bmLocReqAcc    = 0;
     1467    pThis->bmLocSeizedAcc = 0;
     1468    pThis->offCmdResp     = 0;
     1469    RT_ZERO(pThis->abCmdResp);
     1470
     1471    for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aLoc); i++)
     1472    {
     1473        PDEVTPMLOCALITY pLoc = &pThis->aLoc[i];
     1474        pLoc->uRegIntEn  = 0;
     1475        pLoc->uRegIntSts = 0;
     1476    }
     1477}
     1478
     1479
    14561480/* -=-=-=-=-=-=-=-=- Saved State -=-=-=-=-=-=-=-=- */
    14571481
     
    16111635
    16121636/**
     1637 * @interface_method_impl{PDMDEVREG,pfnPowerOn}
     1638 */
     1639static DECLCALLBACK(void) tpmR3PowerOn(PPDMDEVINS pDevIns)
     1640{
     1641    PDEVTPM   pThis   = PDMDEVINS_2_DATA(pDevIns, PDEVTPM);
     1642    PDEVTPMCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVTPMCC);
     1643
     1644    if (pThisCC->pDrvTpm)
     1645    {
     1646        pThis->fEstablishmentSet = pThisCC->pDrvTpm->pfnGetEstablishedFlag(pThisCC->pDrvTpm);
     1647        pThis->cbCmdResp         = RT_MIN(pThisCC->pDrvTpm->pfnGetBufferSize(pThisCC->pDrvTpm), TPM_DATA_BUFFER_SIZE_MAX);
     1648    }
     1649}
     1650
     1651
     1652/**
    16131653 * @interface_method_impl{PDMDEVREG,pfnReset}
    16141654 */
     
    16161656{
    16171657    PDEVTPM   pThis   = PDMDEVINS_2_DATA(pDevIns, PDEVTPM);
    1618 
    1619     pThis->enmState       = DEVTPMSTATE_IDLE;
    1620     pThis->bLoc           = TPM_NO_LOCALITY_SELECTED;
    1621     pThis->bmLocReqAcc    = 0;
    1622     pThis->bmLocSeizedAcc = 0;
    1623     pThis->offCmdResp     = 0;
    1624     RT_ZERO(pThis->abCmdResp);
    1625 
    1626     for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aLoc); i++)
     1658    PDEVTPMCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVTPMCC);
     1659
     1660    tpmR3HwReset(pThis);
     1661    if (pThisCC->pDrvTpm)
    16271662    {
    1628         PDEVTPMLOCALITY pLoc = &pThis->aLoc[i];
    1629         pLoc->uRegIntEn  = 0;
    1630         pLoc->uRegIntSts = 0;
     1663        pThis->fEstablishmentSet = pThisCC->pDrvTpm->pfnGetEstablishedFlag(pThisCC->pDrvTpm);
     1664        pThis->cbCmdResp         = RT_MIN(pThisCC->pDrvTpm->pfnGetBufferSize(pThisCC->pDrvTpm), TPM_DATA_BUFFER_SIZE_MAX);
    16311665    }
    16321666}
     
    17211755        AssertLogRelMsgReturn(pThisCC->pDrvTpm, ("TPM#%d: Driver is missing the TPM interface.\n", iInstance), VERR_PDM_MISSING_INTERFACE);
    17221756
    1723         pThis->fLocChangeSup     = pThisCC->pDrvTpm->pfnGetLocalityMax(pThisCC->pDrvTpm) > 0;
    1724         pThis->fEstablishmentSet = pThisCC->pDrvTpm->pfnGetEstablishedFlag(pThisCC->pDrvTpm);
    1725         pThis->cbCmdResp         = RT_MIN(pThisCC->pDrvTpm->pfnGetBufferSize(pThisCC->pDrvTpm), TPM_DATA_BUFFER_SIZE_MAX);
     1757        pThis->fLocChangeSup = pThisCC->pDrvTpm->pfnGetLocalityMax(pThisCC->pDrvTpm) > 0;
    17261758
    17271759        pThis->enmTpmVers = pThisCC->pDrvTpm->pfnGetVersion(pThisCC->pDrvTpm);
     
    17541786    AssertRCReturn(rc, rc);
    17551787
    1756     tpmR3Reset(pDevIns);
     1788    tpmR3HwReset(pThis);
    17571789    return VINF_SUCCESS;
    17581790}
     
    18011833    /* .pfnRelocate = */            NULL,
    18021834    /* .pfnMemSetup = */            NULL,
    1803     /* .pfnPowerOn = */             NULL,
    1804     /* .pfnReset = */               NULL,
     1835    /* .pfnPowerOn = */             tpmR3PowerOn,
     1836    /* .pfnReset = */               tpmR3Reset,
    18051837    /* .pfnSuspend = */             NULL,
    18061838    /* .pfnResume = */              NULL,
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