diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/FatPkg/FatPei/Part.c')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/FatPkg/FatPei/Part.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/FatPkg/FatPei/Part.c b/src/VBox/Devices/EFI/Firmware/FatPkg/FatPei/Part.c new file mode 100644 index 00000000..d0334660 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/FatPkg/FatPei/Part.c @@ -0,0 +1,104 @@ +/** @file + Routines supporting partition discovery and + logical device reading + +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR> + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "FatLitePeim.h" + +/** + This function finds Eltorito partitions. Main algorithm + is ported from DXE partition driver. + + @param[in] PrivateData The global memory map + @param[in] ParentBlockDevNo The parent block device + + @retval TRUE New partitions are detected and logical block devices + are added to block device array + @retval FALSE No new partitions are added + +**/ +BOOLEAN +FatFindEltoritoPartitions ( + IN PEI_FAT_PRIVATE_DATA *PrivateData, + IN UINTN ParentBlockDevNo + ); + +/** + This function finds Mbr partitions. Main algorithm + is ported from DXE partition driver. + + @param[in] PrivateData The global memory map + @param[in] ParentBlockDevNo The parent block device + + @retval TRUE New partitions are detected and logical block devices + are added to block device array + @retval FALSE No new partitions are added + +**/ +BOOLEAN +FatFindMbrPartitions ( + IN PEI_FAT_PRIVATE_DATA *PrivateData, + IN UINTN ParentBlockDevNo + ); + +/** + This function is used for finding GPT partition on block device. + As follow UEFI spec we should check protective MBR first and then + try to check both primary/backup GPT structures. + + @param[in] PrivateData The global memory map + @param[in] ParentBlockDevNo The parent block device + + @retval TRUE New partitions are detected and logical block devices + are added to block device array + @retval FALSE No new partitions are added + +**/ +BOOLEAN +FatFindGptPartitions ( + IN PEI_FAT_PRIVATE_DATA *PrivateData, + IN UINTN ParentBlockDevNo + ); + +/** + This function finds partitions (logical devices) in physical block devices. + + @param PrivateData Global memory map for accessing global variables. + +**/ +VOID +FatFindPartitions ( + IN PEI_FAT_PRIVATE_DATA *PrivateData + ) +{ + BOOLEAN Found; + UINTN Index; + + do { + Found = FALSE; + + for (Index = 0; Index < PrivateData->BlockDeviceCount; Index++) { + if (!PrivateData->BlockDevice[Index].PartitionChecked) { + if (FatFindGptPartitions (PrivateData, Index)) { + Found = TRUE; + continue; + } + + if (FatFindMbrPartitions (PrivateData, Index)) { + Found = TRUE; + continue; + } + + if (FatFindEltoritoPartitions (PrivateData, Index)) { + Found = TRUE; + continue; + } + } + } + } while (Found && PrivateData->BlockDeviceCount <= PEI_FAT_MAX_BLOCK_DEVICE); +} |