]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add FvNameGuid for FV extension header.
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 10 Mar 2009 09:27:59 +0000 (09:27 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 10 Mar 2009 09:27:59 +0000 (09:27 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7851 6f19259b-4bc3-4df7-8a09-765794883524

Nt32Pkg/FvbServicesRuntimeDxe/FWBlockService.c
Nt32Pkg/FvbServicesRuntimeDxe/FwBlockService.h
Nt32Pkg/Nt32Pkg.fdf

index 9ab295a242d1e5ef1767b7f2dea8f718181d4223..8d1b7e3c28818a7a44abf26e4fd149ed6d3e57dd 100644 (file)
@@ -52,31 +52,55 @@ Revision History
 \r
 ESAL_FWB_GLOBAL         *mFvbModuleGlobal;\r
 \r
-EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {\r
-  FVB_DEVICE_SIGNATURE,\r
+FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate = {\r
   {\r
     {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_MEMMAP_DP,\r
       {\r
-        HARDWARE_DEVICE_PATH,\r
-        HW_MEMMAP_DP,\r
-        {\r
-          sizeof (MEMMAP_DEVICE_PATH),\r
-          0\r
-        }\r
-      },\r
-      EfiMemoryMappedIO,\r
-      0,\r
-      0,\r
+        (UINT8)(sizeof (MEMMAP_DEVICE_PATH)),\r
+        (UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8)\r
+      }\r
     },\r
+    EfiMemoryMappedIO,\r
+    (EFI_PHYSICAL_ADDRESS) 0,\r
+    (EFI_PHYSICAL_ADDRESS) 0,\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    {\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate = {\r
+  {\r
     {\r
-      END_DEVICE_PATH_TYPE,\r
-      END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+      MEDIA_DEVICE_PATH,\r
+      MEDIA_PIWG_FW_VOL_DP,\r
       {\r
-        sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
-        0\r
+        (UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH)),\r
+        (UINT8)(sizeof (MEDIA_FW_VOL_DEVICE_PATH) >> 8)\r
       }\r
-    }\r
+    },\r
+    { 0 }\r
   },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    {\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate = {\r
+  FVB_DEVICE_SIGNATURE,\r
+  NULL,\r
   0,\r
   {\r
     FvbProtocolGetAttributes,\r
@@ -1097,6 +1121,7 @@ Returns:
       ) {\r
     return EFI_NOT_FOUND;\r
   }\r
+  \r
   //\r
   // Verify the header checksum\r
   //\r
@@ -1113,6 +1138,13 @@ Returns:
     return EFI_NOT_FOUND;\r
   }\r
 \r
+  //\r
+  // PI specification defines the name guid of FV exists in extension header.\r
+  //\r
+  if (FwVolHeader->ExtHeaderOffset == 0) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1143,8 +1175,6 @@ Returns:
   EFI_HANDLE                          FwbHandle;\r
   EFI_FW_VOL_BLOCK_DEVICE             *FvbDevice;\r
   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *OldFwbInterface;\r
-  EFI_DEVICE_PATH_PROTOCOL            *TempFwbDevicePath;\r
-  FV_DEVICE_PATH                      TempFvbDevicePathData;\r
   UINT32                              MaxLbaSize;\r
   EFI_PHYSICAL_ADDRESS                BaseAddress;\r
   UINT64                              Length;\r
@@ -1262,7 +1292,7 @@ Returns:
         FwVolHeader->HeaderLength\r
         );\r
     }\r
-\r
+    \r
     FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN) BaseAddress;\r
     FwhInstance->FvBase[FVB_VIRTUAL]  = (UINTN) BaseAddress;\r
 \r
@@ -1297,19 +1327,29 @@ Returns:
 \r
     FvbDevice->Instance = mFvbModuleGlobal->NumFv;\r
     mFvbModuleGlobal->NumFv++;\r
-\r
+    \r
+    \r
     //\r
     // Set up the devicepath\r
     //\r
-    FvbDevice->DevicePath.MemMapDevPath.StartingAddress = BaseAddress;\r
-    FvbDevice->DevicePath.MemMapDevPath.EndingAddress   = BaseAddress + (FwVolHeader->FvLength - 1);\r
-\r
+    if (FwVolHeader->ExtHeaderOffset == 0) {\r
+        //\r
+        // FV does not contains extension header, then produce MEMMAP_DEVICE_PATH\r
+        //\r
+      FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_MEMMAP_DEVICE_PATH), &mFvMemmapDevicePathTemplate);\r
+      ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.StartingAddress = BaseAddress;\r
+      ((FV_MEMMAP_DEVICE_PATH *) FvbDevice->DevicePath)->MemMapDevPath.EndingAddress   = BaseAddress + FwVolHeader->FvLength - 1;\r
+    } else {\r
+      FvbDevice->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocateCopyPool (sizeof (FV_PIWG_DEVICE_PATH), &mFvPIWGDevicePathTemplate);\r
+      CopyGuid (\r
+        &((FV_PIWG_DEVICE_PATH *)FvbDevice->DevicePath)->FvDevPath.FvName, \r
+        (GUID *)(UINTN)(BaseAddress + FwVolHeader->ExtHeaderOffset)\r
+        );\r
+    }\r
     //\r
     // Find a handle with a matching device path that has supports FW Block protocol\r
     //\r
-    TempFwbDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) &TempFvbDevicePathData;\r
-    CopyMem (TempFwbDevicePath, &FvbDevice->DevicePath, sizeof (FV_DEVICE_PATH));\r
-    Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid, &TempFwbDevicePath, &FwbHandle);\r
+    Status = gBS->LocateDevicePath (&gEfiFirmwareVolumeBlockProtocolGuid, &FvbDevice->DevicePath, &FwbHandle);\r
     if (EFI_ERROR (Status)) {\r
       //\r
       // LocateDevicePath fails so install a new interface and device path\r
@@ -1324,7 +1364,7 @@ Returns:
                       NULL\r
                       );\r
       ASSERT_EFI_ERROR (Status);\r
-    } else if (IsDevicePathEnd (TempFwbDevicePath)) {\r
+    } else if (IsDevicePathEnd (FvbDevice->DevicePath)) {\r
       //\r
       // Device allready exists, so reinstall the FVB protocol\r
       //\r
index b9ebfded323d9ce022e83df2890c4d485492c75d..51332a4ad18810e1f1b0127a7d28950a58d39738 100644 (file)
@@ -49,13 +49,18 @@ typedef struct {
 #define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'N')\r
 \r
 typedef struct {\r
-  MEMMAP_DEVICE_PATH        MemMapDevPath;\r
+  MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;\r
   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;\r
-} FV_DEVICE_PATH;\r
+} FV_PIWG_DEVICE_PATH;\r
+\r
+typedef struct {\r
+  MEMMAP_DEVICE_PATH          MemMapDevPath;\r
+  EFI_DEVICE_PATH_PROTOCOL    EndDevPath;\r
+} FV_MEMMAP_DEVICE_PATH;\r
 \r
 typedef struct {\r
   UINTN                               Signature;\r
-  FV_DEVICE_PATH                      DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL            *DevicePath;\r
   UINTN                               Instance;\r
   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;\r
 } EFI_FW_VOL_BLOCK_DEVICE;\r
index e08c3c889a3c375e63bef3351f99bce6c5fc8944..f4fe784d528bf7dc4822819c24a050215e6bb79e 100644 (file)
@@ -133,6 +133,7 @@ READ_ENABLED_CAP   = TRUE
 READ_STATUS        = TRUE\r
 READ_LOCK_CAP      = TRUE\r
 READ_LOCK_STATUS   = TRUE\r
+FvNameGuid         = 6D99E806-3D38-42c2-A095-5F4300BFD7DC\r
 \r
 ################################################################################\r
 #\r