X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FIScsiDxe%2FIScsiIbft.c;fp=MdeModulePkg%2FUniversal%2FNetwork%2FIScsiDxe%2FIScsiIbft.c;h=0000000000000000000000000000000000000000;hp=58c5447dcbd1074c4ce85c82d4fb8cedd3688b1d;hb=dff73e4c73fd421421c622a9fd3762588144db96;hpb=a19b33620494e05d2ce701c072808b425a76bc9a diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c deleted file mode 100644 index 58c5447dcb..0000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c +++ /dev/null @@ -1,539 +0,0 @@ -/** @file - Implementation for iSCSI Boot Firmware Table publication. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -BOOLEAN mIbftInstalled = FALSE; -UINTN mTableKey; - -/** - Initialize the header of the iSCSI Boot Firmware Table. - - @param[out] Header The header of the iSCSI Boot Firmware Table. - @param[in] OemId The OEM ID. - @param[in] OemTableId The OEM table ID for the iBFT. -**/ -VOID -IScsiInitIbfTableHeader ( - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, - IN UINT8 *OemId, - IN UINT64 *OemTableId - ) -{ - ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER)); - - Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE; - Header->Length = IBFT_HEAP_OFFSET; - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION; - Header->Checksum = 0; - - CopyMem (Header->OemId, OemId, sizeof (Header->OemId)); - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64)); -} - -/** - Initialize the control section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in] HandleCount The number of the handles associated with iSCSI sessions, it's - equal to the number of iSCSI sessions. -**/ -VOID -IScsiInitControlSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN UINTN HandleCount - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - UINTN NumOffset; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE)); - - Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; - Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; - Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); - - // - // Each session occupies two offsets, one for the NIC section, - // the other for the Target section. - // - NumOffset = 2 * HandleCount; - if (NumOffset > 4) { - // - // Need expand the control section if more than 2 NIC/Target sections - // exist. - // - Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16)); - } -} - -/** - Add one item into the heap. - - @param[in, out] Heap On input, the current address of the heap; On output, the address of - the heap after the item is added. - @param[in] Data The data to add into the heap. - @param[in] Len Length of the Data in byte. -**/ -VOID -IScsiAddHeapItem ( - IN OUT UINT8 **Heap, - IN VOID *Data, - IN UINTN Len - ) -{ - // - // Add one byte for the NULL delimiter. - // - *Heap -= Len + 1; - - CopyMem (*Heap, Data, Len); - *(*Heap + Len) = 0; -} - -/** - Fill the Initiator section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in, out] Heap The heap. - @param[in] Handle The handle associated with the iSCSI session. -**/ -VOID -IScsiFillInitiatorSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN EFI_HANDLE Handle - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION *Session; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - // - // Initiator section immediately follows the control section. - // - Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length)); - - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table); - - ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)); - - Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; - Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION; - Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); - Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED; - - // - // Get the identifier from the handle. - // - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - Session = &DriverData->Session; - - // - // Fill the iSCSI Initiator Name into the heap. - // - IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1); - - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1); - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); -} - -/** - Map the v4 IP address into v6 IP address. - - @param[in] V4 The v4 IP address. - @param[out] V6 The v6 IP address. -**/ -VOID -IScsiMapV4ToV6Addr ( - IN EFI_IPv4_ADDRESS *V4, - OUT EFI_IPv6_ADDRESS *V6 - ) -{ - UINTN Index; - - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); - - V6->Addr[10] = 0xff; - V6->Addr[11] = 0xff; - - for (Index = 0; Index < 4; Index++) { - V6->Addr[12 + Index] = V4->Addr[Index]; - } -} - -/** - Get the NIC's PCI location and return it according to the composited - format defined in iSCSI Boot Firmware Table. - - @param[in] Controller The handle of the controller. - - @return UINT16 The composited representation of the NIC PCI location. - @retval 0 Other errors as indicated. -**/ -UINT16 -IScsiGetNICPciLocation ( - IN EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_HANDLE PciIoHandle; - EFI_PCI_IO_PROTOCOL *PciIo; - UINTN Segment; - UINTN Bus; - UINTN Device; - UINTN Function; - - Status = gBS->HandleProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePath - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->LocateDevicePath ( - &gEfiPciIoProtocolGuid, - &DevicePath, - &PciIoHandle - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function); - if (EFI_ERROR (Status)) { - return 0; - } - - return (UINT16) ((Bus << 8) | (Device << 3) | Function); -} - -/** - Fill the NIC and target sections in iSCSI Boot Firmware Table. - - @param[in] Table The buffer of the ACPI table. - @param[in, out] Heap The heap buffer used to store the variable length parameters such as iSCSI name. - @param[in] HandleCount Count The number of handles having iSCSI private protocol installed. - @param[in] Handles The handle buffer. -**/ -VOID -IScsiFillNICAndTargetSections ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN UINTN HandleCount, - IN EFI_HANDLE *Handles - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION_CONFIG_DATA *SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; - UINT16 *SectionOffset; - UINTN Index; - UINT16 Length; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - // - // Get the offset of the first Nic and Target section. - // - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table + - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - - SectionOffset = &Control->NIC0Offset; - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - SessionConfigData = &DriverData->Session.ConfigData; - AuthConfig = &DriverData->Session.AuthData.AuthConfig; - - // - // Fill the Nic section. - // - ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)); - - Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; - Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; - Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); - Nic->Header.Index = (UINT8) Index; - Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; - - // - // Get the subnet mask prefix length. - // - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask); - - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) { - Nic->Origin = IpPrefixOriginDhcp; - } else { - Nic->Origin = IpPrefixOriginManual; - } - // - // Map the various v4 addresses into v6 addresses. - // - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip); - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway); - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer); - - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller); - - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac)); - - // - // Get the PCI location of the Nic. - // - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller); - - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table); - SectionOffset++; - - // - // Fill the Target section. - // - ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)); - - Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; - Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; - Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); - Target->Header.Index = (UINT8) Index; - Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED; - Target->Port = SessionConfigData->NvData.TargetPort; - Target->NicIndex = (UINT8) Index; - - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP; - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP; - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP; - } - - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip); - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun)); - - // - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. - // - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName); - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length); - - Target->IScsiNameLength = Length; - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) { - // - // CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName); - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); - Target->CHAPNameLength = Length; - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); - Target->CHAPSecretLength = Length; - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) { - // - // Reverse CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); - Target->ReverseCHAPNameLength = Length; - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // Reverse CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); - Target->ReverseCHAPSecretLength = Length; - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - } - } - - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table); - SectionOffset++; - - // - // Advance to the next NIC/Target pair - // - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - } -} - -/** - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI - session status. -**/ -VOID -IScsiPublishIbft ( - VOID - ) -{ - EFI_STATUS Status; - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINT8 *Heap; - UINT8 Checksum; - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; - - Rsdt = NULL; - Xsdt = NULL; - - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol); - if (EFI_ERROR (Status)) { - return ; - } - - - // - // Find ACPI table RSD_PTR from system table - // - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp); - if (EFI_ERROR (Status)) { - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp); - } - - if (EFI_ERROR (Status) || (Rsdp == NULL)) { - return ; - } else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) { - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress; - } else if (Rsdp->RsdtAddress != 0) { - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; - } - - if ((Xsdt == NULL) && (Rsdt == NULL)) { - return ; - } - - if (mIbftInstalled) { - Status = AcpiTableProtocol->UninstallAcpiTable ( - AcpiTableProtocol, - mTableKey - ); - if (EFI_ERROR (Status)) { - return ; - } - mIbftInstalled = FALSE; - } - - // - // Get all iSCSI private protocols. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiCallerIdGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return ; - } - // - // Allocate 4k bytes to hold the ACPI table. - // - Table = AllocateZeroPool (IBFT_MAX_SIZE); - if (Table == NULL) { - return ; - } - - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET; - - // - // Fill in the various section of the iSCSI Boot Firmware Table. - // - if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId); - } else { - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); - } - - IScsiInitControlSection (Table, HandleCount); - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer); - - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length); - Table->Checksum = Checksum; - - FreePool (HandleBuffer); - - // - // Install or update the iBFT table. - // - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - Table, - Table->Length, - &mTableKey - ); - if (EFI_ERROR(Status)) { - return; - } - - mIbftInstalled = TRUE; - FreePool (Table); -}