]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c
SecurityPkg: Tcg2Dxe: Fix undersized TempBuf
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Dxe / Tcg2Dxe.c
index cb2a65b47caf0772f0b423f3ca3b65787b4caad8..07f76af90f6e4cb90a33045736a076ef0d8b6939 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This module implements Tcg2 Protocol.\r
   \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials \r
 are licensed and made available under the terms and conditions of the BSD License \r
 which accompanies this distribution.  The full text of the license may be found at \r
@@ -15,11 +15,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <PiDxe.h>\r
 #include <IndustryStandard/Acpi.h>\r
 #include <IndustryStandard/PeImage.h>\r
-#include <IndustryStandard/SmBios.h>\r
 #include <IndustryStandard/TcpaAcpi.h>\r
 \r
 #include <Guid/GlobalVariable.h>\r
-#include <Guid/SmBios.h>\r
 #include <Guid/HobList.h>\r
 #include <Guid/TcgEventHob.h>\r
 #include <Guid/EventGroup.h>\r
@@ -58,9 +56,6 @@ typedef struct {
   EFI_GUID                               *VendorGuid;\r
 } VARIABLE_TYPE;\r
 \r
-#define  EFI_TCG_LOG_AREA_SIZE        0x10000\r
-#define  EFI_TCG_FINAL_LOG_AREA_SIZE  0x1000\r
-\r
 #define  TCG2_DEFAULT_MAX_COMMAND_SIZE        0x1000\r
 #define  TCG2_DEFAULT_MAX_RESPONSE_SIZE       0x1000\r
 \r
@@ -406,11 +401,11 @@ DumpTcgEfiSpecIdEventStruct (
   IN TCG_EfiSpecIDEventStruct   *TcgEfiSpecIdEventStruct\r
   )\r
 {\r
-  TCG_EfiSpecIdEventAlgorithmSize  *digestSize;\r
+  TCG_EfiSpecIdEventAlgorithmSize  *DigestSize;\r
   UINTN                            Index;\r
-  UINT8                            *vendorInfoSize;\r
-  UINT8                            *vendorInfo;\r
-  UINT32                           numberOfAlgorithms;\r
+  UINT8                            *VendorInfoSize;\r
+  UINT8                            *VendorInfo;\r
+  UINT32                           NumberOfAlgorithms;\r
 \r
   DEBUG ((EFI_D_INFO, "  TCG_EfiSpecIDEventStruct:\n"));\r
   DEBUG ((EFI_D_INFO, "    signature          - '"));\r
@@ -422,21 +417,21 @@ DumpTcgEfiSpecIdEventStruct (
   DEBUG ((EFI_D_INFO, "    specVersion        - %d.%d%d\n", TcgEfiSpecIdEventStruct->specVersionMajor, TcgEfiSpecIdEventStruct->specVersionMinor, TcgEfiSpecIdEventStruct->specErrata));\r
   DEBUG ((EFI_D_INFO, "    uintnSize          - 0x%02x\n", TcgEfiSpecIdEventStruct->uintnSize));\r
 \r
-  CopyMem (&numberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(numberOfAlgorithms));\r
-  DEBUG ((EFI_D_INFO, "    numberOfAlgorithms - 0x%08x\n", numberOfAlgorithms));\r
+  CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(NumberOfAlgorithms));\r
+  DEBUG ((EFI_D_INFO, "    NumberOfAlgorithms - 0x%08x\n", NumberOfAlgorithms));\r
 \r
-  digestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(numberOfAlgorithms));\r
-  for (Index = 0; Index < numberOfAlgorithms; Index++) {\r
+  DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(NumberOfAlgorithms));\r
+  for (Index = 0; Index < NumberOfAlgorithms; Index++) {\r
     DEBUG ((EFI_D_INFO, "    digest(%d)\n", Index));\r
-    DEBUG ((EFI_D_INFO, "      algorithmId      - 0x%04x\n", digestSize[Index].algorithmId));\r
-    DEBUG ((EFI_D_INFO, "      digestSize       - 0x%04x\n", digestSize[Index].digestSize));\r
+    DEBUG ((EFI_D_INFO, "      algorithmId      - 0x%04x\n", DigestSize[Index].algorithmId));\r
+    DEBUG ((EFI_D_INFO, "      digestSize       - 0x%04x\n", DigestSize[Index].digestSize));\r
   }\r
-  vendorInfoSize = (UINT8 *)&digestSize[numberOfAlgorithms];\r
-  DEBUG ((EFI_D_INFO, "    vendorInfoSize     - 0x%02x\n", *vendorInfoSize));\r
-  vendorInfo = vendorInfoSize + 1;\r
-  DEBUG ((EFI_D_INFO, "    vendorInfo         - "));\r
-  for (Index = 0; Index < *vendorInfoSize; Index++) {\r
-    DEBUG ((EFI_D_INFO, "%02x ", vendorInfo[Index]));\r
+  VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms];\r
+  DEBUG ((EFI_D_INFO, "    VendorInfoSize     - 0x%02x\n", *VendorInfoSize));\r
+  VendorInfo = VendorInfoSize + 1;\r
+  DEBUG ((EFI_D_INFO, "    VendorInfo         - "));\r
+  for (Index = 0; Index < *VendorInfoSize; Index++) {\r
+    DEBUG ((EFI_D_INFO, "%02x ", VendorInfo[Index]));\r
   }\r
   DEBUG ((EFI_D_INFO, "\n"));\r
 }\r
@@ -451,15 +446,15 @@ GetTcgEfiSpecIdEventStructSize (
   IN TCG_EfiSpecIDEventStruct   *TcgEfiSpecIdEventStruct\r
   )\r
 {\r
-  TCG_EfiSpecIdEventAlgorithmSize  *digestSize;\r
-  UINT8                            *vendorInfoSize;\r
-  UINT32                           numberOfAlgorithms;\r
+  TCG_EfiSpecIdEventAlgorithmSize  *DigestSize;\r
+  UINT8                            *VendorInfoSize;\r
+  UINT32                           NumberOfAlgorithms;\r
 \r
-  CopyMem (&numberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(numberOfAlgorithms));\r
+  CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof(NumberOfAlgorithms));\r
 \r
-  digestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(numberOfAlgorithms));\r
-  vendorInfoSize = (UINT8 *)&digestSize[numberOfAlgorithms];\r
-  return sizeof(TCG_EfiSpecIDEventStruct) + sizeof(UINT32) + (numberOfAlgorithms * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8) + (*vendorInfoSize);\r
+  DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(NumberOfAlgorithms));\r
+  VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms];\r
+  return sizeof(TCG_EfiSpecIDEventStruct) + sizeof(UINT32) + (NumberOfAlgorithms * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8) + (*VendorInfoSize);\r
 }\r
 \r
 /**\r
@@ -822,11 +817,10 @@ TcgDxeLogEvent (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!mTcgDxeData.GetEventLogCalled[Index]) {\r
-    EventLogAreaStruct = &mTcgDxeData.EventLogAreaStruct[Index];\r
-  } else {\r
-    EventLogAreaStruct = &mTcgDxeData.FinalEventLogAreaStruct[Index];\r
-  }\r
+  //\r
+  // Record to normal event log\r
+  //\r
+  EventLogAreaStruct = &mTcgDxeData.EventLogAreaStruct[Index];\r
 \r
   if (EventLogAreaStruct->EventLogTruncated) {\r
     return EFI_VOLUME_FULL;\r
@@ -843,15 +837,50 @@ TcgDxeLogEvent (
              NewEventSize\r
              );\r
   \r
-  if (Status == EFI_DEVICE_ERROR) {\r
-    return EFI_DEVICE_ERROR;\r
-  } else if (Status == EFI_OUT_OF_RESOURCES) {\r
+  if (Status == EFI_OUT_OF_RESOURCES) {\r
     EventLogAreaStruct->EventLogTruncated = TRUE;\r
     return EFI_VOLUME_FULL;\r
   } else if (Status == EFI_SUCCESS) {\r
     EventLogAreaStruct->EventLogStarted = TRUE;\r
-    if (mTcgDxeData.GetEventLogCalled[Index]) {\r
+  }\r
+\r
+  //\r
+  // If GetEventLog is called, record to FinalEventsTable, too.\r
+  //\r
+  if (mTcgDxeData.GetEventLogCalled[Index]) {\r
+    if (mTcgDxeData.FinalEventsTable[Index] == NULL) {\r
+      //\r
+      // no need for FinalEventsTable\r
+      //\r
+      return EFI_SUCCESS;\r
+    }\r
+    EventLogAreaStruct = &mTcgDxeData.FinalEventLogAreaStruct[Index];\r
+\r
+    if (EventLogAreaStruct->EventLogTruncated) {\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
+               NewEventHdr,\r
+               NewEventHdrSize,\r
+               NewEventData,\r
+               NewEventSize\r
+               );\r
+    if (Status == EFI_OUT_OF_RESOURCES) {\r
+      EventLogAreaStruct->EventLogTruncated = TRUE;\r
+      return EFI_VOLUME_FULL;\r
+    } else if (Status == EFI_SUCCESS) {\r
+      EventLogAreaStruct->EventLogStarted = TRUE;\r
+      //\r
+      // Increase the NumberOfEvents in FinalEventsTable\r
+      //\r
       (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents ++;\r
+      DEBUG ((EFI_D_INFO, "FinalEventsTable->NumberOfEvents - 0x%x\n", (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents));\r
+      DEBUG ((EFI_D_INFO, "  Size - 0x%x\n", (UINTN)EventLogAreaStruct->LastEvent - (UINTN)mTcgDxeData.FinalEventsTable[Index]));\r
     }\r
   }\r
 \r
@@ -1453,11 +1482,12 @@ SetupEventLog (
   UINT32                          DigestListBinSize;\r
   UINT32                          EventSize;\r
   TCG_EfiSpecIDEventStruct        *TcgEfiSpecIdEventStruct;\r
-  UINT8                           TempBuf[sizeof(TCG_EfiSpecIDEventStruct) + (HASH_COUNT * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8)];\r
+  UINT8                           TempBuf[sizeof(TCG_EfiSpecIDEventStruct) + sizeof(UINT32) + (HASH_COUNT * sizeof(TCG_EfiSpecIdEventAlgorithmSize)) + sizeof(UINT8)];\r
   TCG_PCR_EVENT_HDR               FirstPcrEvent;\r
-  TCG_EfiSpecIdEventAlgorithmSize *digestSize;\r
-  UINT8                           *vendorInfoSize;\r
-  UINT32                          numberOfAlgorithms;\r
+  TCG_EfiSpecIdEventAlgorithmSize *DigestSize;\r
+  TCG_EfiSpecIdEventAlgorithmSize *TempDigestSize;\r
+  UINT8                           *VendorInfoSize;\r
+  UINT32                          NumberOfAlgorithms;\r
 \r
   DEBUG ((EFI_D_INFO, "SetupEventLog\n"));\r
 \r
@@ -1470,20 +1500,20 @@ SetupEventLog (
       Lasa = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);\r
       Status = gBS->AllocatePages (\r
                       AllocateMaxAddress,\r
-                      EfiACPIMemoryNVS,\r
-                      EFI_SIZE_TO_PAGES (EFI_TCG_LOG_AREA_SIZE),\r
+                      EfiBootServicesData,\r
+                      EFI_SIZE_TO_PAGES (PcdGet32 (PcdTcgLogAreaMinLen)),\r
                       &Lasa\r
                       );\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
       }\r
       mTcgDxeData.EventLogAreaStruct[Index].Lasa = Lasa;\r
-      mTcgDxeData.EventLogAreaStruct[Index].Laml = EFI_TCG_LOG_AREA_SIZE;\r
+      mTcgDxeData.EventLogAreaStruct[Index].Laml = PcdGet32 (PcdTcgLogAreaMinLen);\r
       //\r
       // To initialize them as 0xFF is recommended \r
       // because the OS can know the last entry for that.\r
       //\r
-      SetMem ((VOID *)(UINTN)Lasa, EFI_TCG_LOG_AREA_SIZE, 0xFF);\r
+      SetMem ((VOID *)(UINTN)Lasa, PcdGet32 (PcdTcgLogAreaMinLen), 0xFF);\r
       //\r
       // Create first entry for Log Header Entry Data\r
       //\r
@@ -1498,36 +1528,48 @@ SetupEventLog (
         TcgEfiSpecIdEventStruct->specVersionMinor = TCG_EfiSpecIDEventStruct_SPEC_VERSION_MINOR_TPM2;\r
         TcgEfiSpecIdEventStruct->specErrata = TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2;\r
         TcgEfiSpecIdEventStruct->uintnSize = sizeof(UINTN)/sizeof(UINT32);\r
-        numberOfAlgorithms = 0;\r
-        digestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(numberOfAlgorithms));\r
+        NumberOfAlgorithms = 0;\r
+        DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof(*TcgEfiSpecIdEventStruct) + sizeof(NumberOfAlgorithms));\r
         if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
-          digestSize[numberOfAlgorithms].algorithmId = TPM_ALG_SHA1;\r
-          digestSize[numberOfAlgorithms].digestSize = SHA1_DIGEST_SIZE;\r
-          numberOfAlgorithms++;\r
+          TempDigestSize = DigestSize;\r
+          TempDigestSize += NumberOfAlgorithms;\r
+          TempDigestSize->algorithmId = TPM_ALG_SHA1;\r
+          TempDigestSize->digestSize = SHA1_DIGEST_SIZE;\r
+          NumberOfAlgorithms++;\r
         }\r
         if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
-          digestSize[numberOfAlgorithms].algorithmId = TPM_ALG_SHA256;\r
-          digestSize[numberOfAlgorithms].digestSize = SHA256_DIGEST_SIZE;\r
-          numberOfAlgorithms++;\r
+          TempDigestSize = DigestSize;\r
+          TempDigestSize += NumberOfAlgorithms;\r
+          TempDigestSize->algorithmId = TPM_ALG_SHA256;\r
+          TempDigestSize->digestSize = SHA256_DIGEST_SIZE;\r
+          NumberOfAlgorithms++;\r
         }\r
         if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
-          digestSize[numberOfAlgorithms].algorithmId = TPM_ALG_SHA384;\r
-          digestSize[numberOfAlgorithms].digestSize = SHA384_DIGEST_SIZE;\r
-          numberOfAlgorithms++;\r
+          TempDigestSize = DigestSize;\r
+          TempDigestSize += NumberOfAlgorithms;\r
+          TempDigestSize->algorithmId = TPM_ALG_SHA384;\r
+          TempDigestSize->digestSize = SHA384_DIGEST_SIZE;\r
+          NumberOfAlgorithms++;\r
         }\r
         if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
-          digestSize[numberOfAlgorithms].algorithmId = TPM_ALG_SHA512;\r
-          digestSize[numberOfAlgorithms].digestSize = SHA512_DIGEST_SIZE;\r
-          numberOfAlgorithms++;\r
+          TempDigestSize = DigestSize;\r
+          TempDigestSize += NumberOfAlgorithms;\r
+          TempDigestSize->algorithmId = TPM_ALG_SHA512;\r
+          TempDigestSize->digestSize = SHA512_DIGEST_SIZE;\r
+          NumberOfAlgorithms++;\r
         }\r
         if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
-          digestSize[numberOfAlgorithms].algorithmId = TPM_ALG_SM3_256;\r
-          digestSize[numberOfAlgorithms].digestSize = SM3_256_DIGEST_SIZE;\r
-          numberOfAlgorithms++;\r
+          TempDigestSize = DigestSize;\r
+          TempDigestSize += NumberOfAlgorithms;\r
+          TempDigestSize->algorithmId = TPM_ALG_SM3_256;\r
+          TempDigestSize->digestSize = SM3_256_DIGEST_SIZE;\r
+          NumberOfAlgorithms++;\r
         }\r
-        CopyMem (TcgEfiSpecIdEventStruct + 1, &numberOfAlgorithms, sizeof(numberOfAlgorithms));\r
-        vendorInfoSize = (UINT8 *)&digestSize[numberOfAlgorithms];\r
-        *vendorInfoSize = 0;\r
+        CopyMem (TcgEfiSpecIdEventStruct + 1, &NumberOfAlgorithms, sizeof(NumberOfAlgorithms));\r
+        TempDigestSize = DigestSize;\r
+        TempDigestSize += NumberOfAlgorithms;\r
+        VendorInfoSize = (UINT8 *)TempDigestSize;\r
+        *VendorInfoSize = 0;\r
 \r
         //\r
         // FirstPcrEvent\r
@@ -1556,41 +1598,53 @@ SetupEventLog (
   //\r
   for (Index = 0; Index < sizeof(mTcg2EventInfo)/sizeof(mTcg2EventInfo[0]); Index++) {\r
     if ((mTcgDxeData.BsCap.SupportedEventLogs & mTcg2EventInfo[Index].LogFormat) != 0) {\r
-      Lasa = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);\r
-      Status = gBS->AllocatePages (\r
-                      AllocateMaxAddress,\r
-                      EfiACPIMemoryNVS,\r
-                      EFI_SIZE_TO_PAGES (EFI_TCG_FINAL_LOG_AREA_SIZE),\r
-                      &Lasa\r
-                      );\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-      SetMem ((VOID *)(UINTN)Lasa, EFI_TCG_FINAL_LOG_AREA_SIZE, 0xFF);\r
+      if (mTcg2EventInfo[Index].LogFormat == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {\r
+        Lasa = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);\r
+        Status = gBS->AllocatePages (\r
+                        AllocateMaxAddress,\r
+                        EfiACPIMemoryNVS,\r
+                        EFI_SIZE_TO_PAGES (PcdGet32 (PcdTcg2FinalLogAreaLen)),\r
+                        &Lasa\r
+                        );\r
+        if (EFI_ERROR (Status)) {\r
+          return Status;\r
+        }\r
+        SetMem ((VOID *)(UINTN)Lasa, PcdGet32 (PcdTcg2FinalLogAreaLen), 0xFF);\r
 \r
-      //\r
-      // Initialize\r
-      //\r
-      mTcgDxeData.FinalEventsTable[Index] = (VOID *)(UINTN)Lasa;\r
-      (mTcgDxeData.FinalEventsTable[Index])->Version = EFI_TCG2_FINAL_EVENTS_TABLE_VERSION;\r
-      (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents = 0;\r
-\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogFormat = mTcg2EventInfo[Index].LogFormat;\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa = Lasa + sizeof(EFI_TCG2_FINAL_EVENTS_TABLE);\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].Laml = EFI_TCG_FINAL_LOG_AREA_SIZE - sizeof(EFI_TCG2_FINAL_EVENTS_TABLE);\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogSize = 0;\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = (VOID *)(UINTN)mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa;\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
-      mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
+        //\r
+        // Initialize\r
+        //\r
+        mTcgDxeData.FinalEventsTable[Index] = (VOID *)(UINTN)Lasa;\r
+        (mTcgDxeData.FinalEventsTable[Index])->Version = EFI_TCG2_FINAL_EVENTS_TABLE_VERSION;\r
+        (mTcgDxeData.FinalEventsTable[Index])->NumberOfEvents = 0;\r
+\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogFormat = mTcg2EventInfo[Index].LogFormat;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa = Lasa + sizeof(EFI_TCG2_FINAL_EVENTS_TABLE);\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Laml = PcdGet32 (PcdTcg2FinalLogAreaLen) - sizeof(EFI_TCG2_FINAL_EVENTS_TABLE);\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogSize = 0;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = (VOID *)(UINTN)mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
 \r
-      if (mTcg2EventInfo[Index].LogFormat == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {\r
         //\r
-        // Install to configuration table\r
+        // Install to configuration table for EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 \r
         //\r
-        Status = gBS->InstallConfigurationTable (&gEfiTcg2FinalEventsTableGuid, (VOID *)mTcgDxeData.FinalEventsTable[1]);\r
+        Status = gBS->InstallConfigurationTable (&gEfiTcg2FinalEventsTableGuid, (VOID *)mTcgDxeData.FinalEventsTable[Index]);\r
         if (EFI_ERROR (Status)) {\r
           return Status;\r
         }\r
+      } else {\r
+        //\r
+        // No need to handle EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2\r
+        //\r
+        mTcgDxeData.FinalEventsTable[Index] = NULL;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogFormat = mTcg2EventInfo[Index].LogFormat;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Lasa = 0;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].Laml = 0;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogSize = 0;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].LastEvent = 0;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogStarted = FALSE;\r
+        mTcgDxeData.FinalEventLogAreaStruct[Index].EventLogTruncated = FALSE;\r
       }\r
     }\r
   }\r
@@ -1677,42 +1731,13 @@ MeasureHandoffTables (
   )\r
 {\r
   EFI_STATUS                        Status;\r
-  SMBIOS_TABLE_ENTRY_POINT          *SmbiosTable;\r
   TCG_PCR_EVENT_HDR                 TcgEvent;\r
   EFI_HANDOFF_TABLE_POINTERS        HandoffTables;\r
   UINTN                             ProcessorNum;\r
   EFI_CPU_PHYSICAL_LOCATION         *ProcessorLocBuf;\r
 \r
   ProcessorLocBuf = NULL;\r
-\r
-  //\r
-  // Measure SMBIOS with EV_EFI_HANDOFF_TABLES to PCR[1]\r
-  //\r
-  Status = EfiGetSystemConfigurationTable (\r
-             &gEfiSmbiosTableGuid,\r
-             (VOID **) &SmbiosTable\r
-             );\r
-\r
-  if (!EFI_ERROR (Status) && SmbiosTable != NULL) {\r
-    TcgEvent.PCRIndex  = 1;\r
-    TcgEvent.EventType = EV_EFI_HANDOFF_TABLES;\r
-    TcgEvent.EventSize = sizeof (HandoffTables);\r
-\r
-    HandoffTables.NumberOfTables = 1;\r
-    HandoffTables.TableEntry[0].VendorGuid  = gEfiSmbiosTableGuid;\r
-    HandoffTables.TableEntry[0].VendorTable = SmbiosTable;\r
-\r
-    DEBUG ((DEBUG_INFO, "The Smbios Table starts at: 0x%x\n", SmbiosTable->TableAddress));\r
-    DEBUG ((DEBUG_INFO, "The Smbios Table size: 0x%x\n", SmbiosTable->TableLength));\r
-\r
-    Status = TcgDxeHashLogExtendEvent (\r
-               0,\r
-               (UINT8*)(UINTN)SmbiosTable->TableAddress,\r
-               SmbiosTable->TableLength,\r
-               &TcgEvent,\r
-               (UINT8*)&HandoffTables\r
-               );\r
-  }\r
+  Status = EFI_SUCCESS;\r
 \r
   if (PcdGet8 (PcdTpmPlatformClass) == TCG_PLATFORM_TYPE_SERVER) {\r
     //\r
@@ -2200,7 +2225,7 @@ OnReadyToBoot (
                EFI_CALLING_EFI_APPLICATION\r
                );\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "%s not Measured. Error!\n", EFI_CALLING_EFI_APPLICATION));\r
+      DEBUG ((EFI_D_ERROR, "%a not Measured. Error!\n", EFI_CALLING_EFI_APPLICATION));\r
     }\r
 \r
     //\r
@@ -2233,7 +2258,7 @@ OnReadyToBoot (
                EFI_RETURNING_FROM_EFI_APPLICATOIN\r
                );\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "%s not Measured. Error!\n", EFI_RETURNING_FROM_EFI_APPLICATOIN));\r
+      DEBUG ((EFI_D_ERROR, "%a not Measured. Error!\n", EFI_RETURNING_FROM_EFI_APPLICATOIN));\r
     }\r
   }\r
 \r
@@ -2270,7 +2295,7 @@ OnExitBootServices (
              EFI_EXIT_BOOT_SERVICES_INVOCATION\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%s not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_INVOCATION));\r
+    DEBUG ((EFI_D_ERROR, "%a not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_INVOCATION));\r
   }\r
 \r
   //\r
@@ -2280,7 +2305,7 @@ OnExitBootServices (
              EFI_EXIT_BOOT_SERVICES_SUCCEEDED\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%s not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_SUCCEEDED));\r
+    DEBUG ((EFI_D_ERROR, "%a not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_SUCCEEDED));\r
   }\r
 }\r
 \r
@@ -2309,7 +2334,7 @@ OnExitBootServicesFailed (
              EFI_EXIT_BOOT_SERVICES_FAILED\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%s not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_FAILED));\r
+    DEBUG ((EFI_D_ERROR, "%a not Measured. Error!\n", EFI_EXIT_BOOT_SERVICES_FAILED));\r
   }\r
 \r
 }\r
@@ -2433,11 +2458,9 @@ DriverEntry (
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));\r
     TpmHashAlgorithmBitmap = EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-    NumberOfPCRBanks = 1;\r
     ActivePCRBanks = EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
   } else {\r
     DEBUG ((EFI_D_INFO, "Tpm2GetCapabilityPcrs Count - %08x\n", Pcrs.count));\r
-    NumberOfPCRBanks = 0;\r
     TpmHashAlgorithmBitmap = 0;\r
     ActivePCRBanks = 0;\r
     for (Index = 0; Index < Pcrs.count; Index++) {\r
@@ -2445,35 +2468,30 @@ DriverEntry (
       switch (Pcrs.pcrSelections[Index].hash) {\r
       case TPM_ALG_SHA1:\r
         TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
-        NumberOfPCRBanks ++;\r
         if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
           ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA1;\r
         }        \r
         break;\r
       case TPM_ALG_SHA256:\r
         TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA256;\r
-        NumberOfPCRBanks ++;\r
         if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
           ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA256;\r
         }\r
         break;\r
       case TPM_ALG_SHA384:\r
         TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA384;\r
-        NumberOfPCRBanks ++;\r
         if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
           ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA384;\r
         }\r
         break;\r
       case TPM_ALG_SHA512:\r
         TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SHA512;\r
-        NumberOfPCRBanks ++;\r
         if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
           ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SHA512;\r
         }\r
         break;\r
       case TPM_ALG_SM3_256:\r
         TpmHashAlgorithmBitmap |= EFI_TCG2_BOOT_HASH_ALG_SM3_256;\r
-        NumberOfPCRBanks ++;\r
         if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
           ActivePCRBanks |= EFI_TCG2_BOOT_HASH_ALG_SM3_256;\r
         }\r
@@ -2484,6 +2502,16 @@ DriverEntry (
   mTcgDxeData.BsCap.HashAlgorithmBitmap = TpmHashAlgorithmBitmap & PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
   mTcgDxeData.BsCap.ActivePcrBanks = ActivePCRBanks & PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
 \r
+  //\r
+  // Need calculate NumberOfPCRBanks here, because HashAlgorithmBitmap might be removed by PCD.\r
+  //\r
+  NumberOfPCRBanks = 0;\r
+  for (Index = 0; Index < 32; Index++) {\r
+    if ((mTcgDxeData.BsCap.HashAlgorithmBitmap & (1u << Index)) != 0) {\r
+      NumberOfPCRBanks++;\r
+    }\r
+  }\r
+\r
   if (PcdGet32 (PcdTcg2NumberOfPCRBanks) == 0) {\r
     mTcgDxeData.BsCap.NumberOfPCRBanks = NumberOfPCRBanks;\r
   } else {\r
@@ -2495,11 +2523,11 @@ DriverEntry (
   }\r
 \r
   mTcgDxeData.BsCap.SupportedEventLogs = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;\r
-  if ((mTcgDxeData.BsCap.ActivePcrBanks & TREE_BOOT_HASH_ALG_SHA1) == 0) {\r
+  if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1) == 0) {\r
     //\r
     // No need to expose TCG1.2 event log if SHA1 bank does not exist.\r
     //\r
-    mTcgDxeData.BsCap.SupportedEventLogs &= ~TREE_EVENT_LOG_FORMAT_TCG_1_2;\r
+    mTcgDxeData.BsCap.SupportedEventLogs &= ~EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "Tcg2.SupportedEventLogs - 0x%08x\n", mTcgDxeData.BsCap.SupportedEventLogs));\r