/** @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 |