]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/SectionExtractionDxe/SectionExtraction.h
Add doxygen style comments for section extraction module.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / SectionExtractionDxe / SectionExtraction.h
index 4ec132057fd3d93e9b5741ef8b5f211b427ab003..869744afeed81fb7a68f61b2b2cd40a202ec2811 100644 (file)
@@ -1,4 +1,4 @@
-/**@file\r
+/** @file\r
   Section Extraction Protocol implementation.\r
   \r
   Stream database is implemented as a linked list of section streams,\r
      \r
   3) A support protocol is not found, and the data is not available to be read\r
      without it.  This results in EFI_PROTOCOL_ERROR.\r
-     \r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
 \r
@@ -54,4 +54,366 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/Decompress.h>\r
 #include <Protocol/GuidedSectionExtraction.h>\r
 \r
+//\r
+// Local defines and typedefs\r
+//\r
+#define CORE_SECTION_CHILD_SIGNATURE  EFI_SIGNATURE_32('S','X','C','S')\r
+#define CHILD_SECTION_NODE_FROM_LINK(Node) \\r
+  CR (Node, CORE_SECTION_CHILD_NODE, Link, CORE_SECTION_CHILD_SIGNATURE)\r
+\r
+typedef struct {\r
+  UINT32                      Signature;\r
+  LIST_ENTRY                  Link;\r
+  UINT32                      Type;\r
+  UINT32                      Size;\r
+  //\r
+  // StreamBase + OffsetInStream == pointer to section header in stream.  The\r
+  // stream base is always known when walking the sections within.\r
+  //\r
+  UINT32                      OffsetInStream;\r
+  //\r
+  // Then EncapsulatedStreamHandle below is always 0 if the section is NOT an\r
+  // encapsulating section.  Otherwise, it contains the stream handle\r
+  // of the encapsulated stream.  This handle is ALWAYS produced any time an\r
+  // encapsulating child is encountered, irrespective of whether the\r
+  // encapsulated stream is processed further.\r
+  //\r
+  UINTN                       EncapsulatedStreamHandle;\r
+  EFI_GUID                    *EncapsulationGuid;\r
+} CORE_SECTION_CHILD_NODE;\r
+\r
+#define CORE_SECTION_STREAM_SIGNATURE EFI_SIGNATURE_32('S','X','S','S')\r
+#define STREAM_NODE_FROM_LINK(Node) \\r
+  CR (Node, CORE_SECTION_STREAM_NODE, Link, CORE_SECTION_STREAM_SIGNATURE)\r
+\r
+typedef struct {\r
+  UINT32                      Signature;\r
+  LIST_ENTRY                  Link;\r
+  UINTN                       StreamHandle;\r
+  UINT8                       *StreamBuffer;\r
+  UINTN                       StreamLength;\r
+  LIST_ENTRY                  Children;\r
+  //\r
+  // Authentication status is from GUIDed encapsulations.\r
+  //\r
+  UINT32                      AuthenticationStatus;\r
+} CORE_SECTION_STREAM_NODE;\r
+\r
+#define NULL_STREAM_HANDLE    0\r
+\r
+typedef struct {\r
+  CORE_SECTION_CHILD_NODE     *ChildNode;\r
+  CORE_SECTION_STREAM_NODE    *ParentStream;\r
+  VOID                        *Registration;\r
+  EFI_EVENT                   Event;\r
+} RPN_EVENT_CONTEXT;\r
+  \r
+  \r
+/**\r
+  Create a protocol notification event and return it.\r
+\r
+  @param ProtocolGuid    Protocol to register notification event on.\r
+  @param NotifyTpl       Maximum TPL to signal the NotifyFunction.\r
+  @param NotifyFunction  EFI notification routine.\r
+  @param NotifyContext   Context passed into Event when it is created.\r
+  @param Registration    Registration key returned from RegisterProtocolNotify().\r
+  @param SignalFlag      Boolean value to decide whether kick the event after register or not.\r
+\r
+  @return The EFI_EVENT that has been registered to be signaled when a ProtocolGuid\r
+           is added to the system.\r
+\r
+**/\r
+EFI_EVENT\r
+CoreCreateProtocolNotifyEvent (\r
+  IN EFI_GUID             *ProtocolGuid,\r
+  IN EFI_TPL              NotifyTpl,\r
+  IN EFI_EVENT_NOTIFY     NotifyFunction,\r
+  IN VOID                 *NotifyContext,\r
+  OUT VOID                **Registration,\r
+  IN  BOOLEAN             SignalFlag\r
+  );\r
+\r
+//\r
+// Local prototypes\r
+//\r
+\r
+/**\r
+  Worker function.  Determine if the input stream:child matches the input type.\r
+\r
+  @param Stream                 Indicates the section stream associated with the child\r
+  @param Child                  Indicates the child to check\r
+  @param SearchType             Indicates the type of section to check against for\r
+  @param SectionDefinitionGuid  Indicates the GUID to check against if the type is\r
+                                EFI_SECTION_GUID_DEFINED\r
+\r
+  @retval TRUE                  The child matches\r
+  @retval FALSE                 The child doesn't match\r
+\r
+**/\r
+BOOLEAN\r
+ChildIsType (\r
+  IN CORE_SECTION_STREAM_NODE *Stream,\r
+  IN CORE_SECTION_CHILD_NODE  *Child,\r
+  IN EFI_SECTION_TYPE         SearchType,\r
+  IN EFI_GUID                 *SectionDefinitionGuid\r
+  );\r
+\r
+/**\r
+  RPN callback function.  Removes a stale section stream and re-initializes it\r
+  with an updated AuthenticationStatus.\r
+\r
+  @param Event               The event that fired\r
+  @param RpnContext          A pointer to the context that allows us to identify\r
+                             the relevent encapsulation.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NotifyGuidedExtraction (\r
+  IN   EFI_EVENT   Event,\r
+  IN   VOID        *RpnContext\r
+  );\r
+\r
+/**\r
+  Worker function.  Constructor for RPN event if needed to keep AuthenticationStatus\r
+  cache correct when a missing GUIDED_SECTION_EXTRACTION_PROTOCOL appears...\r
+\r
+  @param ParentStream        Indicates the parent of the ecnapsulation section (child)\r
+  @param ChildNode           Indicates the child node that is the encapsulation section.\r
+\r
+**/\r
+VOID\r
+CreateGuidedExtractionRpnEvent (\r
+  IN CORE_SECTION_STREAM_NODE       *ParentStream,\r
+  IN CORE_SECTION_CHILD_NODE        *ChildNode\r
+  );\r
+\r
+/**\r
+  SEP member function.  This function creates and returns a new section stream\r
+  handle to represent the new section stream.\r
+\r
+  @param This                 Indicates the calling context.\r
+  @param SectionStreamLength  Size in bytes of the section stream.\r
+  @param SectionStream        Buffer containing the new section stream.\r
+  @param SectionStreamHandle  A pointer to a caller allocated UINTN that on output\r
+                              contains the new section stream handle.\r
+\r
+  @retval EFI_SUCCESS           Section wase opened successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+  @retval EFI_INVALID_PARAMETER Section stream does not end concident with end of\r
+                                last section.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+OpenSectionStream (\r
+  IN     EFI_SECTION_EXTRACTION_PROTOCOL           *This,\r
+  IN     UINTN                                     SectionStreamLength,\r
+  IN     VOID                                      *SectionStream,\r
+     OUT UINTN                                     *SectionStreamHandle\r
+  );\r
+  \r
+/**\r
+  SEP member function.  Retrieves requested section from section stream.\r
+\r
+  @param This                  Pointer to SEP instance.\r
+  @param SectionStreamHandle   The section stream from which to extract the requested\r
+                               section.\r
+  @param SectionType           A pointer to the type of section to search for.\r
+  @param SectionDefinitionGuid If the section type is EFI_SECTION_GUID_DEFINED, then\r
+                               SectionDefinitionGuid indicates which of these types\r
+                               of sections to search for.\r
+  @param SectionInstance       Indicates which instance of the requested section to\r
+                               return.\r
+  @param Buffer                Double indirection to buffer.  If *Buffer is non-null on\r
+                               input, then the buffer is caller allocated.  If\r
+                               *Buffer is NULL, then the buffer is callee allocated.\r
+                               In either case, the requried buffer size is returned\r
+                               in *BufferSize.\r
+  @param BufferSize            On input, indicates the size of *Buffer if *Buffer is\r
+                               non-null on input.  On output, indicates the required\r
+                               size (allocated size if callee allocated) of *Buffer.\r
+  @param AuthenticationStatus  Indicates the authentication status of the retrieved\r
+                               section.\r
+\r
\r
+  @retval EFI_SUCCESS           Section was retrieved successfully\r
+  @retval EFI_PROTOCOL_ERROR    A GUID defined section was encountered in the section \r
+                                stream with its EFI_GUIDED_SECTION_PROCESSING_REQUIRED\r
+                                bit set, but there was no corresponding GUIDed Section \r
+                                Extraction Protocol in the handle database.  *Buffer is \r
+                                unmodified.\r
+  @retval EFI_NOT_FOUND         An error was encountered when parsing the SectionStream.\r
+                                This indicates the SectionStream  is not correctly \r
+                                formatted.\r
+  @retval EFI_NOT_FOUND         The requested section does not exist.\r
+  @retval EFI_OUT_OF_RESOURCES  The system has insufficient resources to process the \r
+                                request.\r
+  @retval EFI_INVALID_PARAMETER The SectionStreamHandle does not exist.\r
+  @retval EFI_WARN_TOO_SMALL    The size of the caller allocated input buffer is \r
+                                insufficient to contain the requested section.  The \r
+                                input buffer is filled and contents are section contents\r
+                                are truncated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSection (\r
+  IN EFI_SECTION_EXTRACTION_PROTOCOL                    *This,\r
+  IN UINTN                                              SectionStreamHandle,\r
+  IN EFI_SECTION_TYPE                                   *SectionType,\r
+  IN EFI_GUID                                           *SectionDefinitionGuid,\r
+  IN UINTN                                              SectionInstance,\r
+  IN VOID                                               **Buffer,\r
+  IN OUT UINTN                                          *BufferSize,\r
+  OUT UINT32                                            *AuthenticationStatus\r
+  );\r
+  \r
+/**\r
+  SEP member function.  Deletes an existing section stream\r
+\r
+  @param This                   Indicates the calling context.\r
+  @param StreamHandleToClose    Indicates the stream to close\r
+\r
+  @retval EFI_SUCCESS           Section stream was closed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+  @retval EFI_INVALID_PARAMETER Section stream does not end concident with end of\r
+                                last section.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CloseSectionStream (\r
+  IN  EFI_SECTION_EXTRACTION_PROTOCOL           *This,\r
+  IN  UINTN                                     StreamHandleToClose\r
+  );\r
+  \r
+/**\r
+  Worker function.  Search stream database for requested stream handle.\r
+\r
+  @param SearchHandle        Indicates which stream to look for.\r
+  @param FoundStream         Output pointer to the found stream.\r
+\r
+  @retval EFI_SUCCESS        StreamHandle was found and *FoundStream contains\r
+                             the stream node.\r
+  @retval EFI_NOT_FOUND      SearchHandle was not found in the stream database.\r
+\r
+**/\r
+EFI_STATUS\r
+FindStreamNode (\r
+  IN  UINTN                                     SearchHandle,\r
+  OUT CORE_SECTION_STREAM_NODE                  **FoundStream\r
+  );\r
+  \r
+/**\r
+  Worker function  Recursively searches / builds section stream database\r
+  looking for requested section.\r
+\r
+\r
+  @param SourceStream          Indicates the section stream in which to do the search.\r
+  @param SearchType            Indicates the type of section to search for.\r
+  @param SectionInstance       Indicates which instance of section to find.  This is\r
+                               an in/out parameter to deal with recursions.\r
+  @param SectionDefinitionGuid Guid of section definition\r
+  @param FoundChild            Output indicating the child node that is found.\r
+  @param FoundStream           Output indicating which section stream the child was\r
+                               found in.  If this stream was generated as a result of\r
+                               an encapsulation section, the streamhandle is visible\r
+                               within the SEP driver only.\r
+  @param AuthenticationStatus  Indicates the authentication status of the found section.\r
+\r
+  @retval EFI_SUCCESS          Child node was found and returned.\r
+  @retval EFI_OUT_OF_RESOURCES Memory allocation failed.\r
+  @retval EFI_NOT_FOUND        Requested child node does not exist.\r
+  @retval EFI_PROTOCOL_ERROR   A required GUIDED section extraction protocol does not\r
+                               exist\r
+\r
+**/\r
+EFI_STATUS\r
+FindChildNode (\r
+  IN     CORE_SECTION_STREAM_NODE                   *SourceStream,\r
+  IN     EFI_SECTION_TYPE                           SearchType,\r
+  IN OUT UINTN                                      *SectionInstance,\r
+  IN     EFI_GUID                                   *SectionDefinitionGuid,\r
+  OUT    CORE_SECTION_CHILD_NODE                    **FoundChild,\r
+  OUT    CORE_SECTION_STREAM_NODE                   **FoundStream,\r
+  OUT    UINT32                                     *AuthenticationStatus\r
+  );\r
+  \r
+/**\r
+  Worker function.  Constructor for new child nodes.\r
+\r
+  @param Stream                Indicates the section stream in which to add the child.\r
+  @param ChildOffset           Indicates the offset in Stream that is the beginning\r
+                               of the child section.\r
+  @param ChildNode             Indicates the Callee allocated and initialized child.\r
+\r
+  @retval EFI_SUCCESS          Child node was found and returned.\r
+  @retval EFI_OUT_OF_RESOURCES Memory allocation failed.\r
+  @retval EFI_PROTOCOL_ERROR   Encapsulation sections produce new stream handles when\r
+                               the child node is created.  If the section type is GUID\r
+                               defined, and the extraction GUID does not exist, and\r
+                               producing the stream requires the GUID, then a protocol\r
+                               error is generated and no child is produced.\r
+                               Values returned by OpenSectionStreamEx.\r
+\r
+**/\r
+EFI_STATUS\r
+CreateChildNode (\r
+  IN     CORE_SECTION_STREAM_NODE              *Stream,\r
+  IN     UINT32                                ChildOffset,\r
+     OUT CORE_SECTION_CHILD_NODE               **ChildNode\r
+  );\r
+  \r
+/**\r
+  Worker function.  Destructor for child nodes.\r
+\r
+  @param ChildNode           Indicates the node to destroy\r
+\r
+**/\r
+VOID\r
+FreeChildNode (\r
+  IN  CORE_SECTION_CHILD_NODE                   *ChildNode\r
+  );\r
+  \r
+/**\r
+  Worker function.  Constructor for section streams.\r
+\r
+  @param SectionStreamLength   Size in bytes of the section stream.\r
+  @param SectionStream         Buffer containing the new section stream.\r
+  @param AllocateBuffer        Indicates whether the stream buffer is to be copied\r
+                               or the input buffer is to be used in place.\r
+  @param AuthenticationStatus  Indicates the default authentication status for the\r
+                               new stream.\r
+  @param SectionStreamHandle   A pointer to a caller allocated section stream handle.\r
+\r
+  @retval EFI_SUCCESS           Stream was added to stream database.\r
+  @retval EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+OpenSectionStreamEx (\r
+  IN     UINTN                                     SectionStreamLength,\r
+  IN     VOID                                      *SectionStream,\r
+  IN     BOOLEAN                                   AllocateBuffer,\r
+  IN     UINT32                                    AuthenticationStatus,   \r
+     OUT UINTN                                     *SectionStreamHandle\r
+  );\r
+  \r
+/**\r
+\r
+  Check if a stream is valid.\r
+\r
+  @param SectionStream         The section stream to be checked\r
+  @param SectionStreamLength   The length of section stream\r
+\r
+  @return The validness of a stream.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidSectionStream (\r
+  IN  VOID              *SectionStream,\r
+  IN  UINTN             SectionStreamLength\r
+  );\r
+\r
 #endif  // _SECTION_EXTRACTION_H_\r