VirtualBox

Changeset 90996 in vbox for trunk/src


Ignore:
Timestamp:
Aug 30, 2021 12:57:49 PM (3 years ago)
Author:
vboxsync
Message:

Devices/Security: Only advertise the multiple localities supported capability if the driver below supports it, bugref:10075

Location:
trunk/src/VBox/Devices/Security
Files:
3 edited

Legend:

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

    r90904 r90996  
    205205/** TPM start of HASH operation signal register for locality 4. */
    206206#define TPM_FIFO_LOCALITY_REG_HASH_START                     0x28
     207
     208/** Locality interface ID register. */
     209#define TPM_FIFO_LOCALITY_REG_INTF_ID                         0x30
     210/** Interface type field. */
     211# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_MASK           UINT32_C(0xf)
     212# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_SHIFT          0
     213# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_SET(a)         ((a) << TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_SHIFT)
     214/** FIFO interface as defined in PTP for TPM 2.0 is active. */
     215#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_FIFO_TPM20    0x0
     216/** CRB interface is active. */
     217#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_CRB           0x1
     218/** FIFO interface as defined in TIS 1.3 is active. */
     219#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_TIS1_3        0xf
     220/** Interface type field. */
     221# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_MASK           UINT32_C(0xf)
     222# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_SHIFT          4
     223# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_SET(a)         ((a) << TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_SHIFT)
     224/** FIFO interface for TPM 2.0 */
     225#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_FIFO          0
     226/** CRB interface version 0. */
     227#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_CRB           1
     228/** Only locality 0 is supported when clear, set if 5 localities are supported. */
     229# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_LOCALITY           RT_BIT(8)
     230/** Maximum transfer size support. */
     231# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_MASK   0x1800
     232# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SHIFT  11
     233# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SET(a) ((a) << TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SHIFT)
     234/** Only legacy transfers supported. */
     235#  define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_LEGACY 0x0
     236/** 8B maximum transfer size. */
     237#  define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_8B   0x1
     238/** 32B maximum transfer size. */
     239#  define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_32B  0x2
     240/** 64B maximum transfer size. */
     241#  define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_64B  0x3
     242/** FIFO interface is supported and may be selected. */
     243# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_FIFO               RT_BIT(13)
     244/** CRB interface is supported and may be selected. */
     245# define TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_CRB                RT_BIT(14)
     246/** Interrupt polarity configuration. */
     247# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_MASK            0x60000
     248# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_SHIFT           17
     249# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_SET(a)          ((a) << TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_SHIFT)
     250# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_GET(a)          (((a) & TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_MASK) >> TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_SHIFT)
     251/** Selects the FIFO interface, takes effect on next _TPM_INIT. */
     252#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_FIFO           0
     253/** Selects the CRB interface, takes effect on next _TPM_INIT. */
     254#  define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_CRB            1
     255/** Locks the interface selector field and prevents further changes. */
     256# define TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_LOCK            RT_BIT(19)
     257
     258
    207259/** Extended data FIFO read/write register. */
    208260#define TPM_FIFO_LOCALITY_REG_XDATA_FIFO                     0x80
     
    274326# define TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_MASK   0x1800
    275327# define TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SHIFT  11
    276 # define TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SET(a) ((a) << TPM_FIFO_LOCALITY_REG_IF_CAP_DATA_XFER_SZ_SHIFT)
     328# define TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SET(a) ((a) << TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SHIFT)
    277329/** Only legacy transfers supported. */
    278330#  define TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_LEGACY 0x0
     
    439491    /** Flag whether CRB access mode is used. */
    440492    bool                            fCrb;
     493    /** Flag whether the TPM driver below supportes other localities than 0. */
     494    bool                            fLocChangeSup;
    441495
    442496    /** Currently selected locality. */
     
    699753            }
    700754            break;
     755        case TPM_FIFO_LOCALITY_REG_INTF_ID:
     756            u64 =   TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_SET(TPM_FIFO_LOCALITY_REG_INTF_ID_IF_VERS_FIFO)
     757                  | TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SET(TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_64B)
     758                  | TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_GET(TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_FIFO)
     759                  | TPM_FIFO_LOCALITY_REG_INTF_ID_IF_SEL_LOCK;
     760            if (pThis->enmTpmVers == TPMVERSION_1_2)
     761                u64 |= TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_SET(TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_TIS1_3);
     762            else
     763                u64 |= TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_SET(TPM_FIFO_LOCALITY_REG_INTF_ID_IF_TYPE_FIFO_TPM20);
     764
     765            if (pThis->fLocChangeSup) /* Only advertise the locality capability if the driver below supports it. */
     766                u64 |= TPM_FIFO_LOCALITY_REG_INTF_ID_CAP_LOCALITY;
     767            break;
    701768        case TPM_FIFO_LOCALITY_REG_DID_VID:
    702769            u64 = RT_H2BE_U32(RT_MAKE_U32(pThis->uVenId, pThis->uDevId));
     
    897964            u64 =   TPM_CRB_LOCALITY_REG_INTF_ID_IF_TYPE_SET(TPM_CRB_LOCALITY_REG_INTF_ID_IF_TYPE_CRB)
    898965                  | TPM_CRB_LOCALITY_REG_INTF_ID_IF_VERS_SET(TPM_CRB_LOCALITY_REG_INTF_ID_IF_VERS_CRB)
    899                   | TPM_CRB_LOCALITY_REG_INTF_ID_CAP_LOCALITY
    900966                  | TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_SET(TPM_CRB_LOCALITY_REG_INTF_ID_CAP_DATA_XFER_SZ_64B)
    901967                  | TPM_CRB_LOCALITY_REG_INTF_ID_CAP_CRB
     
    905971                  | TPM_CRB_LOCALITY_REG_INTF_ID_VID_SET(pThis->uVenId)
    906972                  | TPM_CRB_LOCALITY_REG_INTF_ID_DID_SET(pThis->uDevId);
     973
     974            if (pThis->fLocChangeSup) /* Only advertise the locality capability if the driver below supports it. */
     975                u64 |= TPM_CRB_LOCALITY_REG_INTF_ID_CAP_LOCALITY;
     976
    907977            break;
    908978        case TPM_CRB_LOCALITY_REG_CTRL_REQ:
     
    14481518        if (pThis->enmTpmVers == TPMVERSION_UNKNOWN)
    14491519            return PDMDEV_SET_ERROR(pDevIns, VERR_NOT_SUPPORTED, N_("The emulated TPM version is not supported"));
     1520
     1521        pThis->fLocChangeSup = pThisCC->pDrvTpm->pfnGetLocalityMax(pThisCC->pDrvTpm) > 0;
    14501522    }
    14511523    else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    14521524    {
     1525        pThis->fLocChangeSup = false;
     1526
    14531527        pThisCC->pDrvBase = NULL;
    14541528        pThisCC->pDrvTpm  = NULL;
  • trunk/src/VBox/Devices/Security/DrvTpmEmu.cpp

    r90904 r90996  
    602602
    603603
     604/** @interface_method_impl{PDMITPMCONNECTOR,pfnGetLocalityMax} */
     605static DECLCALLBACK(uint32_t) drvTpmEmuGetLocalityMax(PPDMITPMCONNECTOR pInterface)
     606{
     607    RT_NOREF(pInterface);
     608    return 4;
     609}
     610
     611
    604612/** @interface_method_impl{PDMITPMCONNECTOR,pfnGetEstablishedFlag} */
    605613static DECLCALLBACK(bool) drvTpmEmuGetEstablishedFlag(PPDMITPMCONNECTOR pInterface)
     
    795803    pThis->ITpmConnector.pfnReset                   = drvTpmEmuReset;
    796804    pThis->ITpmConnector.pfnGetVersion              = drvTpmEmuGetVersion;
     805    pThis->ITpmConnector.pfnGetLocalityMax          = drvTpmEmuGetLocalityMax;
    797806    pThis->ITpmConnector.pfnGetEstablishedFlag      = drvTpmEmuGetEstablishedFlag;
    798807    pThis->ITpmConnector.pfnResetEstablishedFlag    = drvTpmEmuResetEstablishedFlag;
  • trunk/src/VBox/Devices/Security/DrvTpmHost.cpp

    r90946 r90996  
    109109    }
    110110
    111     AssertFailed(); /* Shouldnb't get here. */
     111    AssertFailed(); /* Shouldn't get here. */
    112112    return TPMVERSION_UNKNOWN;
     113}
     114
     115
     116/** @interface_method_impl{PDMITPMCONNECTOR,pfnGetLocalityMax} */
     117static DECLCALLBACK(uint32_t) drvTpmHostGetLocalityMax(PPDMITPMCONNECTOR pInterface)
     118{
     119    PDRVTPMHOST pThis = RT_FROM_MEMBER(pInterface, DRVTPMHOST, ITpmConnector);
     120    return RTTpmGetLocalityMax(pThis->hTpm);
    113121}
    114122
     
    200208    pThis->ITpmConnector.pfnReset                   = drvTpmHostReset;
    201209    pThis->ITpmConnector.pfnGetVersion              = drvTpmHostGetVersion;
     210    pThis->ITpmConnector.pfnGetLocalityMax          = drvTpmHostGetLocalityMax;
    202211    pThis->ITpmConnector.pfnGetEstablishedFlag      = drvTpmHostGetEstablishedFlag;
    203212    pThis->ITpmConnector.pfnResetEstablishedFlag    = drvTpmHostResetEstablishedFlag;
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