Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/MdePkg/Library/DxeServicesLib/DxeServicesLib.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156854
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/MdePkg/Library/DxeServicesLib/DxeServicesLib.c
r85718 r99404 41 41 EFI_HANDLE 42 42 InternalImageHandleToFvHandle ( 43 EFI_HANDLE ImageHandle43 EFI_HANDLE ImageHandle 44 44 ) 45 45 { 46 EFI_STATUS 47 EFI_LOADED_IMAGE_PROTOCOL 46 EFI_STATUS Status; 47 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; 48 48 49 49 ASSERT (ImageHandle != NULL); 50 50 51 51 Status = gBS->HandleProtocol ( 52 ImageHandle,53 &gEfiLoadedImageProtocolGuid,54 (VOID **)&LoadedImage55 );52 ImageHandle, 53 &gEfiLoadedImageProtocolGuid, 54 (VOID **)&LoadedImage 55 ); 56 56 57 57 ASSERT_EFI_ERROR (Status); … … 64 64 // 65 65 return LoadedImage->DeviceHandle; 66 67 66 } 68 67 … … 112 111 EFI_STATUS 113 112 InternalGetSectionFromFv ( 114 IN EFI_HANDLE 115 IN CONST EFI_GUID 116 IN EFI_SECTION_TYPE 117 IN UINTN 118 OUT VOID 119 OUT UINTN 113 IN EFI_HANDLE FvHandle, 114 IN CONST EFI_GUID *NameGuid, 115 IN EFI_SECTION_TYPE SectionType, 116 IN UINTN SectionInstance, 117 OUT VOID **Buffer, 118 OUT UINTN *Size 120 119 ) 121 120 { 122 EFI_STATUS Status;123 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;124 UINT32 AuthenticationStatus;121 EFI_STATUS Status; 122 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; 123 UINT32 AuthenticationStatus; 125 124 126 125 ASSERT (NameGuid != NULL); … … 138 137 FvHandle, 139 138 &gEfiFirmwareVolume2ProtocolGuid, 140 (VOID **) 139 (VOID **)&Fv 141 140 ); 142 141 if (EFI_ERROR (Status)) { … … 147 146 // Read desired section content in NameGuid file 148 147 // 149 *Buffer 150 *Size 151 Status 152 153 154 155 156 157 158 159 148 *Buffer = NULL; 149 *Size = 0; 150 Status = Fv->ReadSection ( 151 Fv, 152 NameGuid, 153 SectionType, 154 SectionInstance, 155 Buffer, 156 Size, 157 &AuthenticationStatus 158 ); 160 159 161 160 if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) { … … 230 229 EFIAPI 231 230 GetSectionFromAnyFvByFileType ( 232 IN EFI_FV_FILETYPE 233 IN UINTN 234 IN EFI_SECTION_TYPE 235 IN UINTN 236 OUT VOID 237 OUT UINTN 231 IN EFI_FV_FILETYPE FileType, 232 IN UINTN FileInstance, 233 IN EFI_SECTION_TYPE SectionType, 234 IN UINTN SectionInstance, 235 OUT VOID **Buffer, 236 OUT UINTN *Size 238 237 ) 239 238 { 240 EFI_STATUS Status;241 EFI_HANDLE *HandleBuffer;242 UINTN HandleCount;243 UINTN IndexFv;244 UINTN IndexFile;245 UINTN Key;246 EFI_GUID NameGuid;247 EFI_FV_FILE_ATTRIBUTES Attributes;248 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;239 EFI_STATUS Status; 240 EFI_HANDLE *HandleBuffer; 241 UINTN HandleCount; 242 UINTN IndexFv; 243 UINTN IndexFile; 244 UINTN Key; 245 EFI_GUID NameGuid; 246 EFI_FV_FILE_ATTRIBUTES Attributes; 247 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; 249 248 250 249 ASSERT (Buffer != NULL); … … 255 254 // 256 255 HandleBuffer = NULL; 257 Status = gBS->LocateHandleBuffer (258 ByProtocol,259 &gEfiFirmwareVolume2ProtocolGuid,260 NULL,261 &HandleCount,262 &HandleBuffer263 );256 Status = gBS->LocateHandleBuffer ( 257 ByProtocol, 258 &gEfiFirmwareVolume2ProtocolGuid, 259 NULL, 260 &HandleCount, 261 &HandleBuffer 262 ); 264 263 if (EFI_ERROR (Status)) { 265 264 return Status; … … 283 282 // 284 283 IndexFile = FileInstance + 1; 285 Key = 0;284 Key = 0; 286 285 do { 287 286 Status = Fv->GetNextFile (Fv, &Key, &FileType, &NameGuid, &Attributes, Size); … … 289 288 break; 290 289 } 291 IndexFile --; 290 291 IndexFile--; 292 292 } while (IndexFile > 0); 293 293 … … 321 321 Done: 322 322 if (HandleBuffer != NULL) { 323 FreePool (HandleBuffer);323 FreePool (HandleBuffer); 324 324 } 325 325 … … 373 373 EFIAPI 374 374 GetSectionFromAnyFv ( 375 IN CONST EFI_GUID 376 IN EFI_SECTION_TYPE 377 IN UINTN 378 OUT VOID 379 OUT UINTN 375 IN CONST EFI_GUID *NameGuid, 376 IN EFI_SECTION_TYPE SectionType, 377 IN UINTN SectionInstance, 378 OUT VOID **Buffer, 379 OUT UINTN *Size 380 380 ) 381 381 { 382 EFI_STATUS 383 EFI_HANDLE 384 UINTN 385 UINTN 386 EFI_HANDLE 382 EFI_STATUS Status; 383 EFI_HANDLE *HandleBuffer; 384 UINTN HandleCount; 385 UINTN Index; 386 EFI_HANDLE FvHandle; 387 387 388 388 // … … 393 393 // 394 394 FvHandle = InternalImageHandleToFvHandle (gImageHandle); 395 Status = InternalGetSectionFromFv (396 FvHandle,397 NameGuid,398 SectionType,399 SectionInstance,400 Buffer,401 Size402 );395 Status = InternalGetSectionFromFv ( 396 FvHandle, 397 NameGuid, 398 SectionType, 399 SectionInstance, 400 Buffer, 401 Size 402 ); 403 403 if (!EFI_ERROR (Status)) { 404 404 return EFI_SUCCESS; … … 406 406 407 407 HandleBuffer = NULL; 408 Status = gBS->LocateHandleBuffer (409 ByProtocol,410 &gEfiFirmwareVolume2ProtocolGuid,411 NULL,412 &HandleCount,413 &HandleBuffer414 );408 Status = gBS->LocateHandleBuffer ( 409 ByProtocol, 410 &gEfiFirmwareVolume2ProtocolGuid, 411 NULL, 412 &HandleCount, 413 &HandleBuffer 414 ); 415 415 if (EFI_ERROR (Status)) { 416 416 goto Done; … … 435 435 } 436 436 } 437 438 437 } 439 438 … … 445 444 446 445 if (HandleBuffer != NULL) { 447 FreePool(HandleBuffer); 448 } 446 FreePool (HandleBuffer); 447 } 448 449 449 return Status; 450 451 450 } 452 451 … … 499 498 EFIAPI 500 499 GetSectionFromFv ( 501 IN CONST EFI_GUID 502 IN EFI_SECTION_TYPE 503 IN UINTN 504 OUT VOID 505 OUT UINTN 506 500 IN CONST EFI_GUID *NameGuid, 501 IN EFI_SECTION_TYPE SectionType, 502 IN UINTN SectionInstance, 503 OUT VOID **Buffer, 504 OUT UINTN *Size 505 ) 507 506 { 508 507 return InternalGetSectionFromFv ( 509 InternalImageHandleToFvHandle (gImageHandle),508 InternalImageHandleToFvHandle (gImageHandle), 510 509 NameGuid, 511 510 SectionType, … … 515 514 ); 516 515 } 517 518 516 519 517 /** … … 562 560 EFIAPI 563 561 GetSectionFromFfs ( 564 IN EFI_SECTION_TYPE 565 IN UINTN 566 OUT VOID 567 OUT UINTN 568 562 IN EFI_SECTION_TYPE SectionType, 563 IN UINTN SectionInstance, 564 OUT VOID **Buffer, 565 OUT UINTN *Size 566 ) 569 567 { 570 return InternalGetSectionFromFv (571 InternalImageHandleToFvHandle (gImageHandle),568 return InternalGetSectionFromFv ( 569 InternalImageHandleToFvHandle (gImageHandle), 572 570 &gEfiCallerIdGuid, 573 571 SectionType, … … 577 575 ); 578 576 } 579 580 577 581 578 /** … … 609 606 EFIAPI 610 607 GetFileBufferByFilePath ( 611 IN BOOLEAN 612 IN CONST EFI_DEVICE_PATH_PROTOCOL 613 OUT UINTN 614 OUT UINT32 608 IN BOOLEAN BootPolicy, 609 IN CONST EFI_DEVICE_PATH_PROTOCOL *FilePath, 610 OUT UINTN *FileSize, 611 OUT UINT32 *AuthenticationStatus 615 612 ) 616 613 { 617 EFI_DEVICE_PATH_PROTOCOL 618 EFI_DEVICE_PATH_PROTOCOL 619 EFI_DEVICE_PATH_PROTOCOL 620 EFI_HANDLE 621 EFI_GUID 622 EFI_FIRMWARE_VOLUME2_PROTOCOL 623 EFI_SECTION_TYPE 624 UINT8 625 UINTN 626 EFI_FV_FILETYPE 627 EFI_FV_FILE_ATTRIBUTES 628 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL 629 EFI_FILE_HANDLE 630 EFI_FILE_HANDLE 631 EFI_FILE_INFO 632 UINTN 633 EFI_LOAD_FILE_PROTOCOL 634 EFI_LOAD_FILE2_PROTOCOL 635 EFI_STATUS 614 EFI_DEVICE_PATH_PROTOCOL *DevicePathNode; 615 EFI_DEVICE_PATH_PROTOCOL *OrigDevicePathNode; 616 EFI_DEVICE_PATH_PROTOCOL *TempDevicePathNode; 617 EFI_HANDLE Handle; 618 EFI_GUID *FvNameGuid; 619 EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol; 620 EFI_SECTION_TYPE SectionType; 621 UINT8 *ImageBuffer; 622 UINTN ImageBufferSize; 623 EFI_FV_FILETYPE Type; 624 EFI_FV_FILE_ATTRIBUTES Attrib; 625 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume; 626 EFI_FILE_HANDLE FileHandle; 627 EFI_FILE_HANDLE LastHandle; 628 EFI_FILE_INFO *FileInfo; 629 UINTN FileInfoSize; 630 EFI_LOAD_FILE_PROTOCOL *LoadFile; 631 EFI_LOAD_FILE2_PROTOCOL *LoadFile2; 632 EFI_STATUS Status; 636 633 637 634 // 638 635 // Check input File device path. 639 636 // 640 if ( FilePath == NULL || FileSize == NULL || AuthenticationStatus == NULL) {637 if ((FilePath == NULL) || (FileSize == NULL) || (AuthenticationStatus == NULL)) { 641 638 return NULL; 642 639 } … … 645 642 // Init local variable 646 643 // 647 TempDevicePathNode = NULL;648 FvNameGuid = NULL;649 FileInfo = NULL;650 FileHandle = NULL;651 ImageBuffer = NULL;652 ImageBufferSize = 0;644 TempDevicePathNode = NULL; 645 FvNameGuid = NULL; 646 FileInfo = NULL; 647 FileHandle = NULL; 648 ImageBuffer = NULL; 649 ImageBufferSize = 0; 653 650 *AuthenticationStatus = 0; 654 651 … … 666 663 // 667 664 DevicePathNode = OrigDevicePathNode; 668 Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &DevicePathNode, &Handle);665 Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, &DevicePathNode, &Handle); 669 666 if (!EFI_ERROR (Status)) { 670 667 // 671 668 // For FwVol File system there is only a single file name that is a GUID. 672 669 // 673 FvNameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) 670 FvNameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevicePathNode); 674 671 if (FvNameGuid == NULL) { 675 672 Status = EFI_INVALID_PARAMETER; … … 678 675 // Read image from the firmware file 679 676 // 680 Status = gBS->HandleProtocol (Handle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&FwVol);677 Status = gBS->HandleProtocol (Handle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&FwVol); 681 678 if (!EFI_ERROR (Status)) { 682 679 SectionType = EFI_SECTION_PE32; 683 680 ImageBuffer = NULL; 684 Status = FwVol->ReadSection (685 FwVol,686 FvNameGuid,687 SectionType,688 0,689 (VOID **)&ImageBuffer,690 &ImageBufferSize,691 AuthenticationStatus692 );681 Status = FwVol->ReadSection ( 682 FwVol, 683 FvNameGuid, 684 SectionType, 685 0, 686 (VOID **)&ImageBuffer, 687 &ImageBufferSize, 688 AuthenticationStatus 689 ); 693 690 if (EFI_ERROR (Status)) { 694 691 // … … 699 696 *AuthenticationStatus = 0; 700 697 } 698 701 699 ImageBuffer = NULL; 702 Status = FwVol->ReadFile (703 FwVol,704 FvNameGuid,705 (VOID **)&ImageBuffer,706 &ImageBufferSize,707 &Type,708 &Attrib,709 AuthenticationStatus710 );700 Status = FwVol->ReadFile ( 701 FwVol, 702 FvNameGuid, 703 (VOID **)&ImageBuffer, 704 &ImageBufferSize, 705 &Type, 706 &Attrib, 707 AuthenticationStatus 708 ); 711 709 } 712 710 } 713 711 } 712 714 713 if (!EFI_ERROR (Status)) { 715 714 goto Finish; … … 721 720 // 722 721 DevicePathNode = OrigDevicePathNode; 723 Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &DevicePathNode, &Handle);722 Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, &DevicePathNode, &Handle); 724 723 if (!EFI_ERROR (Status)) { 725 Status = gBS->HandleProtocol (Handle, &gEfiSimpleFileSystemProtocolGuid, (VOID **)&Volume);724 Status = gBS->HandleProtocol (Handle, &gEfiSimpleFileSystemProtocolGuid, (VOID **)&Volume); 726 725 if (!EFI_ERROR (Status)) { 727 726 // … … 744 743 Status = EFI_OUT_OF_RESOURCES; 745 744 } 745 746 746 // 747 747 // Parse each MEDIA_FILEPATH_DP node. There may be more than one, since the … … 751 751 DevicePathNode = TempDevicePathNode; 752 752 while (!EFI_ERROR (Status) && !IsDevicePathEnd (DevicePathNode)) { 753 if (DevicePathType (DevicePathNode) != MEDIA_DEVICE_PATH || 754 DevicePathSubType (DevicePathNode) != MEDIA_FILEPATH_DP) { 753 if ((DevicePathType (DevicePathNode) != MEDIA_DEVICE_PATH) || 754 (DevicePathSubType (DevicePathNode) != MEDIA_FILEPATH_DP)) 755 { 755 756 Status = EFI_UNSUPPORTED; 756 757 break; … … 761 762 762 763 Status = LastHandle->Open ( 763 LastHandle,764 &FileHandle,765 ((FILEPATH_DEVICE_PATH *)DevicePathNode)->PathName,766 EFI_FILE_MODE_READ,767 0768 );764 LastHandle, 765 &FileHandle, 766 ((FILEPATH_DEVICE_PATH *)DevicePathNode)->PathName, 767 EFI_FILE_MODE_READ, 768 0 769 ); 769 770 770 771 // … … 781 782 // figure out how big the file is. 782 783 // 783 FileInfo = NULL;784 FileInfo = NULL; 784 785 FileInfoSize = 0; 785 Status = FileHandle->GetInfo (786 FileHandle,787 &gEfiFileInfoGuid,788 &FileInfoSize,789 FileInfo790 );786 Status = FileHandle->GetInfo ( 787 FileHandle, 788 &gEfiFileInfoGuid, 789 &FileInfoSize, 790 FileInfo 791 ); 791 792 792 793 if (Status == EFI_BUFFER_TOO_SMALL) { … … 796 797 } else { 797 798 Status = FileHandle->GetInfo ( 798 FileHandle,799 &gEfiFileInfoGuid,800 &FileInfoSize,801 FileInfo802 );799 FileHandle, 800 &gEfiFileInfoGuid, 801 &FileInfoSize, 802 FileInfo 803 ); 803 804 } 804 805 } … … 822 823 } 823 824 } 825 824 826 // 825 827 // Close the file and Free FileInfo and TempDevicePathNode since we are done … … 828 830 FreePool (FileInfo); 829 831 } 832 830 833 if (FileHandle != NULL) { 831 834 FileHandle->Close (FileHandle); 832 835 } 836 833 837 if (TempDevicePathNode != NULL) { 834 838 FreePool (TempDevicePathNode); … … 836 840 } 837 841 } 842 838 843 if (!EFI_ERROR (Status)) { 839 844 goto Finish; … … 846 851 if (!BootPolicy) { 847 852 DevicePathNode = OrigDevicePathNode; 848 Status = gBS->LocateDevicePath (&gEfiLoadFile2ProtocolGuid, &DevicePathNode, &Handle);853 Status = gBS->LocateDevicePath (&gEfiLoadFile2ProtocolGuid, &DevicePathNode, &Handle); 849 854 if (!EFI_ERROR (Status)) { 850 Status = gBS->HandleProtocol (Handle, &gEfiLoadFile2ProtocolGuid, (VOID **)&LoadFile2);855 Status = gBS->HandleProtocol (Handle, &gEfiLoadFile2ProtocolGuid, (VOID **)&LoadFile2); 851 856 if (!EFI_ERROR (Status)) { 852 857 // … … 855 860 ImageBufferSize = 0; 856 861 ImageBuffer = NULL; 857 Status = LoadFile2->LoadFile (858 LoadFile2,859 DevicePathNode,860 FALSE,861 &ImageBufferSize,862 ImageBuffer863 );862 Status = LoadFile2->LoadFile ( 863 LoadFile2, 864 DevicePathNode, 865 FALSE, 866 &ImageBufferSize, 867 ImageBuffer 868 ); 864 869 if (Status == EFI_BUFFER_TOO_SMALL) { 865 870 ImageBuffer = AllocatePool (ImageBufferSize); … … 868 873 } else { 869 874 Status = LoadFile2->LoadFile ( 870 LoadFile2,871 DevicePathNode,872 FALSE,873 &ImageBufferSize,874 ImageBuffer875 );875 LoadFile2, 876 DevicePathNode, 877 FALSE, 878 &ImageBufferSize, 879 ImageBuffer 880 ); 876 881 } 877 882 } 878 883 } 884 879 885 if (!EFI_ERROR (Status)) { 880 886 goto Finish; … … 887 893 // 888 894 DevicePathNode = OrigDevicePathNode; 889 Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &DevicePathNode, &Handle);895 Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &DevicePathNode, &Handle); 890 896 if (!EFI_ERROR (Status)) { 891 Status = gBS->HandleProtocol (Handle, &gEfiLoadFileProtocolGuid, (VOID **)&LoadFile);897 Status = gBS->HandleProtocol (Handle, &gEfiLoadFileProtocolGuid, (VOID **)&LoadFile); 892 898 if (!EFI_ERROR (Status)) { 893 899 // … … 896 902 ImageBufferSize = 0; 897 903 ImageBuffer = NULL; 898 Status = LoadFile->LoadFile (899 LoadFile,900 DevicePathNode,901 BootPolicy,902 &ImageBufferSize,903 ImageBuffer904 );904 Status = LoadFile->LoadFile ( 905 LoadFile, 906 DevicePathNode, 907 BootPolicy, 908 &ImageBufferSize, 909 ImageBuffer 910 ); 905 911 if (Status == EFI_BUFFER_TOO_SMALL) { 906 912 ImageBuffer = AllocatePool (ImageBufferSize); … … 927 933 ImageBuffer = NULL; 928 934 } 935 929 936 *FileSize = 0; 930 937 } else { … … 979 986 ) 980 987 { 981 EFI_STATUS Status;982 EFI_HANDLE *HandleBuffer;983 UINTN HandleCount;984 UINTN Index;985 EFI_HANDLE FvHandle;986 EFI_DEVICE_PATH_PROTOCOL *FvDevicePath;987 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *TempFvFileDevicePath;988 VOID *Buffer;989 UINTN Size;988 EFI_STATUS Status; 989 EFI_HANDLE *HandleBuffer; 990 UINTN HandleCount; 991 UINTN Index; 992 EFI_HANDLE FvHandle; 993 EFI_DEVICE_PATH_PROTOCOL *FvDevicePath; 994 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *TempFvFileDevicePath; 995 VOID *Buffer; 996 UINTN Size; 990 997 991 998 if (FvFileDevicePath == NULL) { … … 1006 1013 // 1007 1014 FvHandle = InternalImageHandleToFvHandle (gImageHandle); 1008 Status = InternalGetSectionFromFv (1009 FvHandle,1010 NameGuid,1011 SectionType,1012 SectionInstance,1013 &Buffer,1014 &Size1015 );1015 Status = InternalGetSectionFromFv ( 1016 FvHandle, 1017 NameGuid, 1018 SectionType, 1019 SectionInstance, 1020 &Buffer, 1021 &Size 1022 ); 1016 1023 if (!EFI_ERROR (Status)) { 1017 1024 goto Done; … … 1071 1078 return EFI_OUT_OF_RESOURCES; 1072 1079 } 1073 EfiInitializeFwVolDevicepathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH*)TempFvFileDevicePath, NameGuid); 1080 1081 EfiInitializeFwVolDevicepathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)TempFvFileDevicePath, NameGuid); 1074 1082 SetDevicePathEndNode (NextDevicePathNode (TempFvFileDevicePath)); 1075 1083 *FvFileDevicePath = AppendDevicePath (
Note:
See TracChangeset
for help on using the changeset viewer.