-/**@file\r
+/** @file\r
Section Extraction Protocol implementation.\r
\r
Stream database is implemented as a linked list of section streams,\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
+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
#include "SectionExtraction.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
-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
-STATIC\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
-STATIC\r
-VOID\r
-EFIAPI\r
-NotifyGuidedExtraction (\r
- IN EFI_EVENT Event,\r
- IN VOID *RpnContext\r
- );\r
-\r
-STATIC\r
-VOID\r
-CreateGuidedExtractionRpnEvent (\r
- IN CORE_SECTION_STREAM_NODE *ParentStream,\r
- IN CORE_SECTION_CHILD_NODE *ChildNode\r
- );\r
-\r
-STATIC\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
-STATIC\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
-STATIC\r
-EFI_STATUS\r
-EFIAPI\r
-CloseSectionStream (\r
- IN EFI_SECTION_EXTRACTION_PROTOCOL *This,\r
- IN UINTN StreamHandleToClose\r
- );\r
- \r
-STATIC\r
-EFI_STATUS\r
-FindStreamNode (\r
- IN UINTN SearchHandle,\r
- OUT CORE_SECTION_STREAM_NODE **FoundStream\r
- );\r
- \r
-STATIC\r
-EFI_STATUS\r
-FindChildNode (\r
- IN CORE_SECTION_STREAM_NODE *SourceStream,\r
- IN EFI_SECTION_TYPE SearchType,\r
- IN 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
-STATIC\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
-STATIC\r
-VOID\r
-FreeChildNode (\r
- IN CORE_SECTION_CHILD_NODE *ChildNode\r
- );\r
- \r
-STATIC\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
-STATIC\r
-BOOLEAN\r
-IsValidSectionStream (\r
- IN VOID *SectionStream,\r
- IN UINTN SectionStreamLength\r
- );\r
-\r
//\r
// Module globals\r
//\r
Entry point of the section extraction code. Initializes an instance of the \r
section extraction interface and installs it on a new handle.\r
\r
- @param ImageHandle EFI_HANDLE: A handle for the image that is initializing this driver\r
- @param SystemTable EFI_SYSTEM_TABLE: A pointer to the EFI system table \r
+ @param ImageHandle A handle for the image that is initializing this driver\r
+ @param SystemTable A pointer to the EFI system table \r
\r
@retval EFI_SUCCESS Driver initialized successfully\r
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources\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\r
- @retval EFI_OUT_OF_RESOURCES memory allocation failed.\r
- @retval EFI_INVALID_PARAMETER section stream does not end concident with end of\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
-STATIC\r
EFI_STATUS\r
EFIAPI\r
OpenSectionStream (\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
+ @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
+ @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
+ @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
+ @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
+ @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
-STATIC\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 OUT UINTN *BufferSize,\r
OUT UINT32 *AuthenticationStatus\r
)\r
-\r
{\r
CORE_SECTION_STREAM_NODE *StreamNode;\r
EFI_TPL OldTpl;\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
+ @param This Indicates the calling context.\r
+ @param StreamHandleToClose Indicates the stream to close\r
\r
- @retval EFI_SUCCESS\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
+ @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
-STATIC\r
EFI_STATUS\r
EFIAPI\r
CloseSectionStream (\r
IN EFI_SECTION_EXTRACTION_PROTOCOL *This,\r
IN UINTN StreamHandleToClose\r
)\r
-\r
{\r
CORE_SECTION_STREAM_NODE *StreamNode;\r
EFI_TPL OldTpl;\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
+ @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
+ @retval TRUE The child matches\r
+ @retval FALSE The child doesn't match\r
\r
**/\r
-STATIC\r
BOOLEAN\r
ChildIsType (\r
IN CORE_SECTION_STREAM_NODE *Stream,\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
+ @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
-STATIC\r
EFI_STATUS\r
FindChildNode (\r
IN CORE_SECTION_STREAM_NODE *SourceStream,\r
OUT CORE_SECTION_STREAM_NODE **FoundStream,\r
OUT UINT32 *AuthenticationStatus\r
)\r
-\r
{\r
CORE_SECTION_CHILD_NODE *CurrentChildNode;\r
CORE_SECTION_CHILD_NODE *RecursedChildNode;\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
+ @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
+ @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
-STATIC\r
EFI_STATUS\r
CreateChildNode (\r
IN CORE_SECTION_STREAM_NODE *Stream,\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
+ @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
-STATIC\r
VOID\r
CreateGuidedExtractionRpnEvent (\r
IN CORE_SECTION_STREAM_NODE *ParentStream,\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
+ @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
-STATIC\r
+**/\r
VOID\r
EFIAPI\r
NotifyGuidedExtraction (\r
/**\r
Worker function. Destructor for child nodes.\r
\r
- @param ChildNode - Indicates the node to destroy\r
+ @param ChildNode Indicates the node to destroy\r
\r
**/\r
-STATIC\r
VOID\r
FreeChildNode (\r
IN CORE_SECTION_CHILD_NODE *ChildNode\r
)\r
-\r
{\r
ASSERT (ChildNode->Signature == CORE_SECTION_CHILD_SIGNATURE);\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
+ @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
- \r
- @retval EFI_SUCCESS - Stream was added to stream database.\r
- @retval EFI_OUT_OF_RESOURCES - memory allocation failed.\r
+ @retval EFI_SUCCESS Stream was added to stream database.\r
+ @retval EFI_OUT_OF_RESOURCES Memory allocation failed.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
OpenSectionStreamEx (\r
IN UINTN SectionStreamLength,\r
IN UINT32 AuthenticationStatus, \r
OUT UINTN *SectionStreamHandle\r
)\r
-\r
{\r
CORE_SECTION_STREAM_NODE *NewStream;\r
EFI_TPL OldTpl;\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
+ @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
+ @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
-STATIC\r
EFI_STATUS\r
FindStreamNode (\r
IN UINTN SearchHandle,\r
OUT CORE_SECTION_STREAM_NODE **FoundStream\r
)\r
-\r
{ \r
CORE_SECTION_STREAM_NODE *StreamNode;\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
+ @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
- @return if a stream is valid.\r
**/\r
-STATIC\r
BOOLEAN\r
IsValidSectionStream (\r
IN VOID *SectionStream,\r
IN UINTN SectionStreamLength\r
)\r
-\r
{\r
UINTN TotalLength;\r
UINTN SectionLength;\r
/**\r
Create a protocol notification event and return it.\r
\r
- @param ProtocolGuid - Protocol to register notification event on.\r
-\r
- @param NotifyTpl - Maximum TPL to signal the NotifyFunction.\r
-\r
- @param NotifyFuncition - EFI notification routine.\r
-\r
- @param NotifyContext - Context passed into Event when it is created.\r
-\r
- @param Registration - Registration key returned from RegisterProtocolNotify().\r
-\r
- @param SignalFlag - Boolean value to decide whether kick the event after register or not.\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
+ @return The EFI_EVENT that has been registered to be signaled when a ProtocolGuid\r
is added to the system.\r
\r
**/\r
-/**@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
#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