]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c
MdeModulePkg SmbiosMeasurementDxe: Skip measurement for OEM type
[mirror_edk2.git] / MdeModulePkg / Universal / SmbiosMeasurementDxe / SmbiosMeasurementDxe.c
index 85963818dcdf1314d3bfff3dc5ae86e0ecf88844..4a3e99aefd0f7d45472a133e4d457bbe66720cd2 100644 (file)
@@ -1,14 +1,14 @@
 /** @file\r
   This driver measures SMBIOS table to TPM.\r
-  \r
-Copyright (c) 2015, 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
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Copyright (c) 2015 - 2017, 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
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
 \r
@@ -84,6 +84,9 @@ SMBIOS_FILTER_TABLE  mSmbiosFilterType22BlackList[] = {
 SMBIOS_FILTER_TABLE  mSmbiosFilterType23BlackList[] = {\r
   {0x17, OFFSET_OF(SMBIOS_TABLE_TYPE23, ResetCount),          FIELD_SIZE_OF(SMBIOS_TABLE_TYPE23, ResetCount),          0},\r
 };\r
+SMBIOS_FILTER_TABLE  mSmbiosFilterType27BlackList[] = {\r
+  {0x1B, OFFSET_OF(SMBIOS_TABLE_TYPE27, NominalSpeed),        FIELD_SIZE_OF(SMBIOS_TABLE_TYPE27, NominalSpeed),        0},\r
+};\r
 SMBIOS_FILTER_TABLE  mSmbiosFilterType39BlackList[] = {\r
   {0x27, OFFSET_OF(SMBIOS_TABLE_TYPE39, SerialNumber),        FIELD_SIZE_OF(SMBIOS_TABLE_TYPE39, SerialNumber),        SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
   {0x27, OFFSET_OF(SMBIOS_TABLE_TYPE39, AssetTagNumber),      FIELD_SIZE_OF(SMBIOS_TABLE_TYPE39, AssetTagNumber),      SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
@@ -101,6 +104,7 @@ SMBIOS_FILTER_STRUCT  mSmbiosFilterStandardTableBlackList[] = {
   {0x12, NULL, 0},\r
   {0x16, mSmbiosFilterType22BlackList, sizeof(mSmbiosFilterType22BlackList)/sizeof(mSmbiosFilterType22BlackList[0])},\r
   {0x17, mSmbiosFilterType23BlackList, sizeof(mSmbiosFilterType23BlackList)/sizeof(mSmbiosFilterType23BlackList[0])},\r
+  {0x1B, mSmbiosFilterType27BlackList, sizeof(mSmbiosFilterType27BlackList)/sizeof(mSmbiosFilterType27BlackList[0])},\r
   {0x1F, NULL, 0},\r
   {0x21, NULL, 0},\r
   {0x27, mSmbiosFilterType39BlackList, sizeof(mSmbiosFilterType39BlackList)/sizeof(mSmbiosFilterType39BlackList[0])},\r
@@ -125,7 +129,7 @@ InternalDumpData (
 {\r
   UINTN  Index;\r
   for (Index = 0; Index < Size; Index++) {\r
-    DEBUG ((EFI_D_INFO, "%02x", (UINTN)Data[Index]));\r
+    DEBUG ((EFI_D_VERBOSE, "%02x", (UINTN)Data[Index]));\r
   }\r
 }\r
 \r
@@ -152,15 +156,15 @@ InternalDumpHex (
   Count = Size / COLUME_SIZE;\r
   Left  = Size % COLUME_SIZE;\r
   for (Index = 0; Index < Count; Index++) {\r
-    DEBUG ((EFI_D_INFO, "%04x: ", Index * COLUME_SIZE));\r
+    DEBUG ((EFI_D_VERBOSE, "%04x: ", Index * COLUME_SIZE));\r
     InternalDumpData (Data + Index * COLUME_SIZE, COLUME_SIZE);\r
-    DEBUG ((EFI_D_INFO, "\n"));\r
+    DEBUG ((EFI_D_VERBOSE, "\n"));\r
   }\r
 \r
   if (Left != 0) {\r
-    DEBUG ((EFI_D_INFO, "%04x: ", Index * COLUME_SIZE));\r
+    DEBUG ((EFI_D_VERBOSE, "%04x: ", Index * COLUME_SIZE));\r
     InternalDumpData (Data + Index * COLUME_SIZE, Left);\r
-    DEBUG ((EFI_D_INFO, "\n"));\r
+    DEBUG ((EFI_D_VERBOSE, "\n"));\r
   }\r
 }\r
 \r
@@ -217,7 +221,7 @@ GetSmbiosStringById (
   // look for the two consecutive zeros, check the string limit by the way.\r
   //\r
   String = NULL;\r
-  while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
+  while (*CharInStr != 0 || *(CharInStr+1) != 0) {\r
     if (*CharInStr == 0) {\r
       Size += 1;\r
       CharInStr++;\r
@@ -271,33 +275,47 @@ FilterSmbiosEntry (
   UINTN                 StringLen;\r
 \r
   DEBUG ((EFI_D_INFO, "Smbios Table (Type - %d):\n", ((SMBIOS_STRUCTURE *)TableEntry)->Type));\r
-  InternalDumpHex (TableEntry, TableEntrySize);\r
+  DEBUG_CODE (InternalDumpHex (TableEntry, TableEntrySize););\r
 \r
-  FilterStruct = GetFilterStructByType (((SMBIOS_STRUCTURE *)TableEntry)->Type);\r
-  if (FilterStruct != NULL) {\r
-    if (FilterStruct->Filter == NULL || FilterStruct->FilterCount == 0) {\r
-      // zero all table entries, except header\r
-      ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
-    } else {\r
-      Filter = FilterStruct->Filter;\r
-      for (Index = 0; Index < FilterStruct->FilterCount; Index++) {\r
-        if ((Filter[Index].Flags & SMBIOS_FILTER_TABLE_FLAG_IS_STRING) != 0) {\r
-          CopyMem (&StringId, (UINT8 *)TableEntry + Filter[Index].Offset, sizeof(StringId));\r
-          if (StringId != 0) {\r
-            // set ' ' for string field\r
-            String = GetSmbiosStringById (TableEntry, StringId, &StringLen);\r
-            //DEBUG ((EFI_D_INFO,"StrId(0x%x)-%a(%d)\n", StringId, String, StringLen));\r
-            SetMem (String, StringLen, ' ');\r
+  //\r
+  // Skip measurement for OEM types.\r
+  //\r
+  if (((SMBIOS_STRUCTURE *)TableEntry)->Type >= SMBIOS_OEM_BEGIN) {\r
+    // zero all table fields, except header\r
+    ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
+  } else {\r
+    FilterStruct = GetFilterStructByType (((SMBIOS_STRUCTURE *)TableEntry)->Type);\r
+    if (FilterStruct != NULL) {\r
+      if (FilterStruct->Filter == NULL || FilterStruct->FilterCount == 0) {\r
+        // zero all table fields, except header\r
+        ZeroMem ((UINT8 *)TableEntry + sizeof(SMBIOS_STRUCTURE), TableEntrySize - sizeof(SMBIOS_STRUCTURE));\r
+      } else {\r
+        Filter = FilterStruct->Filter;\r
+        for (Index = 0; Index < FilterStruct->FilterCount; Index++) {\r
+          if (((SMBIOS_STRUCTURE *) TableEntry)->Length >= (Filter[Index].Offset + Filter[Index].Size)) {\r
+            //\r
+            // The field is present in the SMBIOS entry.\r
+            //\r
+            if ((Filter[Index].Flags & SMBIOS_FILTER_TABLE_FLAG_IS_STRING) != 0) {\r
+              CopyMem (&StringId, (UINT8 *)TableEntry + Filter[Index].Offset, sizeof(StringId));\r
+              if (StringId != 0) {\r
+                // set ' ' for string field\r
+                String = GetSmbiosStringById (TableEntry, StringId, &StringLen);\r
+                ASSERT (String != NULL);\r
+                //DEBUG ((EFI_D_INFO,"StrId(0x%x)-%a(%d)\n", StringId, String, StringLen));\r
+                SetMem (String, StringLen, ' ');\r
+              }\r
+            }\r
+            // zero non-string field\r
+            ZeroMem ((UINT8 *)TableEntry + Filter[Index].Offset, Filter[Index].Size);\r
           }\r
         }\r
-        // zero non-string field\r
-        ZeroMem ((UINT8 *)TableEntry + Filter[Index].Offset, Filter[Index].Size);\r
       }\r
     }\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "Filter Smbios Table (Type - %d):\n", ((SMBIOS_STRUCTURE *)TableEntry)->Type));\r
-  InternalDumpHex (TableEntry, TableEntrySize);\r
+  DEBUG_CODE (InternalDumpHex (TableEntry, TableEntrySize););\r
 }\r
 \r
 /**\r
@@ -306,7 +324,7 @@ FilterSmbiosEntry (
 \r
   @param Head                   Pointer to the beginning of SMBIOS structure.\r
   @param NumberOfStrings        The returned number of optional strings that follow the formatted structure.\r
-  \r
+\r
   @return Size                  The returned size.\r
 **/\r
 UINTN\r
@@ -327,7 +345,7 @@ GetSmbiosStructureSize (
   //\r
   // look for the two consecutive zeros, check the string limit by the way.\r
   //\r
-  while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
+  while (*CharInStr != 0 || *(CharInStr+1) != 0) {\r
     if (*CharInStr == 0) {\r
       Size += 1;\r
       CharInStr++;\r
@@ -432,7 +450,11 @@ FilterSmbiosTable (
 }\r
 \r
 /**\r
-  Measure SMBIOS with EV_EFI_HANDOFF_TABLES to PCR[1]\r
+  Measure SMBIOS with EV_EFI_HANDOFF_TABLES to PCR[1].\r
+\r
+  @param[in] Event      Event whose notification function is being invoked.\r
+  @param[in] Context    Pointer to the notification function's context.\r
+\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -531,7 +553,7 @@ MeasureSmbiosTable (
   if (SmbiosTableAddress != NULL) {\r
     DEBUG ((DEBUG_INFO, "The Smbios Table starts at: 0x%x\n", SmbiosTableAddress));\r
     DEBUG ((DEBUG_INFO, "The Smbios Table size: 0x%x\n", TableLength));\r
-    InternalDumpHex ((UINT8 *)(UINTN)SmbiosTableAddress, TableLength);\r
+    DEBUG_CODE (InternalDumpHex ((UINT8 *)(UINTN)SmbiosTableAddress, TableLength););\r
 \r
     TableAddress = AllocateCopyPool ((UINTN)TableLength, (VOID *)(UINTN)SmbiosTableAddress);\r
     if (TableAddress == NULL) {\r
@@ -542,7 +564,7 @@ MeasureSmbiosTable (
 \r
     DEBUG ((DEBUG_INFO, "The final Smbios Table starts at: 0x%x\n", TableAddress));\r
     DEBUG ((DEBUG_INFO, "The final Smbios Table size: 0x%x\n", TableLength));\r
-    InternalDumpHex (TableAddress, TableLength);\r
+    DEBUG_CODE (InternalDumpHex (TableAddress, TableLength););\r
 \r
     HandoffTables.NumberOfTables = 1;\r
     if (Smbios3Table != NULL) {\r
@@ -570,13 +592,12 @@ MeasureSmbiosTable (
 \r
 /**\r
 \r
-  Driver to produce Smbios measurement. \r
+  Driver to produce Smbios measurement.\r
 \r
   @param ImageHandle     Module's image handle\r
   @param SystemTable     Pointer of EFI_SYSTEM_TABLE\r
 \r
-  @retval EFI_SUCCESS    Smbios protocol installed\r
-  @retval Other          No protocol installed, unload driver.\r
+  @return Status returned from EfiCreateEventReadyToBootEx().\r
 \r
 **/\r
 EFI_STATUS\r
@@ -589,10 +610,10 @@ SmbiosMeasurementDriverEntryPoint (
   EFI_STATUS            Status;\r
   EFI_EVENT             Event;\r
 \r
-  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, &mSmbios);\r
+  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &mSmbios);\r
   ASSERT_EFI_ERROR (Status);\r
   DEBUG ((DEBUG_INFO, "The Smbios Table Version: %x.%x\n", mSmbios->MajorVersion, mSmbios->MinorVersion));\r
-  \r
+\r
   if (mSmbios->MajorVersion < 2 || (mSmbios->MajorVersion == 2 && mSmbios->MinorVersion < 7)){\r
     mMaxLen = SMBIOS_STRING_MAX_LENGTH;\r
   } else if (mSmbios->MajorVersion < 3) {\r