Hello Abdul,
some comments on the patch:
On 4/29/24 08:03, Abdul Lateef Attar wrote:
Adds X64 architecture specific MADT/APIC Table generator.
Register/Deregister MADT table.
Adds X64 architecture namespace objects.
Cc: Sami Mujawar <sami.muja...@arm.com>
Cc: Pierre Gondois <pierre.gond...@arm.com>
Signed-off-by: Abdul Lateef Attar <abdullateef.at...@amd.com>
---
DynamicTablesPkg/DynamicTables.dsc.inc | 6 +
.../Include/ConfigurationManagerObject.h | 1 +
.../Include/X64NameSpaceObjects.h | 48 +++
.../X64/AcpiMadtLibX64/AcpiMadtLibX64.inf | 27 ++
.../Acpi/X64/AcpiMadtLibX64/MadtGenerator.c | 375 ++++++++++++++++++
5 files changed, 457 insertions(+)
create mode 100644 DynamicTablesPkg/Include/X64NameSpaceObjects.h
create mode 100644
DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
create mode 100644
DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/MadtGenerator.c
diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc
b/DynamicTablesPkg/DynamicTables.dsc.inc
index fc2ac5962e..19034e6f65 100644
--- a/DynamicTablesPkg/DynamicTables.dsc.inc
+++ b/DynamicTablesPkg/DynamicTables.dsc.inc
@@ -39,6 +39,11 @@
DynamicTablesPkg/Library/Acpi/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf
[Components.IA32, Components.X64]
+ #
+ # Generators
+ #
+ DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
+
#
# Dynamic Table Factory Dxe
#
@@ -48,6 +53,7 @@
NULL|DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf
NULL|DynamicTablesPkg/Library/Acpi/AcpiWsmtLib/AcpiWsmtLib.inf
NULL|DynamicTablesPkg/Library/Acpi/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf
+ NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
}
[Components.ARM, Components.AARCH64]
diff --git a/DynamicTablesPkg/Include/ConfigurationManagerObject.h
b/DynamicTablesPkg/Include/ConfigurationManagerObject.h
index f2cfadf3d4..31197eb019 100644
--- a/DynamicTablesPkg/Include/ConfigurationManagerObject.h
+++ b/DynamicTablesPkg/Include/ConfigurationManagerObject.h
@@ -110,6 +110,7 @@ typedef enum ObjectNameSpaceID {
EObjNameSpaceStandard, ///< Standard Objects Namespace
EObjNameSpaceArm, ///< ARM Objects Namespace
EObjNameSpaceArch, ///< Arch Objects Namespace
+ EObjNameSpaceX64, ///< X64 Objects Namespace
EObjNameSpaceOem = 0x8, ///< OEM Objects Namespace
EObjNameSpaceMax
} EOBJECT_NAMESPACE_ID;
diff --git a/DynamicTablesPkg/Include/X64NameSpaceObjects.h
b/DynamicTablesPkg/Include/X64NameSpaceObjects.h
new file mode 100644
index 0000000000..cd5c1ff43c
--- /dev/null
+++ b/DynamicTablesPkg/Include/X64NameSpaceObjects.h
@@ -0,0 +1,48 @@
+/** @file
+
+ Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ @par Glossary:
+ - Cm or CM - Configuration Manager
+ - Obj or OBJ - Object
+ - X64 - X64 processor architecture
+ **/
+
+#ifndef X64_NAMESPACE_OBJECT_H_
+#define X64_NAMESPACE_OBJECT_H_
+
+/** The EX64_OBJECT_ID enum describes the Object IDs
+ in the X64 Namespace
+*/
+typedef enum X64ObjectID {
+ EX64ObjReserved, ///< 0 - Reserved
+ EX64ObjMadtLocalInterruptInfo, ///< 1 - MADT Local Interrupt
Information
+ EX64ObjMadtProcessorLocalApicX2ApicInfo, ///< 2 - MADT Local APIC/x2APIC
Controller Information
+ EX64ObjMadtIoApicInfo, ///< 3 - MADT IOAPIC Information
+ EX64ObjMadtLocalApicX2ApicNmiInfo, ///< 4 - MADT Local APIC/x2APIC
NMI Information
+ EX64ObjMadtInterruptSourceOverrideInfo, ///< 5 - MADT Interrupt Override
Information
+ EX64ObjMax
+} E_X64_OBJECT_ID;
+
+/** A structure that describes the
+ MADT Local Interrupt Information for the Platform.
+
+ ID: EX64ObjMadtLocalInterruptInfo
+*/
+typedef struct CmX64MadtLocalInterruptInfo {
+ UINT32 LocalApicAddress; ///< Local Interrupt Controller Address
+ UINT32 Flags; ///< Flags
+} CM_X64_MADT_LOCAL_INTERRUPT_INFO;
+
+/** A structure that describes the
+ MADT Interrupt controller type information for the platform.
+
+ ID: EX64ObjMadtInterruptControllerTypeInfo
+*/
+typedef struct CmX64MadtInterruptControllerTypeInfo {
+ VOID *InterruptControllerTypeInfo; ///< Interrupt Controller Type
Information
Cf. the comment in:
[PATCH v4 2/5] DynamicTablesPkg: Adds ACPI HPET Table generator
the information should be stored in CmObj, as (for instance):
{
UINT32 InterruptNumber;
UINT32 Flags;
UINT64 BaseAddress;
...
}
Here you are kind of bypassing the framework by using a VOID* pointer.
The interest of storing the information in objects is that this information
can be re-used at multiple places.
For instance for Arm, GicC information is used to generate the MADT table,
but also used for to generate the PPTT, SRAT, SSDT topology tables.
If the information is generic, multiple IDs can correspond to on CM_OBJ
structure as you did, but fields containing real data should be used.
For instance there is for Arm:
/** A structure that describes the Arm
Generic Interrupts.
*/
typedef struct CmArmGenericInterrupt {
/// Interrupt number
UINT32 Interrupt;
/// Flags
/// BIT0: 0: Interrupt is Level triggered
/// 1: Interrupt is Edge triggered
/// BIT1: 0: Interrupt is Active high
/// 1: Interrupt is Active low
UINT32 Flags;
} CM_ARM_GENERIC_INTERRUPT;
but I don't think it fully applies to X64 arch as for instance,
the 5.2.12.8 Local APIC Address Override Structure
requires a 'Local APIC Address' field which is not present in here.
+ UINTN Size; ///< Size of the Interrupt Controller
Type Information
+} CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO;
+#endif
diff --git
a/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
new file mode 100644
index 0000000000..4d59e9023c
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/AcpiMadtLibX64.inf
@@ -0,0 +1,27 @@
+## @file
+# MADT Acpi table generator
+#
+# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 1.27
+ BASE_NAME = AcpiMadtLibX64
+ FILE_GUID = BF8A63EC-21B9-4531-9866-F3F1593282EC
+ VERSION_STRING = 1.0
+ MODULE_TYPE = DXE_DRIVER
+ LIBRARY_CLASS = NULL|DXE_DRIVER
+ CONSTRUCTOR = AcpiMadtLibX64Constructor
+ DESTRUCTOR = AcpiMadtLibX64Destructor
+
+[Sources]
+ MadtGenerator.c
+
+[Packages]
+ DynamicTablesPkg/DynamicTablesPkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+
+
diff --git a/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/MadtGenerator.c
b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/MadtGenerator.c
new file mode 100644
index 0000000000..8cfed66c8f
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLibX64/MadtGenerator.c
@@ -0,0 +1,375 @@
+/** @file
+ This library provides the implementation of the ACPI Multiple APIC
Description Table (MADT)
+ for X64 architecture.
+
+ Copyright (c) 2017 - 2023, Arm Limited. All rights reserved.
+ Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <AcpiTableGenerator.h>
+#include <ConfigurationManagerObject.h>
+#include <ConfigurationManagerHelper.h>
+#include <Library/TableHelperLib.h>
+#include <Protocol/ConfigurationManagerProtocol.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <X64NameSpaceObjects.h>
+
+/** The Creator ID for the ACPI tables generated using
+ the standard ACPI table generators.
+*/
+#define TABLE_GENERATOR_CREATOR_ID_GENERIC SIGNATURE_32('D', 'Y', 'N', 'T')
+
+/// MACRO to create GET_OBJECT_LIST for EX64ObjMadtLocalInterruptInfo
+GET_OBJECT_LIST (
+ EObjNameSpaceX64,
+ EX64ObjMadtLocalInterruptInfo,
+ CM_X64_MADT_LOCAL_INTERRUPT_INFO
+ );
+
+/// MACRO to create GET_OBJECT_LIST for EX64ObjMadtProcessorLocalApicX2ApicInfo
+GET_OBJECT_LIST (
+ EObjNameSpaceX64,
+ EX64ObjMadtProcessorLocalApicX2ApicInfo,
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
+ );
+
+/// MACRO to create GET_OBJECT_LIST for EX64ObjMadtIoApicInfo
+GET_OBJECT_LIST (
+ EObjNameSpaceX64,
+ EX64ObjMadtIoApicInfo,
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
+ );
+
+/// MACRO to create GET_OBJECT_LIST for EX64ObjMadtLocalApicX2ApicNmiInfo
+GET_OBJECT_LIST (
+ EObjNameSpaceX64,
+ EX64ObjMadtLocalApicX2ApicNmiInfo,
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
+ );
+
+/// MACRO to create GET_OBJECT_LIST for EX64ObjMadtInterruptSourceOverrideInfo
+GET_OBJECT_LIST (
+ EObjNameSpaceX64,
+ EX64ObjMadtInterruptSourceOverrideInfo,
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
+ );
+
+/**
+ Build the ACPI MADT table.
+
+ This function builds the ACPI MADT table as per the input configuration.
+
+ @param[in] This Pointer to the ACPI_TABLE_GENERATOR protocol.
+ @param[in] AcpiTableInfo Pointer to the CM_STD_OBJ_ACPI_TABLE_INFO
structure.
+ @param[in] CfgMgrProtocol Pointer to the
EDKII_CONFIGURATION_MANAGER_PROTOCOL protocol.
+ @param[out] Table Pointer to the ACPI table structure.
+
+ @retval EFI_SUCCESS The ACPI MADT table is built successfully.
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.
+**/
+STATIC
+EFI_STATUS
+BuildMadtTable (
+ IN CONST ACPI_TABLE_GENERATOR *CONST This,
+ IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
+ OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table
+ )
+{
+ EFI_STATUS Status;
+ EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt;
+ UINTN MadtSize;
+ CM_X64_MADT_LOCAL_INTERRUPT_INFO *LocalInterruptInfo;
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
*ProcessorLocalApicX2ApicInfo;
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO *IoApicInfo;
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO *LocalApicX2ApicNmiInfo;
+ CM_X64_MADT_INTERRUPT_CONTROLLER_TYPE_INFO
*InterruptSourceOverrideInfo;
+
+ ASSERT (This != NULL);
+ ASSERT (AcpiTableInfo != NULL);
+ ASSERT (CfgMgrProtocol != NULL);
+ ASSERT (Table != NULL);
+ ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
+ ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
+
+ if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) ||
+ (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision))
+ {
+ DEBUG ((
+ DEBUG_ERROR,
+ "ERROR: MADT: Requested table revision = %d, is not supported."
+ "Supported table revision: Minimum = %d, Maximum = %d\n",
+ AcpiTableInfo->AcpiTableRevision,
+ This->MinAcpiTableRevision,
+ This->AcpiTableRevision
+ ));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Table = NULL;
+ MadtSize = sizeof (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
+
+ // Get Local Interrupt Info
+ Status = GetEX64ObjMadtLocalInterruptInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &LocalInterruptInfo,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to get Local Interrupt Info\n"));
+ return Status;
+ }
+
+ // Get Processor Local APIC/x2APIC Info
+ Status = GetEX64ObjMadtProcessorLocalApicX2ApicInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &ProcessorLocalApicX2ApicInfo,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to get Processor Local APIC/x2APIC
Info\n"));
+ return Status;
+ } else {
+ if (ProcessorLocalApicX2ApicInfo->Size == 0) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Processor Local APIC/x2APIC Info size is
0\n"));
+ return EFI_NOT_FOUND;
+ }
+ }
+
+ MadtSize += ProcessorLocalApicX2ApicInfo->Size;
+
+ // Get IO APIC Info
+ Status = GetEX64ObjMadtIoApicInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &IoApicInfo,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to get IO APIC Info\n"));
+ return Status;
+ } else {
+ if (IoApicInfo->Size == 0) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: IO APIC Info size is 0\n"));
+ return EFI_NOT_FOUND;
+ }
+ }
+
+ MadtSize += IoApicInfo->Size;
+
+ // Get Local APIC/x2APIC NMI Info
+ Status = GetEX64ObjMadtLocalApicX2ApicNmiInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &LocalApicX2ApicNmiInfo,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to get Local APIC/x2APIC NMI
Info\n"));
+ return Status;
+ } else {
+ if (LocalApicX2ApicNmiInfo->Size == 0) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Local APIC/x2APIC NMI Info size is
0\n"));
+ return EFI_NOT_FOUND;
+ }
+ }
+
+ MadtSize += LocalApicX2ApicNmiInfo->Size;
+
+ // Get Interrupt Source Override Info
+ Status = GetEX64ObjMadtInterruptSourceOverrideInfo (
+ CfgMgrProtocol,
+ CM_NULL_TOKEN,
+ &InterruptSourceOverrideInfo,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_WARN, "WARNING: MADT: Failed to get Interrupt Source Override
Info\n"));
+ }
+
+ if ((InterruptSourceOverrideInfo != NULL) &&
(InterruptSourceOverrideInfo->Size != 0)) {
+ MadtSize += InterruptSourceOverrideInfo->Size;
+ }
+
+ // Allocate memory for Madt pointer
+ Madt = (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER
*)AllocateZeroPool (MadtSize);
+ if (Madt == NULL) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to allocate memory for MADT\n"));
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ // Initialize the MADT header
+ Status = AddAcpiHeader (
+ CfgMgrProtocol,
+ This,
+ &Madt->Header,
+ AcpiTableInfo,
+ (UINT32)MadtSize
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Failed to initialize MADT header\n"));
+ FreePool (Madt);
+ return Status;
+ }
+
+ Madt->LocalApicAddress = LocalInterruptInfo->LocalApicAddress;
+ Madt->Flags = LocalInterruptInfo->Flags;
+
+ CopyMem (
+ (UINT8 *)Madt + sizeof
(EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER),
+ ProcessorLocalApicX2ApicInfo->InterruptControllerTypeInfo,
+ ProcessorLocalApicX2ApicInfo->Size
+ );
+
+ CopyMem (
+ (UINT8 *)Madt + sizeof (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER)
+ ProcessorLocalApicX2ApicInfo->Size,
+ IoApicInfo->InterruptControllerTypeInfo,
+ IoApicInfo->Size
+ );
+
+ CopyMem (
+ (UINT8 *)Madt + sizeof (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER) +
ProcessorLocalApicX2ApicInfo->Size + IoApicInfo->Size,
+ LocalApicX2ApicNmiInfo->InterruptControllerTypeInfo,
+ LocalApicX2ApicNmiInfo->Size
+ );
+
+ if ((InterruptSourceOverrideInfo != NULL) &&
(InterruptSourceOverrideInfo->Size != 0)) {
+ CopyMem (
+ (UINT8 *)Madt + sizeof (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER) +
ProcessorLocalApicX2ApicInfo->Size + IoApicInfo->Size +
LocalApicX2ApicNmiInfo->Size,
+ InterruptSourceOverrideInfo->InterruptControllerTypeInfo,
+ InterruptSourceOverrideInfo->Size
+ );
+ }
+
+ *Table = (EFI_ACPI_DESCRIPTION_HEADER *)Madt;
+ return EFI_SUCCESS;
+}
+
+/** Free any resources allocated for constructing the MADT
+
+ @param [in] This Pointer to the table generator.
+ @param [in] AcpiTableInfo Pointer to the ACPI Table Info.
+ @param [in] CfgMgrProtocol Pointer to the Configuration Manager
+ Protocol Interface.
+ @param [in, out] Table Pointer to the ACPI Table.
+
+ @retval EFI_SUCCESS The resources were freed successfully.
+ @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid.
+**/
+STATIC
+EFI_STATUS
+FreeMadtTableResources (
+ IN CONST ACPI_TABLE_GENERATOR *CONST This,
+ IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo,
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol,
+ IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table
+ )
+{
+ ASSERT (This != NULL);
+ ASSERT (AcpiTableInfo != NULL);
+ ASSERT (CfgMgrProtocol != NULL);
+ ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
+ ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
+
+ if ((Table == NULL) || (*Table == NULL)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: MADT: Invalid Table Pointer\n"));
+ ASSERT ((Table != NULL) && (*Table != NULL));
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Table = NULL;
I think it misses:
FreePool (*Table);
+ return EFI_SUCCESS;
+}
+
+/// Macro for MADT Table generator revision
+#define MADT_GENERATOR_REVISION CREATE_REVISION (1, 0)
+
+/// Interface for MADT table generator
+STATIC
+CONST
+ACPI_TABLE_GENERATOR mMadtTableGenerator = {
+ // Generator ID
+ CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt),
+ // Generator Description
+ L"ACPI.STD.MADT.GENERATOR",
+ // ACPI Table Signature
+ EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
+ // ACPI Table Revision supported by this Generator
+ EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
+ // Minimum supported ACPI Table Revision
+ EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
+ // Creator ID
+ TABLE_GENERATOR_CREATOR_ID_GENERIC,
+ // Creator Revision
+ MADT_GENERATOR_REVISION,
+ // Build Table function
+ BuildMadtTable,
+ // Free Resource function
+ FreeMadtTableResources,
+ // Extended build function not needed
+ NULL,
+ // Extended build function not implemented by the generator.
+ // Hence extended free resource function is not required.
+ NULL
+};
+
+/**
+ The constructor function registers the ACPI MADT table generator.
+
+ The constructor function registers the ACPI MADT table generator.
+
+ @param[in] ImageHandle The firmware allocated handle for the EFI
image.
+ @param[in] SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The constructor executed successfully.
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.
+**/
+EFI_STATUS
+EFIAPI
+AcpiMadtLibX64Constructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = RegisterAcpiTableGenerator (&mMadtTableGenerator);
+ DEBUG ((DEBUG_INFO, "MADT: Register Generator. Status = %r\n", Status));
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+}
+
+/**
+ The destructor function unregisters the ACPI MADT table generator.
+
+ The destructor function unregisters the ACPI MADT table generator.
+
+ @param[in] ImageHandle The firmware allocated handle for the EFI
image.
+ @param[in] SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The destructor executed successfully.
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.
+**/
+EFI_STATUS
+EFIAPI
+AcpiMadtLibX64Destructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+
+ Status = DeregisterAcpiTableGenerator (&mMadtTableGenerator);
+ DEBUG ((DEBUG_INFO, "MADT: Unregister Generator. Status = %r\n", Status));
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+}
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118532): https://edk2.groups.io/g/devel/message/118532
Mute This Topic: https://groups.io/mt/105796054/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-