31 IN EFI_DRIVER_BINDING_PROTOCOL *This,
33 IN EFI_DISK_IO_PROTOCOL *DiskIo,
34 IN EFI_DISK_IO2_PROTOCOL *DiskIo2,
35 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
36 IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,
37 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
41 UINT64 VolDescriptorOffset;
43 EFI_BLOCK_IO_MEDIA *Media;
44 CDROM_VOLUME_DESCRIPTOR *VolDescriptor;
45 ELTORITO_CATALOG *Catalog;
51 CDROM_DEVICE_PATH CdDev;
56 EFI_PARTITION_INFO_PROTOCOL PartitionInfo;
59 Found = EFI_NOT_FOUND;
60 Media = BlockIo->Media;
71 if (((SIZE_2KB % Media->BlockSize) != 0) || (Media->BlockSize > SIZE_2KB)) {
75 VolDescriptor = AllocatePool ((UINTN)SIZE_2KB);
77 if (VolDescriptor == NULL) {
81 Catalog = (ELTORITO_CATALOG *)VolDescriptor;
87 for (VolDescriptorOffset = SIZE_32KB;
88 VolDescriptorOffset <=
MultU64x32 (Media->LastBlock, Media->BlockSize);
89 VolDescriptorOffset += SIZE_2KB)
91 Status = DiskIo->ReadDisk (
98 if (EFI_ERROR (Status)) {
106 if ((VolDescriptor->Unknown.Type == CDVOL_TYPE_END) ||
107 (
CompareMem (VolDescriptor->Unknown.Id, CDVOL_ID, sizeof (VolDescriptor->Unknown.Id)) != 0)
120 if (VolDescriptor->PrimaryVolume.Type == CDVOL_TYPE_CODED) {
121 VolSpaceSize = VolDescriptor->PrimaryVolume.VolSpaceSize[0];
127 if (
CompareMem (VolDescriptor->BootRecordVolume.SystemId, CDVOL_ELTORITO_ID, sizeof (CDVOL_ELTORITO_ID) - 1) != 0) {
135 Lba2KB =
UNPACK_INT32 (VolDescriptor->BootRecordVolume.EltCatalog);
137 if (Lba2KB * (SIZE_2KB / Media->BlockSize) > Media->LastBlock) {
141 Status = DiskIo->ReadDisk (
148 if (EFI_ERROR (Status)) {
149 DEBUG ((EFI_D_ERROR,
"EltCheckDevice: error reading catalog %r\n", Status));
157 if ((Catalog->Catalog.Indicator != ELTORITO_ID_CATALOG) || (Catalog->Catalog.Id55AA != 0xAA55)) {
158 DEBUG ((EFI_D_ERROR,
"EltCheckBootCatalog: El Torito boot catalog header IDs not correct\n"));
163 CheckBuffer = (UINT16 *)Catalog;
164 for (Index = 0; Index <
sizeof (ELTORITO_CATALOG) /
sizeof (UINT16); Index += 1) {
165 Check += CheckBuffer[Index];
168 if ((Check & 0xFFFF) != 0) {
169 DEBUG ((EFI_D_ERROR,
"EltCheckBootCatalog: El Torito boot catalog header checksum failed\n"));
173 MaxIndex = Media->BlockSize /
sizeof (ELTORITO_CATALOG);
174 for (Index = 1, BootEntry = 1; Index < MaxIndex; Index += 1) {
183 if ((Catalog->Boot.Indicator != ELTORITO_ID_SECTION_BOOTABLE) || (Catalog->Boot.Lba == 0)) {
188 SectorCount = Catalog->Boot.SectorCount;
190 switch (Catalog->Boot.MediaType) {
191 case ELTORITO_NO_EMULATION:
192 SubBlockSize = Media->BlockSize;
195 case ELTORITO_HARD_DISK:
198 case ELTORITO_12_DISKETTE:
199 SectorCount = 0x50 * 0x02 * 0x0F;
202 case ELTORITO_14_DISKETTE:
203 SectorCount = 0x50 * 0x02 * 0x12;
206 case ELTORITO_28_DISKETTE:
207 SectorCount = 0x50 * 0x02 * 0x24;
211 DEBUG ((EFI_D_INIT,
"EltCheckDevice: unsupported El Torito boot media type %x\n", Catalog->Boot.MediaType));
213 SubBlockSize = Media->BlockSize;
220 CdDev.Header.Type = MEDIA_DEVICE_PATH;
221 CdDev.Header.SubType = MEDIA_CDROM_DP;
222 SetDevicePathNodeLength (&CdDev.Header, sizeof (CdDev));
231 CdDev.BootEntry = (UINT32)BootEntry;
233 CdDev.PartitionStart = Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize);
234 if (SectorCount < 2) {
238 if (VolSpaceSize * (SIZE_2KB / Media->BlockSize) > (Media->LastBlock + 1)) {
239 CdDev.PartitionSize = (UINT32)(Media->LastBlock - Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize) + 1);
241 CdDev.PartitionSize = (UINT32)(VolSpaceSize - Catalog->Boot.Lba) * (SIZE_2KB / Media->BlockSize);
246 SectorCount * (SIZE_2KB / Media->BlockSize),
248 ) + Media->BlockSize - 1,
253 ZeroMem (&PartitionInfo,
sizeof (EFI_PARTITION_INFO_PROTOCOL));
254 PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
255 PartitionInfo.Type = PARTITION_TYPE_OTHER;
271 (EFI_DEVICE_PATH_PROTOCOL *)&CdDev,
274 Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize),
275 Catalog->Boot.Lba * (SIZE_2KB / Media->BlockSize) + CdDev.
PartitionSize - 1,
279 if (!EFI_ERROR (Status)) {
285 FreePool (VolDescriptor);
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)