UINT8 *LastEvent;\r
BOOLEAN EventLogStarted;\r
BOOLEAN EventLogTruncated;\r
+ UINTN Next800155EventOffset;\r
} TCG_EVENT_LOG_AREA_STRUCT;\r
\r
typedef struct _TCG_DXE_DATA {\r
return EFI_SUCCESS;\r
}\r
\r
+/*\r
+ Return if this is a Tcg800155PlatformIdEvent.\r
+\r
+ @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
+ @param[in] NewEventHdrSize New event header size.\r
+ @param[in] NewEventData Pointer to the new event data.\r
+ @param[in] NewEventSize New event data size.\r
+\r
+ @retval TRUE This is a Tcg800155PlatformIdEvent.\r
+ @retval FALSE This is NOT a Tcg800155PlatformIdEvent.\r
+\r
+*/\r
+BOOLEAN\r
+Is800155Event (\r
+ IN VOID *NewEventHdr,\r
+ IN UINT32 NewEventHdrSize,\r
+ IN UINT8 *NewEventData,\r
+ IN UINT32 NewEventSize\r
+ )\r
+{\r
+ if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) &&\r
+ (NewEventSize >= sizeof(TCG_Sp800_155_PlatformId_Event2)) &&\r
+ (CompareMem (NewEventData, TCG_Sp800_155_PlatformId_Event2_SIGNATURE,\r
+ sizeof(TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1) == 0)) {\r
+ return TRUE;\r
+ }\r
+ return FALSE;\r
+}\r
+\r
/**\r
Add a new entry to the Event Log.\r
\r
- @param[in, out] EventLogPtr Pointer to the Event Log data.\r
- @param[in, out] LogSize Size of the Event Log.\r
- @param[in] MaxSize Maximum size of the Event Log.\r
- @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
- @param[in] NewEventHdrSize New event header size.\r
- @param[in] NewEventData Pointer to the new event data.\r
- @param[in] NewEventSize New event data size.\r
+ @param[in, out] EventLogAreaStruct The event log area data structure\r
+ @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR/TCG_PCR_EVENT_EX data structure.\r
+ @param[in] NewEventHdrSize New event header size.\r
+ @param[in] NewEventData Pointer to the new event data.\r
+ @param[in] NewEventSize New event data size.\r
\r
@retval EFI_SUCCESS The new event log entry was added.\r
@retval EFI_OUT_OF_RESOURCES No enough memory to log the new event.\r
**/\r
EFI_STATUS\r
TcgCommLogEvent (\r
- IN OUT UINT8 **EventLogPtr,\r
- IN OUT UINTN *LogSize,\r
- IN UINTN MaxSize,\r
+ IN OUT TCG_EVENT_LOG_AREA_STRUCT *EventLogAreaStruct,\r
IN VOID *NewEventHdr,\r
IN UINT32 NewEventHdrSize,\r
IN UINT8 *NewEventData,\r
)\r
{\r
UINTN NewLogSize;\r
+ BOOLEAN Record800155Event;\r
\r
if (NewEventSize > MAX_ADDRESS - NewEventHdrSize) {\r
return EFI_OUT_OF_RESOURCES;\r
\r
NewLogSize = NewEventHdrSize + NewEventSize;\r
\r
- if (NewLogSize > MAX_ADDRESS - *LogSize) {\r
+ if (NewLogSize > MAX_ADDRESS - EventLogAreaStruct->EventLogSize) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- if (NewLogSize + *LogSize > MaxSize) {\r
- DEBUG ((EFI_D_INFO, " MaxSize - 0x%x\n", MaxSize));\r
- DEBUG ((EFI_D_INFO, " NewLogSize - 0x%x\n", NewLogSize));\r
- DEBUG ((EFI_D_INFO, " LogSize - 0x%x\n", *LogSize));\r
- DEBUG ((EFI_D_INFO, "TcgCommLogEvent - %r\n", EFI_OUT_OF_RESOURCES));\r
+ if (NewLogSize + EventLogAreaStruct->EventLogSize > EventLogAreaStruct->Laml) {\r
+ DEBUG ((DEBUG_INFO, " Laml - 0x%x\n", EventLogAreaStruct->Laml));\r
+ DEBUG ((DEBUG_INFO, " NewLogSize - 0x%x\n", NewLogSize));\r
+ DEBUG ((DEBUG_INFO, " LogSize - 0x%x\n", EventLogAreaStruct->EventLogSize));\r
+ DEBUG ((DEBUG_INFO, "TcgCommLogEvent - %r\n", EFI_OUT_OF_RESOURCES));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- *EventLogPtr += *LogSize;\r
- *LogSize += NewLogSize;\r
- CopyMem (*EventLogPtr, NewEventHdr, NewEventHdrSize);\r
+ //\r
+ // Check 800-155 event\r
+ // Record to 800-155 event offset only.\r
+ // If the offset is 0, no need to record.\r
+ //\r
+ Record800155Event = Is800155Event (NewEventHdr, NewEventHdrSize, NewEventData, NewEventSize);\r
+ if (Record800155Event) {\r
+ if (EventLogAreaStruct->Next800155EventOffset != 0) {\r
+ CopyMem (\r
+ (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset + NewLogSize,\r
+ (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset,\r
+ EventLogAreaStruct->EventLogSize - EventLogAreaStruct->Next800155EventOffset\r
+ );\r
+\r
+ CopyMem (\r
+ (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset,\r
+ NewEventHdr,\r
+ NewEventHdrSize\r
+ );\r
+ CopyMem (\r
+ (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->Next800155EventOffset + NewEventHdrSize,\r
+ NewEventData,\r
+ NewEventSize\r
+ );\r
+\r
+ EventLogAreaStruct->Next800155EventOffset += NewLogSize;\r
+ EventLogAreaStruct->LastEvent += NewLogSize;\r
+ EventLogAreaStruct->EventLogSize += NewLogSize;\r
+ }\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ EventLogAreaStruct->LastEvent = (UINT8 *)(UINTN)EventLogAreaStruct->Lasa + EventLogAreaStruct->EventLogSize;\r
+ EventLogAreaStruct->EventLogSize += NewLogSize;\r
+ CopyMem (EventLogAreaStruct->LastEvent, NewEventHdr, NewEventHdrSize);\r
CopyMem (\r
- *EventLogPtr + NewEventHdrSize,\r
+ EventLogAreaStruct->LastEvent + NewEventHdrSize,\r
NewEventData,\r
NewEventSize\r
);\r
return EFI_VOLUME_FULL;\r
}\r
\r
- EventLogAreaStruct->LastEvent = (UINT8*)(UINTN)EventLogAreaStruct->Lasa;\r
Status = TcgCommLogEvent (\r
- &EventLogAreaStruct->LastEvent,\r
- &EventLogAreaStruct->EventLogSize,\r
- (UINTN)EventLogAreaStruct->Laml,\r
+ EventLogAreaStruct,\r
NewEventHdr,\r
NewEventHdrSize,\r
NewEventData,\r
return EFI_VOLUME_FULL;\r
}\r
\r
- EventLogAreaStruct->LastEvent = (UINT8*)(UINTN)EventLogAreaStruct->Lasa;\r
Status = TcgCommLogEvent (\r
- &EventLogAreaStruct->LastEvent,\r
- &EventLogAreaStruct->EventLogSize,\r
- (UINTN)EventLogAreaStruct->Laml,\r
+ EventLogAreaStruct,\r
NewEventHdr,\r
NewEventHdrSize,\r
NewEventData,\r
{\r
EFI_STATUS Status;\r
TPML_DIGEST_VALUES DigestList;\r
+ TCG_PCR_EVENT2_HDR NoActionEvent;\r
\r
if (!mTcgDxeData.BsCap.TPMPresentFlag) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r
+ if (NewEventHdr->EventType == EV_NO_ACTION) {\r
+ //\r
+ // Do not do TPM extend for EV_NO_ACTION\r
+ //\r
+ Status = EFI_SUCCESS;\r
+ InitNoActionEvent (&NoActionEvent, NewEventHdr->EventSize);\r
+ if ((Flags & EFI_TCG2_EXTEND_ONLY) == 0) {\r
+ Status = TcgDxeLogHashEvent (&(NoActionEvent.Digests), NewEventHdr, NewEventData);\r
+ }\r
+\r
+ return Status;\r
+ }\r
+\r
Status = HashAndExtend (\r
NewEventHdr->PCRIndex,\r
HashData,\r
\r
DEBUG ((DEBUG_VERBOSE, "Tcg2HashLogExtendEvent ...\n"));\r
\r
- if ((This == NULL) || (DataToHash == 0) || (Event == NULL)) {\r
+ if ((This == NULL) || (Event == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ //\r
+ // Do not check hash data size for EV_NO_ACTION event.\r
+ //\r
+ if ((Event->Header.EventType != EV_NO_ACTION) && (DataToHash == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
mTcgDxeData.EventLogAreaStruct[Index].Lasa = Lasa;\r
mTcgDxeData.EventLogAreaStruct[Index].Laml = PcdGet32 (PcdTcgLogAreaMinLen);\r
+ mTcgDxeData.EventLogAreaStruct[Index].Next800155EventOffset = 0;\r
\r
if ((PcdGet8(PcdTpm2AcpiTableRev) >= 4) ||\r
(mTcg2EventInfo[Index].LogFormat == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)) {\r
(UINT8 *)TcgEfiSpecIdEventStruct,\r
SpecIdEvent.EventSize\r
);\r
+ //\r
+ // record the offset at the end of 800-155 event.\r
+ // the future 800-155 event can be inserted here.\r
+ //\r
+ mTcgDxeData.EventLogAreaStruct[Index].Next800155EventOffset = \\r
+ mTcgDxeData.EventLogAreaStruct[Index].EventLogSize;\r
+\r
+ //\r
+ // Tcg800155PlatformIdEvent. Event format is TCG_PCR_EVENT2\r
+ //\r
+ GuidHob.Guid = GetFirstGuidHob (&gTcg800155PlatformIdEventHobGuid);\r
+ while (GuidHob.Guid != NULL) {\r
+ InitNoActionEvent(&NoActionEvent, GET_GUID_HOB_DATA_SIZE (GuidHob.Guid));\r
+\r
+ Status = TcgDxeLogEvent (\r
+ mTcg2EventInfo[Index].LogFormat,\r
+ &NoActionEvent,\r
+ sizeof(NoActionEvent.PCRIndex) + sizeof(NoActionEvent.EventType) + GetDigestListBinSize (&NoActionEvent.Digests) + sizeof(NoActionEvent.EventSize),\r
+ GET_GUID_HOB_DATA (GuidHob.Guid),\r
+ GET_GUID_HOB_DATA_SIZE (GuidHob.Guid)\r
+ );\r
+\r
+ GuidHob.Guid = GET_NEXT_HOB (GuidHob);\r
+ GuidHob.Guid = GetNextGuidHob (&gTcg800155PlatformIdEventHobGuid, GuidHob.Guid);\r
+ }\r
\r
//\r
// EfiStartupLocalityEvent. Event format is TCG_PCR_EVENT2\r
mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = (VOID *)(UINTN)mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa;\r
mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
+ mTcgDxeData.FinalEventLogAreaStruct[Index].Next800155EventOffset = 0;\r
\r
//\r
// Install to configuration table for EFI_TCG2_EVENT_LOG_FORMAT_TCG_2\r
mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = 0;\r
mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
+ mTcgDxeData.FinalEventLogAreaStruct[Index].Next800155EventOffset = 0;\r
}\r
}\r
}\r