]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/BdsLib/BdsFilePath.c
ArmPkg: Move IS_DEVICE_PATH_NODE for sharing
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsFilePath.c
index 5fc8d5309290fae6fb9f693180d3da81bdcff940..41557bb91816e7df488298e72e44994090b2af6b 100644 (file)
@@ -24,9 +24,6 @@
 #include <Protocol/Dhcp4.h>\r
 #include <Protocol/Mtftp4.h>\r
 \r
-\r
-#define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype)))\r
-\r
 /* Type and defines to set up the DHCP4 options */\r
 \r
 typedef struct {\r
@@ -467,27 +464,34 @@ BdsFileSystemSupport (
 \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_ADDRESSImage,\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
@@ -495,13 +499,12 @@ BdsFileSystemLoadImage (
   // 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
@@ -509,7 +512,7 @@ BdsFileSystemLoadImage (
   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
@@ -528,6 +531,16 @@ BdsFileSystemLoadImage (
     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
@@ -544,9 +557,9 @@ BdsMemoryMapSupport (
 \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
@@ -559,8 +572,8 @@ BdsMemoryMapLoadImage (
   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
@@ -596,9 +609,9 @@ BdsFirmwareVolumeSupport (
 \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
@@ -681,7 +694,7 @@ BdsFirmwareVolumeLoadImage (
         Status = FwVol->ReadFile (\r
                                 FwVol,\r
                                 FvNameGuid,\r
-                                (VOID*)(UINTN)(*Image),\r
+                                (VOID**)Image,\r
                                 ImageSize,\r
                                 &FvType,\r
                                 &Attrib,\r
@@ -717,12 +730,12 @@ BdsPxeSupport (
 \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_ADDRESSImage,\r
+  OUT    UINTN                 *ImageSize\r
   )\r
 {\r
   EFI_STATUS              Status;\r
@@ -736,14 +749,14 @@ BdsPxeLoadImage (
     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
@@ -948,7 +961,7 @@ Mtftp4CheckPacket (
       Step      = (Context->DownloadedNbOfBytes   * TFTP_PROGRESS_SLIDER_STEPS) / Context->FileSize;\r
       if (Step > LastStep) {\r
         Print (mTftpProgressDelete);\r
-        StrCpy (Progress, mTftpProgressFrame);\r
+        CopyMem (Progress, mTftpProgressFrame, sizeof mTftpProgressFrame);\r
         for (Index = 1; Index < Step; Index++) {\r
           Progress[Index] = L'=';\r
         }\r
@@ -1002,12 +1015,12 @@ Mtftp4CheckPacket (
 **/\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
@@ -1022,12 +1035,13 @@ BdsTftpLoadImage (
   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
   UINT64                   TftpBufferSize;\r
   BDS_TFTP_CONTEXT         *TftpContext;\r
+  UINTN                    PathNameLen;\r
 \r
   ASSERT(IS_DEVICE_PATH_NODE (RemainingDevicePath, MESSAGING_DEVICE_PATH, MSG_IPv4_DP));\r
   IPv4DevicePathNode = (IPv4_DEVICE_PATH*)RemainingDevicePath;\r
@@ -1169,17 +1183,11 @@ BdsTftpLoadImage (
     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
+  PathNameLen   = StrLen (PathName) + 1;\r
+  AsciiFilePath = AllocatePool (PathNameLen);\r
+  UnicodeStrToAsciiStrS (PathName, AsciiFilePath, PathNameLen);\r
 \r
   //\r
   // Try to get the size of the file in bytes from the server. If it fails,\r
@@ -1189,7 +1197,7 @@ BdsTftpLoadImage (
   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
@@ -1200,7 +1208,7 @@ BdsTftpLoadImage (
   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
@@ -1225,7 +1233,7 @@ BdsTftpLoadImage (
     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
@@ -1287,6 +1295,7 @@ Error:
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
+    *Image = 0;\r
     Print (L"Failed to download the file - Error=%r\n", Status);\r
   }\r
 \r
@@ -1324,7 +1333,7 @@ BdsLoadImageAndUpdateDevicePath (
   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