VirtualBox

Ignore:
Timestamp:
Sep 2, 2021 9:18:03 AM (3 years ago)
Author:
vboxsync
Message:

Devices/Security/DevTpm: Implement some todos, bugref:10075

File:
1 edited

Legend:

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

    r91067 r91084  
    493493    /** Flag whether the TPM driver below supportes other localities than 0. */
    494494    bool                            fLocChangeSup;
     495    /** Flag whether the establishment bit is set. */
     496    bool                            fEstablishmentSet;
    495497
    496498    /** Currently selected locality. */
     
    709711                && pThis->bmLocReqAcc & RT_BIT_32(bLoc))
    710712                u64 |= TPM_FIFO_LOCALITY_REG_ACCESS_REQUEST_USE;
    711             /** @todo Establishment bit. */
     713            if (pThis->fEstablishmentSet)
     714                u64 |= TPM_FIFO_LOCALITY_REG_ACCESS_ESTABLISHMENT;
    712715            break;
    713716        case TPM_FIFO_LOCALITY_REG_INT_ENABLE:
     
    800803                                     uint8_t bLoc, uint32_t uReg, uint64_t u64, size_t cb)
    801804{
    802     RT_NOREF(pDevIns);
     805#ifdef IN_RING3
     806    PDEVTPMR3 pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVTPMR3);
     807#endif
    803808
    804809    /* Special path for the data buffer. */
     
    871876            if (bLoc != pThis->bLoc)
    872877                break;
    873             /** @todo */
     878            pLoc->uRegIntEn = u32;
     879            tpmLocIrqUpdate(pDevIns, pThis, pLoc);
    874880            break;
    875881        case TPM_FIFO_LOCALITY_REG_INT_STS:
     
    904910                rc = PDMDevHlpTaskTrigger(pDevIns, pThis->hTpmCmdTask);
    905911            }
    906             /** @todo Cancel and reset establishment. */
     912
     913            if (   (u64 & TPM_FIFO_LOCALITY_REG_STS_RST_ESTABLISHMENT)
     914                && pThis->bLoc >= 3
     915                && (   pThis->enmState == DEVTPMSTATE_IDLE
     916                    || pThis->enmState == DEVTPMSTATE_CMD_COMPLETION))
     917            {
     918#ifndef IN_RING3
     919                rc = VINF_IOM_R3_MMIO_WRITE;
     920                break;
     921#else
     922                if (pThisCC->pDrvTpm)
     923                {
     924                    int rc2 = pThisCC->pDrvTpm->pfnResetEstablishedFlag(pThisCC->pDrvTpm, pThis->bLoc);
     925                    if (RT_SUCCESS(rc2))
     926                        pThis->fEstablishmentSet = false;
     927                    else
     928                        pThis->enmState == DEVTPMSTATE_FATAL_ERROR;
     929                }
     930                else
     931                    pThis->fEstablishmentSet = false;
     932#endif
     933            }
     934
     935            if (   (u64 & TPM_FIFO_LOCALITY_REG_STS_CMD_CANCEL)
     936                && pThis->enmState == DEVTPMSTATE_CMD_EXEC)
     937            {
     938#ifndef IN_RING3
     939                rc = VINF_IOM_R3_MMIO_WRITE;
     940                break;
     941#else
     942                if (pThisCC->pDrvTpm)
     943                {
     944                    pThis->enmState = DEVTPMSTATE_CMD_CANCEL;
     945                    int rc2 = pThisCC->pDrvTpm->pfnCmdCancel(pThisCC->pDrvTpm);
     946                    if (RT_FAILURE(rc2))
     947                        pThis->enmState == DEVTPMSTATE_FATAL_ERROR;
     948                }
     949#endif
     950            }
     951
    907952            break;
    908953        case TPM_FIFO_LOCALITY_REG_INT_VEC:
     
    954999                     ? TPM_CRB_LOCALITY_REG_STATE_ACTIVE_LOC_SET(pThis->bLoc) | TPM_CRB_LOCALITY_REG_STATE_LOC_ASSIGNED
    9551000                     : TPM_CRB_LOCALITY_REG_STATE_ACTIVE_LOC_SET(0));
     1001            if (pThis->fEstablishmentSet)
     1002                u64 |= TPM_CRB_LOCALITY_REG_ESTABLISHMENT;
    9561003            break;
    9571004        case TPM_CRB_LOCALITY_REG_STS:
     
    10611108                                    uint8_t bLoc, uint32_t uReg, uint64_t u64, size_t cb)
    10621109{
     1110#ifdef IN_RING3
     1111    PDEVTPMR3 pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PDEVTPMR3);
     1112#endif
     1113
    10631114    VBOXSTRICTRC rc = VINF_SUCCESS;
    10641115    uint32_t u32 = (uint32_t)u64;
     
    10811132        {
    10821133            /* See chapter 6.5.3.2.2.1. */
    1083 #if 0
    1084             if (u64 & TPM_CRB_LOCALITY_REG_CTRL_RST_ESTABLISHMENT)
    1085                 /** @todo */;
     1134            if (   (u64 & TPM_CRB_LOCALITY_REG_CTRL_RST_ESTABLISHMENT)
     1135                && pThis->bLoc >= 3
     1136                && (   pThis->enmState == DEVTPMSTATE_IDLE
     1137                    || pThis->enmState == DEVTPMSTATE_CMD_COMPLETION))
     1138            {
     1139#ifndef IN_RING3
     1140                rc = VINF_IOM_R3_MMIO_WRITE;
     1141                break;
     1142#else
     1143                if (pThisCC->pDrvTpm)
     1144                {
     1145                    int rc2 = pThisCC->pDrvTpm->pfnResetEstablishedFlag(pThisCC->pDrvTpm, pThis->bLoc);
     1146                    if (RT_SUCCESS(rc2))
     1147                        pThis->fEstablishmentSet = false;
     1148                    else
     1149                        pThis->enmState == DEVTPMSTATE_FATAL_ERROR;
     1150                }
     1151                else
     1152                    pThis->fEstablishmentSet = false;
    10861153#endif
     1154            }
    10871155
    10881156            /*
     
    10951163                && bLoc > pThis->bLoc)
    10961164            {
     1165                if (pThis->enmState == DEVTPMSTATE_CMD_EXEC)
     1166                {
     1167#ifndef IN_RING3
     1168                    rc = VINF_IOM_R3_MMIO_WRITE;
     1169                    break;
     1170#else
     1171                    pThis->enmState = DEVTPMSTATE_CMD_CANCEL;
     1172                    if (pThisCC->pDrvTpm)
     1173                    {
     1174                        int rc2 = pThisCC->pDrvTpm->pfnCmdCancel(pThisCC->pDrvTpm);
     1175                        if (RT_FAILURE(rc2))
     1176                            pThis->enmState == DEVTPMSTATE_FATAL_ERROR;
     1177                        else
     1178                        {
     1179                            pThis->enmState = DEVTPMSTATE_CMD_COMPLETION;
     1180                            tpmLocSetIntSts(pDevIns, pThis, pLoc, TPM_CRB_LOCALITY_REG_INT_STS_START);
     1181                        }
     1182                    }
     1183#endif
     1184                }
     1185
    10971186                pThis->bmLocSeizedAcc |= RT_BIT_32(pThis->bLoc);
    1098                 /** @todo Abort command. */
    10991187                pThis->bLoc = bLoc;
    11001188            }
     
    11501238                && u32 == 0x1)
    11511239            {
     1240#ifndef IN_RING3
     1241                rc = VINF_IOM_R3_MMIO_WRITE;
     1242                break;
     1243#else
    11521244                pThis->enmState = DEVTPMSTATE_CMD_CANCEL;
    1153                 /** @todo Cancel. */
    1154                 pThis->enmState = DEVTPMSTATE_CMD_COMPLETION;
    1155                 tpmLocSetIntSts(pDevIns, pThis, pLoc, TPM_CRB_LOCALITY_REG_INT_STS_START);
     1245                if (pThisCC->pDrvTpm)
     1246                {
     1247                    int rc2 = pThisCC->pDrvTpm->pfnCmdCancel(pThisCC->pDrvTpm);
     1248                    if (RT_FAILURE(rc2))
     1249                        pThis->enmState == DEVTPMSTATE_FATAL_ERROR;
     1250                    else
     1251                    {
     1252                        pThis->enmState = DEVTPMSTATE_CMD_COMPLETION;
     1253                        tpmLocSetIntSts(pDevIns, pThis, pLoc, TPM_CRB_LOCALITY_REG_INT_STS_START);
     1254                    }
     1255                }
     1256#endif
    11561257            }
    11571258            break;
     
    15211622        AssertLogRelMsgReturn(pThisCC->pDrvTpm, ("TPM#%d: Driver is missing the TPM interface.\n", iInstance), VERR_PDM_MISSING_INTERFACE);
    15221623
    1523         pThis->fLocChangeSup = pThisCC->pDrvTpm->pfnGetLocalityMax(pThisCC->pDrvTpm) > 0;
    1524         pThis->cbCmdResp     = RT_MIN(pThisCC->pDrvTpm->pfnGetBufferSize(pThisCC->pDrvTpm), TPM_DATA_BUFFER_SIZE_MAX);
     1624        pThis->fLocChangeSup     = pThisCC->pDrvTpm->pfnGetLocalityMax(pThisCC->pDrvTpm) > 0;
     1625        pThis->fEstablishmentSet = pThisCC->pDrvTpm->pfnGetEstablishedFlag(pThisCC->pDrvTpm);
     1626        pThis->cbCmdResp         = RT_MIN(pThisCC->pDrvTpm->pfnGetBufferSize(pThisCC->pDrvTpm), TPM_DATA_BUFFER_SIZE_MAX);
    15251627
    15261628        /* Startup the TPM here instead of in the power on callback as we can convey errors here to the upper layer. */
     
    15351637    else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    15361638    {
    1537         pThis->fLocChangeSup = false;
     1639        pThis->fLocChangeSup     = false;
     1640        pThis->fEstablishmentSet = false;
    15381641
    15391642        pThisCC->pDrvBase = NULL;
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