]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/DxeServicesLib.h
MdePkg/DxeServicesLib: introduce AllocatePeiAccessiblePages routine
[mirror_edk2.git] / MdePkg / Include / Library / DxeServicesLib.h
index 23a8bed3f26c145993803f46bc358140edb0de83..20aee68af55821507f982de312a99a7d786bb97a 100644 (file)
@@ -1,23 +1,71 @@
 /** @file\r
   MDE DXE Services Library provides functions that simplify the development of DXE Drivers.  \r
-  These functions help access data from sections of FFS files.\r
+  These functions help access data from sections of FFS files or from file path.\r
 \r
-  Copyright (c) 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
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
+This program and the accompanying materials are licensed and made available under \r
+the terms and conditions of the BSD License that accompanies this distribution.  \r
+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
+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
-#ifndef __PI_LIB_H__\r
-#define __PI_LIB_H__\r
+#ifndef __DXE_SERVICES_LIB_H__\r
+#define __DXE_SERVICES_LIB_H__\r
 \r
-#include <Pi/PiFirmwareFile.h>\r
+/**\r
+  Searches all the available firmware volumes and returns the first matching FFS section. \r
+\r
+  This function searches all the firmware volumes for FFS files with FV file type specified by FileType\r
+  The order that the firmware volumes is searched is not deterministic. For each available FV a search \r
+  is made for FFS file of type FileType. If the FV contains more than one FFS file with the same FileType, \r
+  the FileInstance instance will be the matched FFS file. For each FFS file found a search \r
+  is made for FFS sections of type SectionType. If the FFS file contains at least SectionInstance instances \r
+  of the FFS section specified by SectionType, then the SectionInstance instance is returned in Buffer. \r
+  Buffer is allocated using AllocatePool(), and the size of the allocated buffer is returned in Size. \r
+  It is the caller's responsibility to use FreePool() to free the allocated buffer.  \r
+  See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections \r
+  are retrieved from an FFS file based on SectionType and SectionInstance.\r
+\r
+  If SectionType is EFI_SECTION_TE, and the search with an FFS file fails, \r
+  the search will be retried with a section type of EFI_SECTION_PE32.\r
+  This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Size is NULL, then ASSERT().\r
 \r
+  @param  FileType             Indicates the FV file type to search for within all available FVs.\r
+  @param  FileInstance         Indicates which file instance within all available FVs specified by FileType.\r
+                               FileInstance starts from zero.\r
+  @param  SectionType          Indicates the FFS section type to search for within the FFS file \r
+                               specified by FileType with FileInstance.\r
+  @param  SectionInstance      Indicates which section instance within the FFS file \r
+                               specified by FileType with FileInstance to retrieve. SectionInstance starts from zero.\r
+  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.\r
+                               Is it the caller's responsibility to free this buffer using FreePool().\r
+  @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
+\r
+  @retval  EFI_SUCCESS          The specified FFS section was returned.\r
+  @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
+                                contains the matching FFS section does not allow reads.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSectionFromAnyFvByFileType  (\r
+  IN  EFI_FV_FILETYPE               FileType,\r
+  IN  UINTN                         FileInstance,\r
+  IN  EFI_SECTION_TYPE              SectionType,\r
+  IN  UINTN                         SectionInstance,\r
+  OUT VOID                          **Buffer,\r
+  OUT UINTN                         *Size\r
+  );\r
 \r
 /**\r
   Searches all the available firmware volumes and returns the first matching FFS section. \r
   If Size is NULL, then ASSERT().\r
 \r
 \r
-  @param  NameGuid             A pointer to to the FFS filename GUID to search for within \r
-                               any of the firmware volumes in the platform. \r
-  @param  SectionType          Indicates the FFS section type to search for within the FFS file specified by NameGuid.\r
-  @param  SectionInstance      Indicates which section instance within the FFS file specified by NameGuid to retrieve.\r
-  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.  \r
-                               It is the caller's responsibility to free this buffer using FreePool().\r
+  @param  NameGuid             A pointer to to the FFS filename GUID to search for  \r
+                               within any of the firmware volumes in the platform. \r
+  @param  SectionType          Indicates the FFS section type to search for within \r
+                               the FFS file specified by NameGuid.\r
+  @param  SectionInstance      Indicates which section instance within the FFS file \r
+                               specified by NameGuid to retrieve.\r
+  @param  Buffer               On output, a pointer to a callee-allocated buffer \r
+                               containing the FFS file section that was found.  \r
+                               It is the caller's responsibility to free this \r
+                               buffer using FreePool().\r
   @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
 \r
   @retval  EFI_SUCCESS          The specified FFS section was returned.\r
   @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
-  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
-  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
-  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
-                                contains the matching FFS section does not allow reads.\r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve \r
+                                the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a \r
+                                device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the \r
+                                firmware volume that contains the matching FFS \r
+                                section does not allow reads.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -86,21 +141,29 @@ GetSectionFromAnyFv  (
   If Buffer is NULL, then ASSERT().\r
   If Size is NULL, then ASSERT().\r
 \r
-  @param  NameGuid             A pointer to to the FFS filename GUID to search for within \r
-                               the firmware volumes that the currently executing module was loaded from.\r
-  @param  SectionType          Indicates the FFS section type to search for within the FFS file specified by NameGuid.\r
-  @param  SectionInstance      Indicates which section instance within the FFS file specified by NameGuid to retrieve.\r
-  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.  \r
-                               It is the caller's responsibility to free this buffer using FreePool().\r
+  @param  NameGuid             A pointer to to the FFS filename GUID to search for  \r
+                               within the firmware volumes that the currently \r
+                               executing module was loaded from.\r
+  @param  SectionType          Indicates the FFS section type to search for within \r
+                               the FFS file specified by NameGuid.\r
+  @param  SectionInstance      Indicates which section instance within the FFS \r
+                               file specified by NameGuid to retrieve.\r
+  @param  Buffer               On output, a pointer to a callee allocated buffer \r
+                               containing the FFS file section that was found.  \r
+                               It is the caller's responsibility to free this buffer \r
+                               using FreePool().\r
   @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
 \r
 \r
   @retval  EFI_SUCCESS          The specified FFS section was returned.\r
   @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
-  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
-  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
-  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
-                                contains the matching FFS section does not allow reads.  \r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve \r
+                                the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a \r
+                                device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the \r
+                                firmware volume that contains the matching FFS \r
+                                section does not allow reads.  \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -132,20 +195,27 @@ GetSectionFromFv (
   If Size is NULL, then ASSERT().\r
 \r
 \r
-  @param  SectionType          Indicates the FFS section type to search for within the FFS file \r
-                               that the currently executing module was loaded from.\r
-  @param  SectionInstance      Indicates which section instance to retrieve within the FFS file \r
-                               that the currently executing module was loaded from.\r
-  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.  \r
-                               It is the caller's responsibility to free this buffer using FreePool().\r
+  @param  SectionType          Indicates the FFS section type to search for within  \r
+                               the FFS file that the currently executing module \r
+                               was loaded from.\r
+  @param  SectionInstance      Indicates which section instance to retrieve within \r
+                               the FFS file that the currently executing module \r
+                               was loaded from.\r
+  @param  Buffer               On output, a pointer to a callee allocated buffer \r
+                               containing the FFS file section that was found.  \r
+                               It is the caller's responsibility to free this buffer \r
+                               using FreePool().\r
   @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
 \r
   @retval  EFI_SUCCESS          The specified FFS section was returned.\r
   @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
-  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
-  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
-  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
-                                contains the matching FFS section does not allow reads.  \r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve \r
+                                the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a \r
+                                device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the \r
+                                firmware volume that contains the matching FFS \r
+                                section does not allow reads.  \r
   \r
 **/\r
 EFI_STATUS\r
@@ -157,5 +227,104 @@ GetSectionFromFfs (
   OUT UINTN                         *Size\r
   );\r
 \r
-#endif\r
 \r
+/**\r
+  Get the image file buffer data and buffer size by its device path. \r
+  \r
+  Access the file either from a firmware volume, from a file system interface, \r
+  or from the load file interface.\r
+  \r
+  Allocate memory to store the found image. The caller is responsible to free memory.\r
+\r
+  If FilePath is NULL, then NULL is returned.\r
+  If FileSize is NULL, then NULL is returned.\r
+  If AuthenticationStatus is NULL, then NULL is returned.\r
+\r
+  @param[in]       BootPolicy           The policy for Open Image File.If TRUE, \r
+                                        indicates that the request originates from \r
+                                        the boot manager, and that the boot manager is\r
+                                        attempting to load FilePath as a boot selection. \r
+                                        If FALSE, then FilePath must match an exact \r
+                                        file to be loaded.\r
+  @param[in]       FilePath             Pointer to the device path of the file that is abstracted to\r
+                                        the file buffer.\r
+  @param[out]      FileSize             Pointer to the size of the abstracted file buffer.\r
+  @param[out]      AuthenticationStatus Pointer to the authentication status.\r
+\r
+  @retval NULL   FilePath is NULL, or FileSize is NULL, or AuthenticationStatus is NULL, or the file can't be found.\r
+  @retval other  The abstracted file buffer. The caller is responsible to free memory.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFileBufferByFilePath (\r
+  IN BOOLEAN                           BootPolicy,\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL    *FilePath,\r
+  OUT      UINTN                       *FileSize,\r
+  OUT UINT32                           *AuthenticationStatus\r
+  );\r
+\r
+/**\r
+  Searches all the available firmware volumes and returns the file device path of first matching\r
+  FFS section.\r
+\r
+  This function searches all the firmware volumes for FFS files with an FFS filename specified by NameGuid.\r
+  The order that the firmware volumes is searched is not deterministic. For each FFS file found a search\r
+  is made for FFS sections of type SectionType.\r
+\r
+  If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,\r
+  the search will be retried with a section type of EFI_SECTION_PE32.\r
+  This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+  If NameGuid is NULL, then ASSERT().\r
+\r
+   @param  NameGuid             A pointer to to the FFS filename GUID to search for\r
+                                within any of the firmware volumes in the platform.\r
+   @param  SectionType          Indicates the FFS section type to search for within\r
+                                the FFS file specified by NameGuid.\r
+   @param  SectionInstance      Indicates which section instance within the FFS file\r
+                                specified by NameGuid to retrieve.\r
+   @param  FvFileDevicePath     Device path for the target FFS\r
+                                file.\r
+\r
+   @retval  EFI_SUCCESS           The specified file device path of FFS section was returned.\r
+   @retval  EFI_NOT_FOUND         The specified file device path of FFS section could not be found.\r
+   @retval  EFI_DEVICE_ERROR      The FFS section could not be retrieves due to a\r
+                                  device error.\r
+   @retval  EFI_ACCESS_DENIED     The FFS section could not be retrieves because the\r
+                                  firmware volume that contains the matching FFS section does not\r
+                                  allow reads.\r
+   @retval  EFI_INVALID_PARAMETER FvFileDevicePath is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetFileDevicePathFromAnyFv (\r
+  IN CONST  EFI_GUID                  *NameGuid,\r
+  IN        EFI_SECTION_TYPE          SectionType,\r
+  IN        UINTN                     SectionInstance,\r
+  OUT       EFI_DEVICE_PATH_PROTOCOL  **FvFileDevicePath\r
+  );\r
+\r
+/**\r
+  Allocates one or more 4KB pages of a given type from a memory region that is\r
+  accessible to PEI.\r
+\r
+  Allocates the number of 4KB pages of type 'MemoryType' and returns a\r
+  pointer to the allocated buffer.  The buffer returned is aligned on a 4KB\r
+  boundary.  If Pages is 0, then NULL is returned.  If there is not enough\r
+  memory remaining to satisfy the request, then NULL is returned.\r
+\r
+  @param[in]  MemoryType            The memory type to allocate\r
+  @param[in]  Pages                 The number of 4 KB pages to allocate.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocatePeiAccessiblePages (\r
+  IN EFI_MEMORY_TYPE  MemoryType,\r
+  IN UINTN            Pages\r
+  );\r
+\r
+#endif\r