diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
index bbfdce916d..cef73984c4 100644
--- a/DynamicTablesPkg/DynamicTables.dsc.inc
+++ b/DynamicTablesPkg/DynamicTables.dsc.inc
@@ -68,6 +68,7 @@
DynamicTablesPkg/Library/Smbios/SmbiosType27Lib/SmbiosType27Lib.inf
DynamicTablesPkg/Library/Smbios/SmbiosType28Lib/SmbiosType28Lib.inf
DynamicTablesPkg/Library/Smbios/SmbiosType29Lib/SmbiosType29Lib.inf
+ DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Lib.inf
DynamicTablesPkg/Library/Smbios/SmbiosType37Lib/SmbiosType37Lib.inf
DynamicTablesPkg/Library/Smbios/SmbiosType40Lib/SmbiosType40Lib.inf
DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Lib.inf
@@ -190,6 +191,7 @@
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType27Lib/SmbiosType27Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType28Lib/SmbiosType28Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType29Lib/SmbiosType29Lib.inf
+ NULL|DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType37Lib/SmbiosType37Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType40Lib/SmbiosType40Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType44Lib/SmbiosType44Lib.inf
diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Generator.c b/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Generator.c
new file mode 100644
index 0000000000..1f8473146b
--- /dev/null
+++ b/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Generator.c
@@ -0,0 +1,285 @@
+/** @file
+ SMBIOS Type 32 System Boot Information Table Generator.
+
+ Copyright (c) 2024 - 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include
+#include
+#include
+
+// Module specific include files.
+#include
+#include
+#include
+#include
+#include
+
+/** SMBIOS Type 32 System Boot Information Generator
+
+Requirements:
+ The following Configuration Manager Object is required by
+ this Generator:
+ - EArchCommonObjSystemBootInfo
+*/
+
+/** This macro expands to a function that retrieves the System Boot
+ Information from the Configuration Manager.
+*/
+GET_OBJECT_LIST (
+ EObjNameSpaceArchCommon,
+ EArchCommonObjSystemBootInfo,
+ CM_ARCH_COMMON_SYSTEM_BOOT_INFO
+ );
+
+/** Validate SMBIOS Type 32 System Boot Information.
+
+ Validation follows SMBIOS Specification v3.9.0, Section 7.33.1.
+
+ @param [in] SystemBootInfo System Boot Information CM object.
+
+ @retval EFI_SUCCESS The System Boot Information is valid.
+ @retval EFI_INVALID_PARAMETER The System Boot Information is invalid.
+**/
+STATIC
+EFI_STATUS
+ValidateSystemBootInfo (
+ IN CONST CM_ARCH_COMMON_SYSTEM_BOOT_INFO *SystemBootInfo
+ )
+{
+ if (SystemBootInfo->SystemBootInfoToken == CM_NULL_TOKEN) {
+ DEBUG ((DEBUG_ERROR, "%a: SystemBootInfoToken must not be null\n", __func__));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((SystemBootInfo->BootStatus >= BootInformationStatusStartReserved) &&
+ (SystemBootInfo->BootStatus < BootInformationStatusStartOemSpecific))
+ {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: BootStatus 0x%x is reserved by the SMBIOS specification\n",
+ __func__,
+ SystemBootInfo->BootStatus
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/** Free any resources allocated when installing SMBIOS Type 32 table.
+
+ @param [in] This Pointer to the SMBIOS table generator.
+ @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory
+ Protocol interface.
+ @param [in] SmbiosTableInfo Pointer to the SMBIOS table information.
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager
+ Protocol interface.
+ @param [in] Table Pointer to the generated SMBIOS table.
+
+ @retval EFI_SUCCESS Table freed successfully.
+**/
+STATIC
+EFI_STATUS
+FreeSmbiosType32Table (
+ IN CONST SMBIOS_TABLE_GENERATOR *CONST This,
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol,
+ IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo,
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
+ IN SMBIOS_STRUCTURE **CONST Table
+ )
+{
+ if (*Table != NULL) {
+ FreePool (*Table);
+ *Table = NULL;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/** Construct SMBIOS Type 32 System Boot Information table.
+
+ The minimum formatted length defined by SMBIOS Specification v3.9.0,
+ Section 7.33 is generated. It contains the six reserved bytes and one
+ System Boot Status byte.
+
+ If this function allocates any resources then they must be freed
+ in the FreeSmbiosType32Table function.
+
+ @param [in] This Pointer to the SMBIOS table generator.
+ @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory
+ Protocol interface.
+ @param [in] SmbiosTableInfo Pointer to the SMBIOS table information.
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager
+ Protocol interface.
+ @param [out] Table Pointer to the generated SMBIOS table.
+ @param [out] CmObjectToken Pointer to the CM Object Token for the
+ generated SMBIOS table.
+
+ @retval EFI_SUCCESS Table generated successfully.
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
+ @retval EFI_NOT_FOUND Required information is not found.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+ @retval Others Error returned by the Configuration Manager.
+**/
+STATIC
+EFI_STATUS
+BuildSmbiosType32Table (
+ IN CONST SMBIOS_TABLE_GENERATOR *This,
+ IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol,
+ IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo,
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
+ OUT SMBIOS_STRUCTURE **Table,
+ OUT CM_OBJECT_TOKEN *CONST CmObjectToken
+ )
+{
+ EFI_STATUS Status;
+ CM_ARCH_COMMON_SYSTEM_BOOT_INFO *SystemBootInfo;
+ UINT32 SystemBootInfoCount;
+ SMBIOS_TABLE_TYPE32 *SmbiosRecord;
+
+ SystemBootInfo = NULL;
+ SystemBootInfoCount = 0;
+ SmbiosRecord = NULL;
+
+ ASSERT (This != NULL);
+ ASSERT (TableFactoryProtocol != NULL);
+ ASSERT (SmbiosTableInfo != NULL);
+ ASSERT (CfgMgrProtocol != NULL);
+ ASSERT (Table != NULL);
+ ASSERT (CmObjectToken != NULL);
+ ASSERT (SmbiosTableInfo->TableGeneratorId == This->GeneratorID);
+
+ if ((This == NULL) || (TableFactoryProtocol == NULL) ||
+ (SmbiosTableInfo == NULL) || (CfgMgrProtocol == NULL) ||
+ (Table == NULL) || (CmObjectToken == NULL) ||
+ (SmbiosTableInfo->TableGeneratorId != This->GeneratorID))
+ {
+ DEBUG ((DEBUG_ERROR, "%a: Invalid Parameter\n", __func__));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Table = NULL;
+ *CmObjectToken = CM_NULL_TOKEN;
+
+ Status = GetEArchCommonObjSystemBootInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &SystemBootInfo,
+ &SystemBootInfoCount
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Failed to get System Boot Information CM Object. Status = %r\n",
+ __func__,
+ Status
+ ));
+ return Status;
+ }
+
+ // SMBIOS 3.9.0 Annex A, Section 4.11 requires exactly one Type 32 record.
+ if ((SystemBootInfo == NULL) || (SystemBootInfoCount != 1)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Expected one System Boot Information object, got %u\n",
+ __func__,
+ SystemBootInfoCount
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = ValidateSystemBootInfo (SystemBootInfo);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ SmbiosRecord = (SMBIOS_TABLE_TYPE32 *)AllocateSmbiosRecord (
+ sizeof (SMBIOS_TABLE_TYPE32),
+ NULL
+ );
+ if (SmbiosRecord == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ // AllocateSmbiosRecord() zeroes the six reserved bytes required by Type 32.
+ SmbiosRecord->Hdr.Type = SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION;
+ SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE32);
+ SmbiosRecord->BootStatus = SystemBootInfo->BootStatus;
+
+ *Table = (SMBIOS_STRUCTURE *)SmbiosRecord;
+ *CmObjectToken = SystemBootInfo->SystemBootInfoToken;
+
+ return EFI_SUCCESS;
+}
+
+/** The SMBIOS Type 32 Table Generator.
+*/
+STATIC CONST SMBIOS_TABLE_GENERATOR SmbiosType32Generator = {
+ // Generator ID
+ CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType32),
+ // Generator Description
+ L"SMBIOS.TYPE32.GENERATOR",
+ // SMBIOS structure type
+ SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION,
+ // Build table function
+ BuildSmbiosType32Table,
+ // Free function
+ FreeSmbiosType32Table,
+ NULL,
+ NULL
+};
+
+/** Register the Generator with the SMBIOS Table Factory.
+
+ @param [in] ImageHandle The handle to the image.
+ @param [in] SystemTable Pointer to the System Table.
+
+ @retval EFI_SUCCESS The Generator is registered.
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
+ @retval EFI_ALREADY_STARTED The Generator for the Table ID
+ is already registered.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosType32LibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = RegisterSmbiosTableGenerator (&SmbiosType32Generator);
+ DEBUG ((DEBUG_INFO, "SMBIOS Type 32: Register Generator. Status = %r\n", Status));
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
+}
+
+/** Deregister the Generator from the SMBIOS Table Factory.
+
+ @param [in] ImageHandle The handle to the image.
+ @param [in] SystemTable Pointer to the System Table.
+
+ @retval EFI_SUCCESS The Generator is deregistered.
+ @retval EFI_INVALID_PARAMETER A parameter is invalid.
+ @retval EFI_NOT_FOUND The Generator is not registered.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosType32LibDestructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = DeregisterSmbiosTableGenerator (&SmbiosType32Generator);
+ DEBUG ((DEBUG_INFO, "SMBIOS Type 32: Deregister Generator. Status = %r\n", Status));
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
+}
diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Lib.inf b/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Lib.inf
new file mode 100644
index 0000000000..b98e532025
--- /dev/null
+++ b/DynamicTablesPkg/Library/Smbios/SmbiosType32Lib/SmbiosType32Lib.inf
@@ -0,0 +1,34 @@
+## @file
+# SMBIOS Type 32 System Boot Information Table Generator.
+#
+# Copyright (c) 2024 - 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x0001001B
+ BASE_NAME = SmbiosType32LibArm
+ FILE_GUID = 0c6572ad-ca74-49b9-a68d-ae153a29dab2
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = NULL|DXE_DRIVER
+ CONSTRUCTOR = SmbiosType32LibConstructor
+ DESTRUCTOR = SmbiosType32LibDestructor
+
+[Sources]
+ SmbiosType32Generator.c
+
+[Packages]
+ DynamicTablesPkg/DynamicTablesPkg.dec
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ DebugLib
+ MemoryAllocationLib
+ SmbiosStringTableLib
+
+[Protocols]
+ gEdkiiConfigurationManagerProtocolGuid
+ gEdkiiDynamicTableFactoryProtocolGuid