52 IN CONST CHAR16 *FileName
56 VOID *DecompressedImageBuffer;
64 UINT32 DestinationSize;
65 UINT32 InitializationSize;
68 EFI_HANDLE ImageHandle;
69 PCI_DATA_STRUCTURE *Pcir;
72 EFI_PCI_EXPANSION_ROM_HEADER *EfiRomHeader;
73 CHAR16 RomFileName[32];
76 Status = EFI_NOT_FOUND;
77 RomBarOffset = (UINTN)RomBar;
81 EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *)(UINTN)RomBarOffset;
83 if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {
84 return EFI_VOLUME_CORRUPTED;
91 if ( (EfiRomHeader->PcirOffset == 0)
92 || ((EfiRomHeader->PcirOffset & 3) != 0)
93 || (RomBarOffset - (UINTN)RomBar + EfiRomHeader->PcirOffset + sizeof (PCI_DATA_STRUCTURE) > RomSize))
98 Pcir = (PCI_DATA_STRUCTURE *)(UINTN)(RomBarOffset + EfiRomHeader->PcirOffset);
103 if (Pcir->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {
107 ImageSize = Pcir->ImageLength * 512;
109 if (RomBarOffset - (UINTN)RomBar + ImageSize > RomSize) {
113 if ( (Pcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE)
114 && (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE)
115 && ( (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER)
116 || (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER)))
118 ImageOffset = EfiRomHeader->EfiImageHeaderOffset;
119 InitializationSize = EfiRomHeader->InitializationSize * 512;
121 if ((InitializationSize <= ImageSize) && (ImageOffset < InitializationSize)) {
122 ImageBuffer = (VOID *)(UINTN)(RomBarOffset + ImageOffset);
123 ImageLength = InitializationSize - ImageOffset;
124 DecompressedImageBuffer = NULL;
126 if (EfiRomHeader->CompressionType == EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED) {
127 Status =
gBS->LocateProtocol (
128 &gEfiDecompressProtocolGuid,
133 if (!EFI_ERROR (Status)) {
142 if (!EFI_ERROR (Status)) {
143 DecompressedImageBuffer = AllocateZeroPool (DestinationSize);
144 if (ImageBuffer != NULL) {
145 Scratch = AllocateZeroPool (ScratchSize);
146 if (Scratch != NULL) {
151 DecompressedImageBuffer,
157 if (!EFI_ERROR (Status)) {
159 ImageBuffer = DecompressedImageBuffer;
160 ImageLength = DestinationSize;
171 UnicodeSPrint (RomFileName,
sizeof (RomFileName), L
"%s[%d]", FileName, ImageIndex);
172 FilePath = FileDevicePath (NULL, RomFileName);
173 Status =
gBS->LoadImage (
182 if (!EFI_ERROR (Status)) {
183 gBS->StartImage (ImageHandle, NULL, NULL);
184 }
else if (Status == EFI_SECURITY_VIOLATION) {
185 gBS->UnloadImage (ImageHandle);
189 if (DecompressedImageBuffer != NULL) {
190 FreePool (DecompressedImageBuffer);
195 RomBarOffset = RomBarOffset + ImageSize;
197 }
while ((Pcir->Indicator & 0x80) == 0x00 && RomBarOffset - (UINTN)RomBar < RomSize);
209 UINTN HandleArrayCount;
210 UINTN BindingHandleCount;
211 EFI_HANDLE *HandleArray;
212 EFI_HANDLE *BindingHandleBuffer;
213 EFI_STATUS ReturnStatus;
215 EFI_PCI_IO_PROTOCOL *PciIo;
216 CHAR16 RomFileName[16];
218 ReturnStatus = EFI_LOAD_ERROR;
220 Status =
gBS->LocateHandleBuffer (
222 &gEfiPciIoProtocolGuid,
228 if (EFI_ERROR (Status)) {
229 return EFI_PROTOCOL_ERROR;
232 for (Index = 0; Index < HandleArrayCount; Index++) {
233 Status =
gBS->HandleProtocol (
235 &gEfiPciIoProtocolGuid,
239 if (!EFI_ERROR (Status) && (PciIo->RomImage != NULL) && (PciIo->RomSize > 0)) {
240 BindingHandleBuffer = NULL;
241 BindingHandleCount = 0;
248 if (BindingHandleCount == 0) {
250 UnicodeSPrint (RomFileName,
sizeof (RomFileName), L
"Handle%X", HandleIndex);
251 Status =
ReloadPciRom (PciIo->RomImage, (UINTN)PciIo->RomSize, RomFileName);
252 if (EFI_ERROR (ReturnStatus)) {
253 ReturnStatus = Status;
257 if (BindingHandleBuffer != NULL) {
258 FreePool (BindingHandleBuffer);
263 FreePool (HandleArray);