\r
EFI_STATUS\r
BdsFileSystemLoadImage (\r
- IN EFI_DEVICE_PATH *DevicePath,\r
- IN EFI_HANDLE Handle,\r
- IN EFI_DEVICE_PATH *RemainingDevicePath,\r
+ IN OUT EFI_DEVICE_PATH **DevicePath,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH *RemainingDevicePath,\r
IN EFI_ALLOCATE_TYPE Type,\r
- IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *Image,\r
OUT UINTN *ImageSize\r
)\r
{\r
- FILEPATH_DEVICE_PATH* FilePathDevicePath;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FsProtocol;\r
- EFI_FILE_PROTOCOL *Fs;\r
- EFI_STATUS Status;\r
- EFI_FILE_INFO *FileInfo;\r
- EFI_FILE_PROTOCOL *File;\r
- UINTN Size;\r
+ EFI_STATUS Status;\r
+ FILEPATH_DEVICE_PATH *FilePathDevicePath;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FsProtocol;\r
+ EFI_FILE_PROTOCOL *Fs;\r
+ EFI_FILE_INFO *FileInfo;\r
+ EFI_FILE_PROTOCOL *File;\r
+ UINTN Size;\r
\r
ASSERT (IS_DEVICE_PATH_NODE (RemainingDevicePath, MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP));\r
\r
FilePathDevicePath = (FILEPATH_DEVICE_PATH*)RemainingDevicePath;\r
\r
- Status = gBS->HandleProtocol (Handle, &gEfiSimpleFileSystemProtocolGuid, (VOID **)&FsProtocol);\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiSimpleFileSystemProtocolGuid,\r
+ (VOID**)&FsProtocol,\r
+ gImageHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
// Try to Open the volume and get root directory\r
Status = FsProtocol->OpenVolume (FsProtocol, &Fs);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto CLOSE_PROTOCOL;\r
}\r
\r
- File = NULL;\r
Status = Fs->Open (Fs, &File, FilePathDevicePath->PathName, EFI_FILE_MODE_READ, 0);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto CLOSE_PROTOCOL;\r
}\r
\r
Size = 0;\r
FileInfo = AllocatePool (Size);\r
Status = File->GetInfo (File, &gEfiFileInfoGuid, &Size, FileInfo);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto CLOSE_FILE;\r
}\r
\r
// Get the file size\r
Status = File->Read (File, &Size, (VOID*)(UINTN)(*Image));\r
}\r
\r
+CLOSE_FILE:\r
+ File->Close (File);\r
+\r
+CLOSE_PROTOCOL:\r
+ gBS->CloseProtocol (\r
+ Handle,\r
+ &gEfiSimpleFileSystemProtocolGuid,\r
+ gImageHandle,\r
+ Handle);\r
+\r
return Status;\r
}\r
\r
\r
EFI_STATUS\r
BdsMemoryMapLoadImage (\r
- IN EFI_DEVICE_PATH *DevicePath,\r
- IN EFI_HANDLE Handle,\r
- IN EFI_DEVICE_PATH *RemainingDevicePath,\r
+ IN OUT EFI_DEVICE_PATH **DevicePath,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH *RemainingDevicePath,\r
IN EFI_ALLOCATE_TYPE Type,\r
IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
OUT UINTN *ImageSize\r
if (IS_DEVICE_PATH_NODE (RemainingDevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP)) {\r
MemMapPathDevicePath = (MEMMAP_DEVICE_PATH*)RemainingDevicePath;\r
} else {\r
- ASSERT (IS_DEVICE_PATH_NODE (DevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP));\r
- MemMapPathDevicePath = (MEMMAP_DEVICE_PATH*)DevicePath;\r
+ ASSERT (IS_DEVICE_PATH_NODE (*DevicePath, HARDWARE_DEVICE_PATH, HW_MEMMAP_DP));\r
+ MemMapPathDevicePath = (MEMMAP_DEVICE_PATH*)*DevicePath;\r
}\r
\r
Size = MemMapPathDevicePath->EndingAddress - MemMapPathDevicePath->StartingAddress;\r
\r
EFI_STATUS\r
BdsFirmwareVolumeLoadImage (\r
- IN EFI_DEVICE_PATH *DevicePath,\r
- IN EFI_HANDLE Handle,\r
- IN EFI_DEVICE_PATH *RemainingDevicePath,\r
+ IN OUT EFI_DEVICE_PATH **DevicePath,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH *RemainingDevicePath,\r
IN EFI_ALLOCATE_TYPE Type,\r
IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
OUT UINTN *ImageSize\r
Status = FwVol->ReadFile (\r
FwVol,\r
FvNameGuid,\r
- (VOID*)(UINTN)(*Image),\r
+ (VOID**)Image,\r
ImageSize,\r
&FvType,\r
&Attrib,\r
\r
EFI_STATUS\r
BdsPxeLoadImage (\r
- IN EFI_DEVICE_PATH* DevicePath,\r
- IN EFI_HANDLE Handle,\r
- IN EFI_DEVICE_PATH* RemainingDevicePath,\r
- IN EFI_ALLOCATE_TYPE Type,\r
- IN OUT EFI_PHYSICAL_ADDRESS *Image,\r
- OUT UINTN *ImageSize\r
+ IN OUT EFI_DEVICE_PATH **DevicePath,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH *RemainingDevicePath,\r
+ IN EFI_ALLOCATE_TYPE Type,\r
+ IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
+ OUT UINTN *ImageSize\r
)\r
{\r
EFI_STATUS Status;\r
return Status;\r
}\r
\r
- Status = LoadFileProtocol->LoadFile (LoadFileProtocol, DevicePath, TRUE, &BufferSize, NULL);\r
+ Status = LoadFileProtocol->LoadFile (LoadFileProtocol, RemainingDevicePath, TRUE, &BufferSize, NULL);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(BufferSize), Image);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = LoadFileProtocol->LoadFile (LoadFileProtocol, DevicePath, TRUE, &BufferSize, (VOID*)(UINTN)(*Image));\r
+ Status = LoadFileProtocol->LoadFile (LoadFileProtocol, RemainingDevicePath, TRUE, &BufferSize, (VOID*)(UINTN)(*Image));\r
if (!EFI_ERROR (Status) && (ImageSize != NULL)) {\r
*ImageSize = BufferSize;\r
}\r
**/\r
EFI_STATUS\r
BdsTftpLoadImage (\r
- IN EFI_DEVICE_PATH* DevicePath,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH* RemainingDevicePath,\r
- IN EFI_ALLOCATE_TYPE Type,\r
- IN OUT EFI_PHYSICAL_ADDRESS *Image,\r
- OUT UINTN *ImageSize\r
+ IN OUT EFI_DEVICE_PATH **DevicePath,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH *RemainingDevicePath,\r
+ IN EFI_ALLOCATE_TYPE Type,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *Image,\r
+ OUT UINTN *ImageSize\r
)\r
{\r
EFI_STATUS Status;\r
EFI_DHCP4_MODE_DATA Dhcp4Mode;\r
EFI_MTFTP4_CONFIG_DATA Mtftp4CfgData;\r
IPv4_DEVICE_PATH *IPv4DevicePathNode;\r
- FILEPATH_DEVICE_PATH *FilePathDevicePathNode;\r
+ CHAR16 *PathName;\r
CHAR8 *AsciiFilePath;\r
EFI_MTFTP4_TOKEN Mtftp4Token;\r
UINT64 FileSize;\r
goto Error;\r
}\r
\r
- //\r
- // Convert the Unicode path of the file to Ascii\r
- //\r
-\r
- FilePathDevicePathNode = (FILEPATH_DEVICE_PATH*)(IPv4DevicePathNode + 1);\r
- AsciiFilePath = AllocatePool ((StrLen (FilePathDevicePathNode->PathName) + 1) * sizeof (CHAR8));\r
- if (AsciiFilePath == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Error;\r
- }\r
- UnicodeStrToAsciiStr (FilePathDevicePathNode->PathName, AsciiFilePath);\r
+ // The Device Path might contain multiple FilePath nodes\r
+ PathName = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL*)(IPv4DevicePathNode + 1), FALSE, FALSE);\r
+ AsciiFilePath = AllocatePool (StrLen (PathName) + 1);\r
+ UnicodeStrToAsciiStr (PathName, AsciiFilePath);\r
\r
//\r
// Try to get the size of the file in bytes from the server. If it fails,\r
if (Mtftp4GetFileSize (Mtftp4, AsciiFilePath, &FileSize) == EFI_SUCCESS) {\r
TftpBufferSize = FileSize;\r
} else {\r
- TftpBufferSize = SIZE_8MB;\r
+ TftpBufferSize = SIZE_16MB;\r
}\r
\r
TftpContext = AllocatePool (sizeof (BDS_TFTP_CONTEXT));\r
TftpContext->FileSize = FileSize;\r
\r
for (; TftpBufferSize <= FixedPcdGet32 (PcdMaxTftpFileSize);\r
- TftpBufferSize = (TftpBufferSize + SIZE_8MB) & (~(SIZE_8MB-1))) {\r
+ TftpBufferSize = (TftpBufferSize + SIZE_16MB) & (~(SIZE_16MB-1))) {\r
//\r
// Allocate a buffer to hold the whole file.\r
//\r
Mtftp4Token.CheckPacket = Mtftp4CheckPacket;\r
Mtftp4Token.Context = (VOID*)TftpContext;\r
\r
- Print (L"Downloading the file <%s> from the TFTP server\n", FilePathDevicePathNode->PathName);\r
+ Print (L"Downloading the file <%a> from the TFTP server\n", AsciiFilePath);\r
Status = Mtftp4->ReadFile (Mtftp4, &Mtftp4Token);\r
Print (L"\n");\r
if (EFI_ERROR (Status)) {\r
}\r
\r
if (EFI_ERROR (Status)) {\r
+ *Image = 0;\r
Print (L"Failed to download the file - Error=%r\n", Status);\r
}\r
\r
FileLoader = FileLoaders;\r
while (FileLoader->Support != NULL) {\r
if (FileLoader->Support (*DevicePath, Handle, RemainingDevicePath)) {\r
- return FileLoader->LoadImage (*DevicePath, Handle, RemainingDevicePath, Type, Image, FileSize);\r
+ return FileLoader->LoadImage (DevicePath, Handle, RemainingDevicePath, Type, Image, FileSize);\r
}\r
FileLoader++;\r
}\r