21#define MAX_CORRECTION_BLOCKS_NUM 512u
26#define EFI_UDF_DEVICE_PATH_GUID \
27 { 0xC5BD4D42, 0x1A76, 0x4996, \
28 { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \
33 EFI_DEVICE_PATH_PROTOCOL
End;
46 { MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
47 {
sizeof (VENDOR_DEVICE_PATH), 0 }
51 { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
52 {
sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
71 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
72 IN EFI_DISK_IO_PROTOCOL *DiskIo,
73 OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint,
74 OUT EFI_LBA *LastRecordedBlock
80 UDF_DESCRIPTOR_TAG *DescriptorTag;
83 UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoints;
85 UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPointPtr;
86 EFI_LBA LastAvdpBlockNum;
105 EndLBA = BlockIo->Media->LastBlock;
106 *LastRecordedBlock = EndLBA;
113 if (
BlockSize <
sizeof (UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER)) {
116 "%a: Media block size 0x%x unable to hold an AVDP.\n",
120 return EFI_UNSUPPORTED;
126 Status = DiskIo->ReadDisk (
128 BlockIo->Media->MediaId,
130 sizeof (*AnchorPoint),
133 if (EFI_ERROR (Status)) {
137 DescriptorTag = &AnchorPoint->DescriptorTag;
142 if (DescriptorTag->TagIdentifier == UdfAnchorVolumeDescriptorPointer) {
143 DEBUG ((DEBUG_INFO,
"%a: found AVDP at block %d\n", __FUNCTION__, 256));
150 Status = DiskIo->ReadDisk (
152 BlockIo->Media->MediaId,
154 sizeof (*AnchorPoint),
157 if (EFI_ERROR (Status)) {
164 if ((DescriptorTag->TagIdentifier == UdfAnchorVolumeDescriptorPointer) &&
169 "%a: found AVDP at block %Ld\n",
179 if (AvdpsCount == 0) {
180 return EFI_VOLUME_CORRUPTED;
186 Status = DiskIo->ReadDisk (
188 BlockIo->Media->MediaId,
190 sizeof (*AnchorPoint),
193 if (EFI_ERROR (Status)) {
200 if (DescriptorTag->TagIdentifier == UdfAnchorVolumeDescriptorPointer) {
214 AnchorPoints = AllocateZeroPool (
Size);
215 if (AnchorPoints == NULL) {
216 return EFI_OUT_OF_RESOURCES;
222 Status = DiskIo->ReadDisk (
224 BlockIo->Media->MediaId,
229 if (EFI_ERROR (Status)) {
233 Status = EFI_VOLUME_CORRUPTED;
239 AnchorPointPtr = (VOID *)((UINTN)AnchorPoints + Index *
BlockSize);
241 DescriptorTag = &AnchorPointPtr->DescriptorTag;
246 if (DescriptorTag->TagIdentifier == UdfAnchorVolumeDescriptorPointer) {
253 "%a: found AVDP at block %Ld\n",
259 "%a: correcting last block from %Ld to %Ld\n",
267 CopyMem (AnchorPoint, AnchorPointPtr,
sizeof (*AnchorPointPtr));
271 *LastRecordedBlock = LastAvdpBlockNum;
272 Status = EFI_SUCCESS;
278 FreePool (AnchorPoints);
295 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
296 IN EFI_DISK_IO_PROTOCOL *DiskIo
301 UINT64 EndDiskOffset;
302 CDROM_VOLUME_DESCRIPTOR VolDescriptor;
303 CDROM_VOLUME_DESCRIPTOR TerminatingVolDescriptor;
305 ZeroMem ((VOID *)&TerminatingVolDescriptor,
sizeof (CDROM_VOLUME_DESCRIPTOR));
311 BlockIo->Media->LastBlock,
312 BlockIo->Media->BlockSize
315 for (Offset = UDF_VRS_START_OFFSET; Offset < EndDiskOffset;
316 Offset += UDF_LOGICAL_SECTOR_SIZE)
322 Status = DiskIo->ReadDisk (
324 BlockIo->Media->MediaId,
326 sizeof (CDROM_VOLUME_DESCRIPTOR),
327 (VOID *)&VolDescriptor
329 if (EFI_ERROR (Status)) {
334 (VOID *)VolDescriptor.Unknown.Id,
335 (VOID *)UDF_BEA_IDENTIFIER,
336 sizeof (VolDescriptor.Unknown.Id)
343 (VOID *)VolDescriptor.Unknown.Id,
345 sizeof (VolDescriptor.Unknown.Id)
348 (VOID *)&VolDescriptor,
349 (VOID *)&TerminatingVolDescriptor,
350 sizeof (CDROM_VOLUME_DESCRIPTOR)
353 return EFI_NOT_FOUND;
360 Offset += UDF_LOGICAL_SECTOR_SIZE;
361 if (Offset >= EndDiskOffset) {
362 return EFI_NOT_FOUND;
365 Status = DiskIo->ReadDisk (
367 BlockIo->Media->MediaId,
369 sizeof (CDROM_VOLUME_DESCRIPTOR),
370 (VOID *)&VolDescriptor
372 if (EFI_ERROR (Status)) {
377 (VOID *)VolDescriptor.Unknown.Id,
378 (VOID *)UDF_NSR2_IDENTIFIER,
379 sizeof (VolDescriptor.Unknown.Id)
382 (VOID *)VolDescriptor.Unknown.Id,
383 (VOID *)UDF_NSR3_IDENTIFIER,
384 sizeof (VolDescriptor.Unknown.Id)
387 return EFI_NOT_FOUND;
393 Offset += UDF_LOGICAL_SECTOR_SIZE;
394 if (Offset >= EndDiskOffset) {
395 return EFI_NOT_FOUND;
398 Status = DiskIo->ReadDisk (
400 BlockIo->Media->MediaId,
402 sizeof (CDROM_VOLUME_DESCRIPTOR),
403 (VOID *)&VolDescriptor
405 if (EFI_ERROR (Status)) {
410 (VOID *)VolDescriptor.Unknown.Id,
411 (VOID *)UDF_TEA_IDENTIFIER,
412 sizeof (VolDescriptor.Unknown.Id)
415 return EFI_NOT_FOUND;
433 UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc
439 switch (LogicalVolDesc->DomainIdentifier.Suffix.Domain.UdfRevision) {
454 if (LogicalVolDesc->NumberOfPartitionMaps > 1) {
465 if ((LogicalVolDesc->PartitionMaps[0] != 1) ||
466 (LogicalVolDesc->PartitionMaps[1] != 6))
493 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
494 IN EFI_DISK_IO_PROTOCOL *DiskIo,
495 IN UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint,
496 IN EFI_LBA LastRecordedBlock,
497 OUT UINT64 *MainVdsStartBlock,
498 OUT UINT64 *MainVdsEndBlock
503 UDF_EXTENT_AD *ExtentAd;
505 UINT64 SeqStartBlock;
506 UINT64 GuardMainVdsStartBlock;
509 BOOLEAN StopSequence;
511 UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc;
512 UDF_DESCRIPTOR_TAG *DescriptorTag;
515 ExtentAd = &AnchorPoint->MainVolumeDescriptorSequenceExtent;
526 if ((SeqBlocksNum < 16) || ((EFI_LBA)SeqBlocksNum > LastRecordedBlock + 1)) {
527 return EFI_VOLUME_CORRUPTED;
533 SeqStartBlock = (UINT64)ExtentAd->ExtentLocation;
534 if ((SeqStartBlock > LastRecordedBlock) ||
535 (SeqStartBlock + SeqBlocksNum - 1 > LastRecordedBlock))
537 return EFI_VOLUME_CORRUPTED;
540 GuardMainVdsStartBlock = SeqStartBlock;
547 return EFI_OUT_OF_RESOURCES;
550 SeqEndBlock = SeqStartBlock + SeqBlocksNum;
551 StopSequence = FALSE;
553 Status = EFI_VOLUME_CORRUPTED;
557 for ( ; SeqStartBlock < SeqEndBlock && !StopSequence; SeqStartBlock++) {
561 Status = BlockIo->ReadBlocks (
563 BlockIo->Media->MediaId,
568 if (EFI_ERROR (Status)) {
588 switch (DescriptorTag->TagIdentifier) {
589 case UdfPrimaryVolumeDescriptor:
590 case UdfImplemenationUseVolumeDescriptor:
591 case UdfPartitionDescriptor:
592 case UdfUnallocatedSpaceDescriptor:
595 case UdfLogicalVolumeDescriptor:
602 if ((++LvdsCount > 1) ||
605 Status = EFI_UNSUPPORTED;
611 case UdfTerminatingDescriptor:
625 Status = EFI_VOLUME_CORRUPTED;
633 if (!EFI_ERROR (Status) && (LvdsCount == 1)) {
634 *MainVdsStartBlock = GuardMainVdsStartBlock;
640 *MainVdsEndBlock = LastRecordedBlock;
642 Status = EFI_SUCCESS;
674 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
675 IN EFI_DISK_IO_PROTOCOL *DiskIo,
676 OUT EFI_LBA *StartingLBA,
677 OUT EFI_LBA *EndingLBA
681 UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER AnchorPoint;
682 EFI_LBA LastRecordedBlock;
688 if (EFI_ERROR (Status)) {
701 if (EFI_ERROR (Status)) {
713 (UINT64 *)StartingLBA,
739 IN EFI_DRIVER_BINDING_PROTOCOL *This,
741 IN EFI_DISK_IO_PROTOCOL *DiskIo,
742 IN EFI_DISK_IO2_PROTOCOL *DiskIo2,
743 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
744 IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,
745 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
748 UINT32 RemainderByMediaBlockSize;
750 EFI_BLOCK_IO_MEDIA *Media;
751 EFI_PARTITION_INFO_PROTOCOL PartitionInfo;
755 BOOLEAN ChildCreated;
757 Media = BlockIo->Media;
758 ChildCreated = FALSE;
764 UDF_LOGICAL_SECTOR_SIZE,
766 &RemainderByMediaBlockSize
768 if (RemainderByMediaBlockSize != 0) {
769 return EFI_NOT_FOUND;
785 if (!EFI_ERROR (Status)) {
786 DEBUG ((DEBUG_INFO,
"PartitionDxe: El Torito standard found on handle 0x%p.\n",
Handle));
794 if (EFI_ERROR (Status)) {
795 return (ChildCreated ? EFI_SUCCESS : EFI_NOT_FOUND);
801 ZeroMem (&PartitionInfo,
sizeof (EFI_PARTITION_INFO_PROTOCOL));
802 PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
803 PartitionInfo.Type = PARTITION_TYPE_OTHER;
809 ApplePartitionInfo.
PartitionSize = EndingLBA - StartingLBA + 1;
830 if (EFI_ERROR (Status)) {
831 return (ChildCreated ? EFI_SUCCESS : Status);
#define APPLE_PARTITION_INFO_REVISION
EFI_STATUS PartitionInstallElToritoChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
DMG_SIZE_DEVICE_PATH Size
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
APPLE_EVENT_HANDLE Handle
EFI_STATUS PartitionInstallChildHandle(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ParentHandle, IN EFI_DISK_IO_PROTOCOL *ParentDiskIo, IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2, IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo, IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo, IN APPLE_PARTITION_INFO_PROTOCOL *ApplePartitionInfo, IN EFI_LBA Start, IN EFI_LBA End, IN UINT32 BlockSize, IN EFI_GUID *TypeGuid)
EFI_STATUS FindUdfFileSystem(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, OUT EFI_LBA *StartingLBA, OUT EFI_LBA *EndingLBA)
EFI_STATUS FindUdfVolumeIdentifiers(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo)
UDF_DEVICE_PATH gUdfDevicePath
BOOLEAN IsLogicalVolumeDescriptorSupported(UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc)
EFI_STATUS FindAnchorVolumeDescriptorPointer(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint, OUT EFI_LBA *LastRecordedBlock)
EFI_STATUS FindLogicalVolumeLocation(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint, IN EFI_LBA LastRecordedBlock, OUT UINT64 *MainVdsStartBlock, OUT UINT64 *MainVdsEndBlock)
EFI_STATUS PartitionInstallUdfChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
#define MAX_CORRECTION_BLOCKS_NUM
#define EFI_UDF_DEVICE_PATH_GUID
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
UINT64 EFIAPI DivU64x32Remainder(IN UINT64 Dividend, IN UINT32 Divisor, OUT UINT32 *Remainder OPTIONAL)
#define DivU64x32(x, y, z)
VENDOR_DEVICE_PATH DevicePath
EFI_DEVICE_PATH_PROTOCOL End