]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
[Change summary]:
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / IScsiIbft.c
index 60a11b2e0d6ecd4cb92ddbe1429c8a8a50a42b88..ca08da7fa410e89dd8abd55ad1d40f22d3c97ee0 100644 (file)
@@ -20,11 +20,15 @@ UINTN   mTableKey;
 /**\r
   Initialize the header of the iSCSI Boot Firmware Table.\r
   \r
-  @param[out]  Header The header of the iSCSI Boot Firmware Table.\r
+  @param[out]  Header     The header of the iSCSI Boot Firmware Table.\r
+  @param[in]   OemId      The OEM ID.\r
+  @param[in]   OemTableId The OEM table ID for the iBFT.\r
 **/\r
 VOID\r
 IScsiInitIbfTableHeader (\r
-  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER  *Header\r
+  OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER   *Header,\r
+  IN  UINT8                                       *OemId,\r
+  IN  UINT64                                      *OemTableId\r
   )\r
 {\r
   ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));\r
@@ -39,6 +43,9 @@ IScsiInitIbfTableHeader (
   Header->OemId[2]  = 'T';\r
   Header->OemId[3]  = 'E';\r
   Header->OemId[4]  = 'L';\r
+  \r
+  CopyMem (Header->OemId, OemId, sizeof (Header->OemId));\r
+  Header->OemTableId = *OemTableId;\r
 }\r
 \r
 /**\r
@@ -448,12 +455,40 @@ IScsiPublishIbft (
   UINTN                                     HandleCount;\r
   EFI_HANDLE                                *HandleBuffer;\r
   UINT8                                     *Heap;\r
+  UINT8                                     Checksum;\r
+  UINTN                                         Index;\r
+  EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
+  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
 \r
   Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);\r
   if (EFI_ERROR (Status)) {\r
     return ;\r
   }\r
 \r
+\r
+  //\r
+  // Find ACPI table RSD_PTR from system table\r
+  //\r
+  for (Index = 0, Rsdp = NULL; Index < gST->NumberOfTableEntries; Index++) {\r
+    if (CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi20TableGuid) ||\r
+      CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpi10TableGuid) ||\r
+      CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), &gEfiAcpiTableGuid)\r
+      ) {\r
+      //\r
+      // A match was found.\r
+      //\r
+      Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) gST->ConfigurationTable[Index].VendorTable;\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Rsdp == NULL) {\r
+    return ;\r
+  } else {\r
+    Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;\r
+  }\r
+\r
+\r
   if (mIbftInstalled) {\r
     Status = AcpiTableProtocol->UninstallAcpiTable (\r
                                   AcpiTableProtocol,\r
@@ -481,7 +516,7 @@ IScsiPublishIbft (
   //\r
   // Allocate 4k bytes to hold the ACPI table.\r
   //\r
-  Table = AllocatePool (IBFT_MAX_SIZE);\r
+  Table = AllocateZeroPool (IBFT_MAX_SIZE);\r
   if (Table == NULL) {\r
     return ;\r
   }\r
@@ -491,11 +526,14 @@ IScsiPublishIbft (
   //\r
   // Fill in the various section of the iSCSI Boot Firmware Table.\r
   //\r
-  IScsiInitIbfTableHeader (Table);\r
+  IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);\r
   IScsiInitControlSection (Table, HandleCount);\r
   IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);\r
   IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);\r
 \r
+  Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);\r
+  Table->Checksum = Checksum;\r
+\r
   FreePool (HandleBuffer);\r
 \r
   //\r