in TAs/optee_ta/fTPM/fTPM.c [112:193]
TEE_Result TA_CreateEntryPoint(void)
{
#define STARTUP_SIZE 0x0C
uint8_t startupClear[STARTUP_SIZE] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x01, 0x44, 0x00, 0x00 };
uint8_t startupState[STARTUP_SIZE] = { 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c,
0x00, 0x00, 0x01, 0x44, 0x00, 0x01 };
uint32_t respLen;
uint8_t *respBuf;
// If we've been here before, don't init again.
if (fTPMInitialized) {
// We may have had TA_DestroyEntryPoint called but we didn't
// actually get torn down. Re-NVEnable, just in case.
if (_plat__NVEnable(NULL) == 0) {
TEE_Panic(TEE_ERROR_BAD_STATE);
}
return TEE_SUCCESS;
}
// Initialize NV admin state
_admin__NvInitState();
// If we fail to open fTPM storage we cannot continue.
if (_plat__NVEnable(NULL) == 0) {
TEE_Panic(TEE_ERROR_BAD_STATE);
}
// This only occurs when there is no previous NV state, i.e., on first
// boot, after recovering from data loss, we reset the platform, etc.
if (_plat__NvNeedsManufacture()) {
DMSG("TPM_Manufacture\n");
TPM_Manufacture(1);
}
// "Power-On" the platform
_plat__Signal_PowerOn();
// Internal init for reference implementation
_TPM_Init();
// Startup with state
if (g_chipFlags.fields.TpmStatePresent) {
// Re-use request buffer for response (ignored)
respBuf = startupState;
respLen = STARTUP_SIZE;
ExecuteCommand(STARTUP_SIZE, startupState, &respLen, &respBuf);
if (fTPMResponseCode(respLen, respBuf) == TPM_RC_SUCCESS) {
goto Exit;
}
#ifdef fTPMDebug
DMSG("Fall through to startup clear\n");
#endif
//DMSG("Start self test");
//CryptSelfTest(1);
goto Clear;
}
Clear:
// Re-use request buffer for response (ignored)
respBuf = startupClear;
respLen = STARTUP_SIZE;
// Fall back to a Startup Clear
ExecuteCommand(STARTUP_SIZE, startupClear, &respLen, &respBuf);
Exit:
// Init is complete, indicate so in fTPM admin state.
g_chipFlags.fields.TpmStatePresent = 1;
_admin__SaveChipFlags();
// Initialization complete
fTPMInitialized = true;
return TEE_SUCCESS;
}