From af1a266670d040d2f4083ff309d732d648afba2a Mon Sep 17 00:00:00 2001
From: Angelos Mouzakitis <a.mouzakitis@virtualopensystems.com>
Date: Tue, 10 Oct 2023 14:33:42 +0000
Subject: Add submodule dependency files

Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
---
 .../PrePiExtractGuidedSectionLib.c                 | 255 +++++++++++++++++++++
 .../PrePiExtractGuidedSectionLib.inf               |  30 +++
 2 files changed, 285 insertions(+)
 create mode 100644 roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c
 create mode 100644 roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf

(limited to 'roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib')

diff --git a/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c b/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c
new file mode 100644
index 000000000..26deee3fd
--- /dev/null
+++ b/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c
@@ -0,0 +1,255 @@
+/** @file
+
+  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ExtractGuidedSectionLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrePiLib.h>
+
+#define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}
+
+typedef struct {
+  UINT32                                  NumberOfExtractHandler;
+  GUID                                    *ExtractHandlerGuidTable;
+  EXTRACT_GUIDED_SECTION_DECODE_HANDLER   *ExtractDecodeHandlerTable;
+  EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;
+} PRE_PI_EXTRACT_GUIDED_SECTION_DATA;
+
+PRE_PI_EXTRACT_GUIDED_SECTION_DATA *
+GetSavedData (
+  VOID
+  )
+{
+  EFI_HOB_GUID_TYPE *GuidHob;
+  GUID              SavedDataGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;
+
+  GuidHob = GetFirstGuidHob(&SavedDataGuid);
+  GuidHob++;
+
+  return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA *)GuidHob;
+}
+
+RETURN_STATUS
+EFIAPI
+ExtractGuidedSectionRegisterHandlers (
+  IN CONST  GUID                                     *SectionGuid,
+  IN        EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER  GetInfoHandler,
+  IN        EXTRACT_GUIDED_SECTION_DECODE_HANDLER    DecodeHandler
+  )
+{
+  PRE_PI_EXTRACT_GUIDED_SECTION_DATA  *SavedData;
+  UINT32                              Index;
+  //
+  // Check input parameter.
+  //
+  if (SectionGuid == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  SavedData = GetSavedData();
+
+  //
+  // Search the match registered GetInfo handler for the input guided section.
+  //
+  for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {
+    if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionGuid)) {
+      break;
+    }
+  }
+
+  //
+  // If the guided handler has been registered before, only update its handler.
+  //
+  if (Index < SavedData->NumberOfExtractHandler) {
+    SavedData->ExtractDecodeHandlerTable [Index] = DecodeHandler;
+    SavedData->ExtractGetInfoHandlerTable [Index] = GetInfoHandler;
+    return RETURN_SUCCESS;
+  }
+
+  //
+  // Check the global table is enough to contain new Handler.
+  //
+  if (SavedData->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) {
+    return RETURN_OUT_OF_RESOURCES;
+  }
+
+  //
+  // Register new Handler and guid value.
+  //
+  CopyGuid (&SavedData->ExtractHandlerGuidTable [SavedData->NumberOfExtractHandler], SectionGuid);
+  SavedData->ExtractDecodeHandlerTable [SavedData->NumberOfExtractHandler] = DecodeHandler;
+  SavedData->ExtractGetInfoHandlerTable [SavedData->NumberOfExtractHandler++] = GetInfoHandler;
+
+  return RETURN_SUCCESS;
+}
+
+UINTN
+EFIAPI
+ExtractGuidedSectionGetGuidList (
+  IN OUT  GUID  **ExtractHandlerGuidTable
+  )
+{
+  PRE_PI_EXTRACT_GUIDED_SECTION_DATA  *SavedData;
+
+  ASSERT(ExtractHandlerGuidTable != NULL);
+
+  SavedData = GetSavedData();
+
+  *ExtractHandlerGuidTable = SavedData->ExtractHandlerGuidTable;
+  return SavedData->NumberOfExtractHandler;
+}
+
+RETURN_STATUS
+EFIAPI
+ExtractGuidedSectionGetInfo (
+  IN  CONST VOID    *InputSection,
+  OUT       UINT32  *OutputBufferSize,
+  OUT       UINT32  *ScratchBufferSize,
+  OUT       UINT16  *SectionAttribute
+  )
+{
+  PRE_PI_EXTRACT_GUIDED_SECTION_DATA  *SavedData;
+  UINT32                              Index;
+  EFI_GUID                            *SectionDefinitionGuid;
+
+  if (InputSection == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  ASSERT (OutputBufferSize != NULL);
+  ASSERT (ScratchBufferSize != NULL);
+  ASSERT (SectionAttribute != NULL);
+
+  SavedData = GetSavedData();
+
+  if (IS_SECTION2 (InputSection)) {
+    SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);
+  } else {
+    SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);
+  }
+
+  //
+  // Search the match registered GetInfo handler for the input guided section.
+  //
+  for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {
+    if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
+      break;
+    }
+  }
+
+  //
+  // Not found, the input guided section is not supported.
+  //
+  if (Index == SavedData->NumberOfExtractHandler) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  //
+  // Call the match handler to getinfo for the input section data.
+  //
+  return SavedData->ExtractGetInfoHandlerTable [Index] (
+            InputSection,
+            OutputBufferSize,
+            ScratchBufferSize,
+            SectionAttribute
+          );
+}
+
+RETURN_STATUS
+EFIAPI
+ExtractGuidedSectionDecode (
+  IN  CONST VOID    *InputSection,
+  OUT       VOID    **OutputBuffer,
+  OUT       VOID    *ScratchBuffer,        OPTIONAL
+  OUT       UINT32  *AuthenticationStatus
+  )
+{
+  PRE_PI_EXTRACT_GUIDED_SECTION_DATA  *SavedData;
+  UINT32                              Index;
+  EFI_GUID                            *SectionDefinitionGuid;
+
+  if (InputSection == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  ASSERT (OutputBuffer != NULL);
+  ASSERT (AuthenticationStatus != NULL);
+
+  SavedData = GetSavedData();
+
+  if (IS_SECTION2 (InputSection)) {
+    SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);
+  } else {
+    SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);
+  }
+
+  //
+  // Search the match registered GetInfo handler for the input guided section.
+  //
+  for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {
+    if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
+      break;
+    }
+  }
+
+  //
+  // Not found, the input guided section is not supported.
+  //
+  if (Index == SavedData->NumberOfExtractHandler) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  //
+  // Call the match handler to getinfo for the input section data.
+  //
+  return SavedData->ExtractDecodeHandlerTable [Index] (
+            InputSection,
+            OutputBuffer,
+            ScratchBuffer,
+            AuthenticationStatus
+          );
+}
+
+RETURN_STATUS
+EFIAPI
+ExtractGuidedSectionLibConstructor (
+  VOID
+  )
+{
+  PRE_PI_EXTRACT_GUIDED_SECTION_DATA  SavedData;
+  GUID                                HobGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;
+
+  //
+  // Allocate global pool space to store the registered handler and its guid value.
+  //
+  SavedData.ExtractHandlerGuidTable = (GUID *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(GUID));
+  if (SavedData.ExtractHandlerGuidTable == NULL) {
+    return RETURN_OUT_OF_RESOURCES;
+  }
+
+  SavedData.ExtractDecodeHandlerTable  = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_DECODE_HANDLER));
+  if (SavedData.ExtractDecodeHandlerTable == NULL) {
+    return RETURN_OUT_OF_RESOURCES;
+  }
+
+  SavedData.ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER));
+  if (SavedData.ExtractGetInfoHandlerTable == NULL) {
+    return RETURN_OUT_OF_RESOURCES;
+  }
+
+  //
+  // the initialized number is Zero.
+  //
+  SavedData.NumberOfExtractHandler = 0;
+
+  BuildGuidDataHob(&HobGuid, &SavedData, sizeof(SavedData));
+
+  return RETURN_SUCCESS;
+}
diff --git a/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf b/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
new file mode 100644
index 000000000..e845a9e8b
--- /dev/null
+++ b/roms/edk2/EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
@@ -0,0 +1,30 @@
+#/** @file
+#
+#  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PrePiExtractGuidedSectionLib
+  FILE_GUID                      = 36F6E94E-6E8E-488E-89A4-7AD911C5AFB1
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ExtractGuidedSectionLib
+
+  CONSTRUCTOR                    = ExtractGuidedSectionLibConstructor
+
+[Sources.common]
+  PrePiExtractGuidedSectionLib.c
+
+[Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+
+[FixedPcd.common]
+  gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler
-- 
cgit