mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 11:13:53 +01:00 
			
		
		
		
	https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Header file for CD recovery PEIM
 | |
| 
 | |
| Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _PEI_CD_EXPRESS_H_
 | |
| #define _PEI_CD_EXPRESS_H_
 | |
| 
 | |
| 
 | |
| #include <PiPei.h>
 | |
| 
 | |
| #include <Ppi/BlockIo.h>
 | |
| #include <Ppi/BlockIo2.h>
 | |
| #include <Guid/RecoveryDevice.h>
 | |
| #include <Ppi/DeviceRecoveryModule.h>
 | |
| 
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/PeimEntryPoint.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/PeiServicesTablePointerLib.h>
 | |
| #include <Library/PeiServicesLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| 
 | |
| 
 | |
| #pragma pack(1)
 | |
| 
 | |
| #define PEI_CD_EXPRESS_MAX_BLOCK_IO_PPI   8
 | |
| #define PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER 16
 | |
| 
 | |
| #define PEI_CD_BLOCK_SIZE                 0x800
 | |
| #define PEI_MEMMORY_PAGE_SIZE             0x1000
 | |
| 
 | |
| //
 | |
| // Following are defined according to ISO-9660 specification
 | |
| //
 | |
| #define PEI_CD_STANDARD_ID                      "CD001"
 | |
| #define PEI_CD_EXPRESS_STANDARD_ID_SIZE         5
 | |
| 
 | |
| #define PEI_CD_EXPRESS_VOLUME_TYPE_OFFSET       0
 | |
| #define PEI_CD_EXPRESS_STANDARD_ID_OFFSET       1
 | |
| #define PEI_CD_EXPRESS_VOLUME_SPACE_OFFSET      80
 | |
| #define PEI_CD_EXPRESS_ROOT_DIR_RECORD_OFFSET   156
 | |
| 
 | |
| #define PEI_CD_EXPRESS_VOLUME_TYPE_PRIMARY      1
 | |
| #define PEI_CD_EXPRESS_VOLUME_TYPE_TERMINATOR   255
 | |
| 
 | |
| #define PEI_CD_EXPRESS_DIR_FILE_REC_FLAG_ISDIR  0x02
 | |
| 
 | |
| typedef struct {
 | |
|   UINTN                           CapsuleStartLBA;
 | |
|   UINTN                           CapsuleSize;
 | |
|   UINTN                           CapsuleBlockAlignedSize;
 | |
|   UINTN                           IndexBlock;
 | |
|   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIo;
 | |
|   EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2;
 | |
| } PEI_CD_EXPRESS_CAPSULE_DATA;
 | |
| 
 | |
| #define PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'c', 'd', 'e')
 | |
| 
 | |
| typedef struct {
 | |
| 
 | |
|   UINTN                                 Signature;
 | |
|   EFI_PEI_DEVICE_RECOVERY_MODULE_PPI    DeviceRecoveryPpi;
 | |
|   EFI_PEI_PPI_DESCRIPTOR                PpiDescriptor;
 | |
|   EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor;
 | |
|   EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor2;
 | |
| 
 | |
|   UINT8                                 *BlockBuffer;
 | |
|   UINTN                                 CapsuleCount;
 | |
|   PEI_CD_EXPRESS_CAPSULE_DATA           CapsuleData[PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER];
 | |
| 
 | |
| } PEI_CD_EXPRESS_PRIVATE_DATA;
 | |
| 
 | |
| #define PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS(a) \
 | |
|   CR (a, \
 | |
|           PEI_CD_EXPRESS_PRIVATE_DATA, \
 | |
|           DeviceRecoveryPpi, \
 | |
|           PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE \
 | |
|       )
 | |
| 
 | |
| typedef struct {
 | |
|   UINT8   Length;
 | |
|   UINT8   ExtendedAttributeRecordLength;
 | |
|   UINT32  LocationOfExtent[2];
 | |
|   UINT32  DataLength[2];
 | |
|   UINT8   DateTime[7];
 | |
|   UINT8   Flag;
 | |
|   UINT8   FileUnitSize;
 | |
|   UINT8   InterleaveGapSize;
 | |
|   UINT32  VolumeSequenceNumber;
 | |
|   UINT8   FileIDLength;
 | |
|   UINT8   FileID[1];
 | |
| } PEI_CD_EXPRESS_DIR_FILE_RECORD;
 | |
| 
 | |
| /**
 | |
|   BlockIo installation notification function.
 | |
| 
 | |
|   This function finds out all the current Block IO PPIs in the system and add them
 | |
|   into private data.
 | |
| 
 | |
|   @param  PeiServices            Indirect reference to the PEI Services Table.
 | |
|   @param  NotifyDescriptor       Address of the notification descriptor data structure.
 | |
|   @param  Ppi                    Address of the PPI that was installed.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The function completes successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| BlockIoNotifyEntry (
 | |
|   IN EFI_PEI_SERVICES           **PeiServices,
 | |
|   IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
 | |
|   IN VOID                       *Ppi
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Finds out all the current Block IO PPIs in the system and add them into private data.
 | |
| 
 | |
|   @param PrivateData                    The private data structure that contains recovery module information.
 | |
|   @param BlockIo2                       Boolean to show whether using BlockIo2 or BlockIo.
 | |
| 
 | |
|   @retval EFI_SUCCESS                   The blocks and volumes are updated successfully.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| UpdateBlocksAndVolumes (
 | |
|   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData,
 | |
|   IN     BOOLEAN                         BlockIo2
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Returns the number of DXE capsules residing on the device.
 | |
| 
 | |
|   This function searches for DXE capsules from the associated device and returns
 | |
|   the number and maximum size in bytes of the capsules discovered. Entry 1 is
 | |
|   assumed to be the highest load priority and entry N is assumed to be the lowest
 | |
|   priority.
 | |
| 
 | |
|   @param[in]  PeiServices              General-purpose services that are available
 | |
|                                        to every PEIM
 | |
|   @param[in]  This                     Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
 | |
|                                        instance.
 | |
|   @param[out] NumberRecoveryCapsules   Pointer to a caller-allocated UINTN. On
 | |
|                                        output, *NumberRecoveryCapsules contains
 | |
|                                        the number of recovery capsule images
 | |
|                                        available for retrieval from this PEIM
 | |
|                                        instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS        One or more capsules were discovered.
 | |
|   @retval EFI_DEVICE_ERROR   A device error occurred.
 | |
|   @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| GetNumberRecoveryCapsules (
 | |
|   IN EFI_PEI_SERVICES                               **PeiServices,
 | |
|   IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI             *This,
 | |
|   OUT UINTN                                         *NumberRecoveryCapsules
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Returns the size and type of the requested recovery capsule.
 | |
| 
 | |
|   This function gets the size and type of the capsule specified by CapsuleInstance.
 | |
| 
 | |
|   @param[in]  PeiServices       General-purpose services that are available to every PEIM
 | |
|   @param[in]  This              Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
 | |
|                                 instance.
 | |
|   @param[in]  CapsuleInstance   Specifies for which capsule instance to retrieve
 | |
|                                 the information.  This parameter must be between
 | |
|                                 one and the value returned by GetNumberRecoveryCapsules()
 | |
|                                 in NumberRecoveryCapsules.
 | |
|   @param[out] Size              A pointer to a caller-allocated UINTN in which
 | |
|                                 the size of the requested recovery module is
 | |
|                                 returned.
 | |
|   @param[out] CapsuleType       A pointer to a caller-allocated EFI_GUID in which
 | |
|                                 the type of the requested recovery capsule is
 | |
|                                 returned.  The semantic meaning of the value
 | |
|                                 returned is defined by the implementation.
 | |
| 
 | |
|   @retval EFI_SUCCESS        One or more capsules were discovered.
 | |
|   @retval EFI_DEVICE_ERROR   A device error occurred.
 | |
|   @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| GetRecoveryCapsuleInfo (
 | |
|   IN  EFI_PEI_SERVICES                              **PeiServices,
 | |
|   IN  EFI_PEI_DEVICE_RECOVERY_MODULE_PPI            *This,
 | |
|   IN  UINTN                                         CapsuleInstance,
 | |
|   OUT UINTN                                         *Size,
 | |
|   OUT EFI_GUID                                      *CapsuleType
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Loads a DXE capsule from some media into memory.
 | |
| 
 | |
|   This function, by whatever mechanism, retrieves a DXE capsule from some device
 | |
|   and loads it into memory. Note that the published interface is device neutral.
 | |
| 
 | |
|   @param[in]     PeiServices       General-purpose services that are available
 | |
|                                    to every PEIM
 | |
|   @param[in]     This              Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
 | |
|                                    instance.
 | |
|   @param[in]     CapsuleInstance   Specifies which capsule instance to retrieve.
 | |
|   @param[out]    Buffer            Specifies a caller-allocated buffer in which
 | |
|                                    the requested recovery capsule will be returned.
 | |
| 
 | |
|   @retval EFI_SUCCESS        The capsule was loaded correctly.
 | |
|   @retval EFI_DEVICE_ERROR   A device error occurred.
 | |
|   @retval EFI_NOT_FOUND      A requested recovery DXE capsule cannot be found.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| LoadRecoveryCapsule (
 | |
|   IN EFI_PEI_SERVICES                             **PeiServices,
 | |
|   IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI           *This,
 | |
|   IN UINTN                                        CapsuleInstance,
 | |
|   OUT VOID                                        *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Finds out the recovery capsule in the current volume.
 | |
| 
 | |
|   @param PrivateData                    The private data structure that contains recovery module information.
 | |
| 
 | |
|   @retval EFI_SUCCESS                   The recovery capsule is successfully found in the volume.
 | |
|   @retval EFI_NOT_FOUND                 The recovery capsule is not found in the volume.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| FindRecoveryCapsules (
 | |
|   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA            *PrivateData
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retrieves the recovery capsule in root directory of the current volume.
 | |
| 
 | |
|   @param PrivateData                    The private data structure that contains recovery module information.
 | |
|   @param BlockIoPpi                     The Block IO PPI used to access the volume.
 | |
|   @param BlockIo2Ppi                    The Block IO 2 PPI used to access the volume.
 | |
|   @param IndexBlockDevice               The index of current block device.
 | |
|   @param Lba                            The starting logic block address to retrieve capsule.
 | |
| 
 | |
|   @retval EFI_SUCCESS                   The recovery capsule is successfully found in the volume.
 | |
|   @retval EFI_NOT_FOUND                 The recovery capsule is not found in the volume.
 | |
|   @retval Others
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| RetrieveCapsuleFileFromRoot (
 | |
|   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA        *PrivateData,
 | |
|   IN EFI_PEI_RECOVERY_BLOCK_IO_PPI          *BlockIoPpi,
 | |
|   IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI         *BlockIo2Ppi,
 | |
|   IN UINTN                                  IndexBlockDevice,
 | |
|   IN UINT32                                 Lba
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   This function compares two ASCII strings in case sensitive/insensitive way.
 | |
| 
 | |
|   @param  Source1           The first string.
 | |
|   @param  Source2           The second string.
 | |
|   @param  Size              The maximum comparison length.
 | |
|   @param  CaseSensitive     Flag to indicate whether the comparison is case sensitive.
 | |
| 
 | |
|   @retval TRUE              The two strings are the same.
 | |
|   @retval FALSE             The two string are not the same.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| StringCmp (
 | |
|   IN UINT8      *Source1,
 | |
|   IN UINT8      *Source2,
 | |
|   IN UINTN      Size,
 | |
|   IN BOOLEAN    CaseSensitive
 | |
|   );
 | |
| 
 | |
| #pragma pack()
 | |
| 
 | |
| #endif
 |