]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/PeiServicesLib/PeiServicesLib.c
MdePkg/PeiServicesLib: Add PeiServicesResetSystem2()
[mirror_edk2.git] / MdePkg / Library / PeiServicesLib / PeiServicesLib.c
index 3428addcc63bff491a10c335db9fd3ff56d45a70..d0838ed709f6e0461550a8019eb87aa13f4a6ab4 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implementation for PEI Services Library.\r
 \r
-  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
   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
@@ -357,16 +357,16 @@ PeiServicesInstallPeiMemory (
 }\r
 \r
 /**\r
-  This service enables PEIMs to allocate memory after the permanent memory has been\r
-   installed by a PEIM.\r
+  This service enables PEIMs to allocate memory.\r
 \r
   @param  MemoryType            Type of memory to allocate.\r
   @param  Pages                 The number of pages to allocate.\r
   @param  Memory                Pointer of memory allocated.\r
 \r
   @retval EFI_SUCCESS           The memory range was successfully allocated.\r
-  @retval EFI_INVALID_PARAMETER Type is not equal to AllocateAnyPages.\r
-  @retval EFI_NOT_AVAILABLE_YET Called with permanent memory not available.\r
+  @retval EFI_INVALID_PARAMETER Type is not equal to EfiLoaderCode, EfiLoaderData, EfiRuntimeServicesCode,\r
+                                EfiRuntimeServicesData, EfiBootServicesCode, EfiBootServicesData,\r
+                                EfiACPIReclaimMemory, EfiReservedMemoryType, or EfiACPIMemoryNVS.\r
   @retval EFI_OUT_OF_RESOURCES  The pages could not be allocated.\r
 \r
 **/\r
@@ -384,6 +384,31 @@ PeiServicesAllocatePages (
   return (*PeiServices)->AllocatePages (PeiServices, MemoryType, Pages, Memory);\r
 }\r
 \r
+/**\r
+  This service enables PEIMs to free memory.\r
+\r
+  @param Memory                 Memory to be freed.\r
+  @param Pages                  The number of pages to free.\r
+\r
+  @retval EFI_SUCCESS           The requested pages were freed.\r
+  @retval EFI_INVALID_PARAMETER Memory is not a page-aligned address or Pages is invalid.\r
+  @retval EFI_NOT_FOUND         The requested memory pages were not allocated with\r
+                                AllocatePages().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiServicesFreePages (\r
+  IN EFI_PHYSICAL_ADDRESS       Memory,\r
+  IN UINTN                      Pages\r
+  )\r
+{\r
+  CONST EFI_PEI_SERVICES **PeiServices;\r
+\r
+  PeiServices = GetPeiServicesTablePointer ();\r
+  return (*PeiServices)->FreePages (PeiServices, Memory, Pages);\r
+}\r
+\r
 /**\r
   This service allocates memory from the Hand-Off Block (HOB) heap.\r
 \r
@@ -574,6 +599,7 @@ PeiServicesFfsGetVolumeInfo (
   the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI instance.\r
   If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI, then ASSERT().\r
   If the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI can not be installed, then ASSERT().\r
+  If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT.\r
 \r
   @param  InstallFvInfoPpi     Install FvInfo Ppi if it is TRUE. Otherwise, install FvInfo2 Ppi.\r
   @param  FvFormat             Unique identifier of the format of the memory-mapped\r
@@ -640,6 +666,16 @@ InternalPeiServicesInstallFvInfoPpi (
     CopyGuid (&FvInfoPpi->FvFormat, FvFormat);\r
   } else {\r
     CopyGuid (&FvInfoPpi->FvFormat, &gEfiFirmwareFileSystem2Guid);\r
+    //\r
+    // Since the EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed if NULL is specified for FvFormat,\r
+    // check the FileSystemGuid pointed by FvInfo against EFI_FIRMWARE_FILE_SYSTEM2_GUID to make sure\r
+    // FvInfo has the firmware file system 2 format.\r
+    // If the ASSERT really appears, FvFormat needs to be specified correctly, for example,\r
+    // EFI_FIRMWARE_FILE_SYSTEM3_GUID can be used for firmware file system 3 format, or\r
+    // ((EFI_FIRMWARE_VOLUME_HEADER *) FvInfo)->FileSystemGuid can be just used for both\r
+    // firmware file system 2 and 3 format.\r
+    //\r
+    ASSERT (CompareGuid (&(((EFI_FIRMWARE_VOLUME_HEADER *) FvInfo)->FileSystemGuid), &gEfiFirmwareFileSystem2Guid));\r
   }\r
   FvInfoPpi->FvInfo = (VOID *) FvInfo;\r
   FvInfoPpi->FvInfoSize = FvInfoSize;\r
@@ -672,6 +708,7 @@ InternalPeiServicesInstallFvInfoPpi (
   the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI instance.\r
   If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO_PPI, then ASSERT().\r
   If the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI can not be installed, then ASSERT().\r
+  If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT.\r
 \r
   @param  FvFormat             Unique identifier of the format of the memory-mapped\r
                                firmware volume.  This parameter is optional and\r
@@ -714,6 +751,7 @@ PeiServicesInstallFvInfoPpi (
   the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI instance.\r
   If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI, then ASSERT().\r
   If the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI can not be installed, then ASSERT().\r
+  If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT.\r
 \r
   @param  FvFormat             Unique identifier of the format of the memory-mapped\r
                                firmware volume.  This parameter is optional and\r
@@ -751,3 +789,29 @@ PeiServicesInstallFvInfo2Ppi (
   InternalPeiServicesInstallFvInfoPpi (FALSE, FvFormat, FvInfo, FvInfoSize, ParentFvName, ParentFileName, AuthenticationStatus);\r
 }\r
 \r
+/**\r
+  Resets the entire platform.\r
+\r
+  @param[in] ResetType      The type of reset to perform.\r
+  @param[in] ResetStatus    The status code for the reset.\r
+  @param[in] DataSize       The size, in bytes, of ResetData.\r
+  @param[in] ResetData      For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown\r
+                            the data buffer starts with a Null-terminated string, optionally\r
+                            followed by additional binary data. The string is a description\r
+                            that the caller may use to further indicate the reason for the\r
+                            system reset. ResetData is only valid if ResetStatus is something\r
+                            other than EFI_SUCCESS unless the ResetType is EfiResetPlatformSpecific\r
+                            where a minimum amount of ResetData is always required.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeiServicesResetSystem2 (\r
+  IN EFI_RESET_TYPE     ResetType,\r
+  IN EFI_STATUS         ResetStatus,\r
+  IN UINTN              DataSize,\r
+  IN VOID               *ResetData OPTIONAL\r
+  )\r
+{\r
+  (*GetPeiServicesTablePointer())->ResetSystem2 (ResetType, ResetStatus, DataSize, ResetData);\r
+}\r