/** @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
+Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/PcdLib.h>\r
#include <Library/TpmMeasurementLib.h>\r
\r
#define FIELD_SIZE_OF(TYPE, Field) ((UINTN)sizeof(((TYPE *)0)->Field))\r
{0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, CoreCount2), FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, CoreCount2), 0},\r
{0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, EnabledCoreCount2), FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, EnabledCoreCount2), 0},\r
{0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, ThreadCount2), FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, ThreadCount2), 0},\r
+ {0x04, OFFSET_OF(SMBIOS_TABLE_TYPE4, Voltage), FIELD_SIZE_OF(SMBIOS_TABLE_TYPE4, Voltage), 0},\r
};\r
SMBIOS_FILTER_TABLE mSmbiosFilterType17BlackList[] = {\r
{0x11, OFFSET_OF(SMBIOS_TABLE_TYPE17, SerialNumber), FIELD_SIZE_OF(SMBIOS_TABLE_TYPE17, SerialNumber), SMBIOS_FILTER_TABLE_FLAG_IS_STRING},\r
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
{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
EFI_SMBIOS_PROTOCOL *mSmbios;\r
UINTN mMaxLen;\r
\r
+#pragma pack (1)\r
+\r
+#define SMBIOS_HANDOFF_TABLE_DESC "SmbiosTable"\r
+typedef struct {\r
+ UINT8 TableDescriptionSize;\r
+ UINT8 TableDescription[sizeof(SMBIOS_HANDOFF_TABLE_DESC)];\r
+ UINT64 NumberOfTables;\r
+ EFI_CONFIGURATION_TABLE TableEntry[1];\r
+} SMBIOS_HANDOFF_TABLE_POINTERS2;\r
+\r
+#pragma pack ()\r
+\r
/**\r
\r
This function dump raw data.\r
DEBUG ((EFI_D_INFO, "Smbios Table (Type - %d):\n", ((SMBIOS_STRUCTURE *)TableEntry)->Type));\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
EFI_STATUS Status;\r
EFI_HANDOFF_TABLE_POINTERS HandoffTables;\r
+ SMBIOS_HANDOFF_TABLE_POINTERS2 SmbiosHandoffTables2;\r
+ UINT32 EventType;\r
+ VOID *EventLog;\r
+ UINT32 EventLogSize;\r
SMBIOS_TABLE_ENTRY_POINT *SmbiosTable;\r
SMBIOS_TABLE_3_0_ENTRY_POINT *Smbios3Table;\r
VOID *SmbiosTableAddress;\r
CopyGuid (&(HandoffTables.TableEntry[0].VendorGuid), &gEfiSmbiosTableGuid);\r
HandoffTables.TableEntry[0].VendorTable = SmbiosTable;\r
}\r
+ EventType = EV_EFI_HANDOFF_TABLES;\r
+ EventLog = &HandoffTables;\r
+ EventLogSize = sizeof (HandoffTables);\r
+\r
+ if (PcdGet32(PcdTcgPfpMeasurementRevision) >= TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2_REV_105) {\r
+ SmbiosHandoffTables2.TableDescriptionSize = sizeof(SmbiosHandoffTables2.TableDescription);\r
+ CopyMem (SmbiosHandoffTables2.TableDescription, SMBIOS_HANDOFF_TABLE_DESC, sizeof(SmbiosHandoffTables2.TableDescription));\r
+ SmbiosHandoffTables2.NumberOfTables = HandoffTables.NumberOfTables;\r
+ CopyMem (&(SmbiosHandoffTables2.TableEntry[0]), &(HandoffTables.TableEntry[0]), sizeof(SmbiosHandoffTables2.TableEntry[0]));\r
+ EventType = EV_EFI_HANDOFF_TABLES2;\r
+ EventLog = &SmbiosHandoffTables2;\r
+ EventLogSize = sizeof (SmbiosHandoffTables2);\r
+ }\r
Status = TpmMeasureAndLogData (\r
1, // PCRIndex\r
- EV_EFI_HANDOFF_TABLES, // EventType\r
- &HandoffTables, // EventLog\r
- sizeof (HandoffTables), // LogLen\r
+ EventType, // EventType\r
+ EventLog, // EventLog\r
+ EventLogSize, // LogLen\r
TableAddress, // HashData\r
TableLength // HashDataLen\r
);\r
- if (EFI_ERROR (Status)) {\r
- return ;\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->CloseEvent (Event) ;\r
}\r
}\r
\r