Changeset 91311 in vbox
- Timestamp:
- Sep 20, 2021 11:06:33 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Security/DrvTpmEmuTpms.cpp
r91137 r91311 68 68 /** Pointer to the driver instance. */ 69 69 PPDMDRVINS pDrvIns; 70 /** The VFS interface of the driver below for NVRAM/TPM state loading and storing. */ 71 PPDMIVFSCONNECTOR pDrvVfs; 70 72 71 73 /** The TPM version we are emulating. */ … … 262 264 263 265 266 /** 267 * Tries to load the NVRAM from the VFS driver below. 268 * 269 * @returns VBox status code. 270 * @param pThis The emulator driver instance data. 271 */ 272 static int drvTpmEmuTpmsNvramLoadFromVfs(PDRVTPMEMU pThis) 273 { 274 uint64_t cbState = 0; 275 int rc = pThis->pDrvVfs->pfnQuerySize(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_PERMANENT_ALL_NAME, &cbState); 276 if (RT_SUCCESS(rc)) 277 { 278 pThis->pvNvPermall = RTMemAllocZ(cbState); 279 if (pThis->pvNvPermall) 280 { 281 pThis->cbNvPermall = (size_t)cbState; 282 rc = pThis->pDrvVfs->pfnReadAll(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_PERMANENT_ALL_NAME, 283 pThis->pvNvPermall, pThis->cbNvPermall); 284 if (RT_SUCCESS(rc)) 285 { 286 /* Load the volatile state if existing. */ 287 rc = pThis->pDrvVfs->pfnQuerySize(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_VOLATILESTATE_NAME, &cbState); 288 if (RT_SUCCESS(rc)) 289 { 290 pThis->pvNvVolatile = RTMemAllocZ(cbState); 291 if (pThis->pvNvVolatile) 292 { 293 pThis->cbNvVolatile = (size_t)cbState; 294 rc = pThis->pDrvVfs->pfnReadAll(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_VOLATILESTATE_NAME, 295 pThis->pvNvVolatile, pThis->cbNvVolatile); 296 } 297 } 298 else if (rc == VERR_NOT_FOUND) 299 rc = VINF_SUCCESS; /* This is fine if there is no volatile state. */ 300 } 301 } 302 else 303 rc = VERR_NO_MEMORY; 304 } 305 else if (rc == VERR_NOT_FOUND) 306 rc = VINF_SUCCESS; /* This is fine for the first start of a new VM. */ 307 308 return rc; 309 } 310 311 312 /** 313 * Stores the NVRAM content using the VFS driver below. 314 * 315 * @returns VBox status code. 316 * @param pThis The emulator driver instance data. 317 */ 318 static int drvTpmEmuTpmsNvramStoreToVfs(PDRVTPMEMU pThis) 319 { 320 AssertPtr(pThis->pvNvPermall); 321 int rc = pThis->pDrvVfs->pfnWriteAll(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_PERMANENT_ALL_NAME, 322 pThis->pvNvPermall, pThis->cbNvPermall); 323 if ( RT_SUCCESS(rc) 324 && pThis->pvNvVolatile) 325 rc = pThis->pDrvVfs->pfnWriteAll(pThis->pDrvVfs, pThis->pDrvIns->pReg->szName, TPM_VOLATILESTATE_NAME, 326 pThis->pvNvVolatile, pThis->cbNvVolatile); 327 328 return rc; 329 } 330 331 332 /* -=-=-=-=- PDMITPMCONNECTOR interface callabcks. -=-=-=-=- */ 333 334 264 335 /** @interface_method_impl{PDMITPMCONNECTOR,pfnGetVersion} */ 265 336 static DECLCALLBACK(TPMVERSION) drvTpmEmuTpmsGetVersion(PPDMITPMCONNECTOR pInterface) … … 690 761 if (!pThis->fSsmCalled) 691 762 { 692 int rc = drvTpmEmuTpmsNvramStore(pThis); 763 int rc; 764 if (pThis->pDrvVfs) 765 rc = drvTpmEmuTpmsNvramStoreToVfs(pThis); 766 else 767 rc = drvTpmEmuTpmsNvramStore(pThis); 693 768 AssertRC(rc); 694 769 } … … 754 829 TPMLIB_SetDebugLevel(~0); 755 830 756 int rc = CFGMR3QueryStringAlloc(pCfg, "NvramPath", &pThis->pszNvramPath); 757 if (RT_FAILURE(rc) && rc != VERR_CFGM_VALUE_NOT_FOUND) 831 /* 832 * Try attach the VFS driver below and query it's VFS interface. 833 */ 834 PPDMIBASE pBase = NULL; 835 int rc = PDMDrvHlpAttach(pDrvIns, fFlags, &pBase); 836 if (RT_FAILURE(rc) && rc != VERR_PDM_NO_ATTACHED_DRIVER) 758 837 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, 759 N_("Configuration error: querying \"NvramPath\" resulted in %Rrc"), rc); 760 761 rc = drvTpmEmuTpmsNvramLoad(pThis); 762 if (RT_FAILURE(rc)) 763 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, 764 N_("Failed to load TPM NVRAM data with %Rrc"), rc); 838 N_("Failed to attach driver below us! %Rrc"), rc); 839 if (pBase) 840 { 841 pThis->pDrvVfs = PDMIBASE_QUERY_INTERFACE(pBase, PDMIVFSCONNECTOR); 842 if (!pThis->pDrvVfs) 843 return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_MISSING_INTERFACE_BELOW, 844 N_("No VFS interface below")); 845 846 rc = drvTpmEmuTpmsNvramLoadFromVfs(pThis); 847 if (RT_FAILURE(rc)) 848 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, 849 N_("Failed to load TPM NVRAM data with %Rrc"), rc); 850 } 851 else 852 { 853 rc = CFGMR3QueryStringAlloc(pCfg, "NvramPath", &pThis->pszNvramPath); 854 if (RT_FAILURE(rc)) 855 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, 856 N_("Configuration error: querying \"NvramPath\" resulted in %Rrc"), rc); 857 858 rc = drvTpmEmuTpmsNvramLoad(pThis); 859 if (RT_FAILURE(rc)) 860 return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, 861 N_("Failed to load TPM NVRAM data with %Rrc"), rc); 862 } 765 863 766 864 TPMLIB_TPMVersion enmVersion = TPMLIB_TPM_VERSION_2;
Note:
See TracChangeset
for help on using the changeset viewer.