]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/HiiDatabase: Refine GetImageIdOrAddress
authorRuiyu Ni <ruiyu.ni@intel.com>
Wed, 21 Sep 2016 03:10:38 +0000 (11:10 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Wed, 28 Sep 2016 08:21:17 +0000 (16:21 +0800)
Contributed-under: TianoCore Contribution Agreement 1.0
Reviewed-by: Liming Gao <liming.gao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
MdeModulePkg/Universal/HiiDatabaseDxe/Image.c

index d1eb88188479ba076f8a6c2bd821fadaffcdf545..984c5d29abfe2d40c6dc8630eea32987eab0d584 100644 (file)
@@ -1552,7 +1552,7 @@ InsertImagePackage (
   if (ImageInfoOffset != 0) {\r
     ImageSize = ImagePackage->ImagePkgHdr.Header.Length -\r
                 sizeof (EFI_HII_IMAGE_PACKAGE_HDR) - PaletteSize;\r
-    ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (ImageSize);\r
+    ImagePackage->ImageBlock = AllocateZeroPool (ImageSize);\r
     if (ImagePackage->ImageBlock == NULL) {\r
       FreePool (ImagePackage->PaletteBlock);\r
       FreePool (ImagePackage);\r
index 1b0f7f6b37ebf13663fc00919c08e787a71237a4..0ca2fba5ecefe34f29e7eb17b830d9d085a9cefc 100644 (file)
@@ -223,7 +223,7 @@ typedef struct _HII_IMAGE_PACKAGE_INSTANCE {
   EFI_HII_IMAGE_PACKAGE_HDR             ImagePkgHdr;\r
   UINT32                                ImageBlockSize;\r
   UINT32                                PaletteInfoSize;\r
-  UINT8                                 *ImageBlock;\r
+  EFI_HII_IMAGE_BLOCK                   *ImageBlock;\r
   UINT8                                 *PaletteBlock;\r
 } HII_IMAGE_PACKAGE_INSTANCE;\r
 \r
index 612d57a61505a48aa0a36ef8466e51db65de6f37..0a908ec2da47de69abd833e98f73e64c5106989f 100644 (file)
@@ -24,51 +24,44 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
   This is a internal function.\r
 \r
-  @param ImageBlock      Points to the beginning of a series of image blocks stored in order.\r
+  @param ImageBlocks     Points to the beginning of a series of image blocks stored in order.\r
   @param ImageId         If input ImageId is 0, output the image id of the EFI_HII_IIBT_END_BLOCK;\r
                          else use this id to find its corresponding image block address.\r
 \r
   @return The image block address when input ImageId is not zero; otherwise return NULL.\r
 \r
 **/\r
-UINT8*\r
+EFI_HII_IMAGE_BLOCK *\r
 GetImageIdOrAddress (\r
-  IN  UINT8           *ImageBlock,\r
-  IN OUT EFI_IMAGE_ID *ImageId\r
+  IN EFI_HII_IMAGE_BLOCK *ImageBlocks,\r
+  IN OUT EFI_IMAGE_ID    *ImageId\r
   )\r
 {\r
   EFI_IMAGE_ID                   ImageIdCurrent;\r
-  UINT8                          *ImageBlockHdr;\r
-  UINT8                          Length8;\r
-  UINT16                         Length16;\r
-  UINT32                         Length32;\r
-  EFI_HII_IIBT_IMAGE_1BIT_BLOCK  Iibt1bit;\r
-  EFI_HII_IIBT_IMAGE_4BIT_BLOCK  Iibt4bit;\r
-  EFI_HII_IIBT_IMAGE_8BIT_BLOCK  Iibt8bit;\r
-  UINT16                         Width;\r
-  UINT16                         Height;\r
-\r
-  ASSERT (ImageBlock != NULL && ImageId != NULL);\r
-\r
-  ImageBlockHdr  = ImageBlock;\r
-  ImageIdCurrent = 1;\r
-\r
-  while (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType != EFI_HII_IIBT_END) {\r
-    if (*ImageId > 0) {\r
+  EFI_HII_IMAGE_BLOCK            *CurrentImageBlock;\r
+  UINTN                          Length;\r
+\r
+  ASSERT (ImageBlocks != NULL && ImageId != NULL);\r
+  CurrentImageBlock = ImageBlocks;\r
+  ImageIdCurrent    = 1;\r
+\r
+  while (CurrentImageBlock->BlockType != EFI_HII_IIBT_END) {\r
+    if (*ImageId != 0) {\r
       if (*ImageId == ImageIdCurrent) {\r
         //\r
         // If the found image block is a duplicate block, update the ImageId to\r
         // find the previous defined image block.\r
         //\r
-        if (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
-          CopyMem (ImageId, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (EFI_IMAGE_ID));\r
+        if (CurrentImageBlock->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
+          *ImageId = ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_DUPLICATE_BLOCK *) CurrentImageBlock)->ImageId);\r
           ASSERT (*ImageId != ImageIdCurrent);\r
-          ImageBlock = ImageBlockHdr;\r
+          ASSERT (*ImageId != 0);\r
+          CurrentImageBlock = ImageBlocks;\r
           ImageIdCurrent = 1;\r
           continue;\r
         }\r
 \r
-        return ImageBlock;\r
+        return CurrentImageBlock;\r
       }\r
       if (*ImageId < ImageIdCurrent) {\r
         //\r
@@ -77,86 +70,75 @@ GetImageIdOrAddress (
         return NULL;\r
       }\r
     }\r
-    switch (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType) {\r
+    switch (CurrentImageBlock->BlockType) {\r
     case EFI_HII_IIBT_EXT1:\r
-      Length8 = *(UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8));\r
-      ImageBlock += Length8;\r
+      Length = ((EFI_HII_IIBT_EXT1_BLOCK *) CurrentImageBlock)->Length;\r
       break;\r
     case EFI_HII_IIBT_EXT2:\r
-      CopyMem (\r
-        &Length16,\r
-        (UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8)),\r
-        sizeof (UINT16)\r
-        );\r
-      ImageBlock += Length16;\r
+      Length = ReadUnaligned16 (&((EFI_HII_IIBT_EXT2_BLOCK *) CurrentImageBlock)->Length);\r
       break;\r
     case EFI_HII_IIBT_EXT4:\r
-      CopyMem (\r
-        &Length32,\r
-        (UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8)),\r
-        sizeof (UINT32)\r
-        );\r
-      ImageBlock += Length32;\r
+      Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_EXT4_BLOCK *) CurrentImageBlock)->Length);\r
       break;\r
 \r
     case EFI_HII_IIBT_IMAGE_1BIT:\r
     case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
-      CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));\r
-      ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
-                    BITMAP_LEN_1_BIT (Iibt1bit.Bitmap.Width, Iibt1bit.Bitmap.Height);\r
+      Length = sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
+               BITMAP_LEN_1_BIT (\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+                 );\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_IMAGE_4BIT:\r
     case EFI_HII_IIBT_IMAGE_4BIT_TRANS:\r
-      CopyMem (&Iibt4bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK));\r
-      ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
-                    BITMAP_LEN_4_BIT (Iibt4bit.Bitmap.Width, Iibt4bit.Bitmap.Height);\r
+      Length = sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
+               BITMAP_LEN_4_BIT (\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+                 );\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_IMAGE_8BIT:\r
     case EFI_HII_IIBT_IMAGE_8BIT_TRANS:\r
-      CopyMem (&Iibt8bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK));\r
-      ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
-                    BITMAP_LEN_8_BIT (Iibt8bit.Bitmap.Width, Iibt8bit.Bitmap.Height);\r
+      Length = sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
+               BITMAP_LEN_8_BIT (\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+                 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+                 );\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_IMAGE_24BIT:\r
     case EFI_HII_IIBT_IMAGE_24BIT_TRANS:\r
-      CopyMem (&Width, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
-      CopyMem (\r
-        &Height,\r
-        ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16),\r
-        sizeof (UINT16)\r
-        );\r
-      ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
-                    BITMAP_LEN_24_BIT (Width, Height);\r
+      Length = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
+               BITMAP_LEN_24_BIT (\r
+                 ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+                 ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+                 );\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_DUPLICATE:\r
-      ImageBlock += sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
+      Length = sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_IMAGE_JPEG:\r
-      CopyMem (&Length32, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT32));\r
-      ImageBlock += Length32;\r
+      Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
       ImageIdCurrent++;\r
       break;\r
 \r
     case EFI_HII_IIBT_SKIP1:\r
-      Length8 = *(ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK));\r
-      ImageBlock += sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
-      ImageIdCurrent = (UINT16) (ImageIdCurrent + Length8);\r
+      Length = sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
+      ImageIdCurrent += ((EFI_HII_IIBT_SKIP1_BLOCK *) CurrentImageBlock)->SkipCount;\r
       break;\r
 \r
     case EFI_HII_IIBT_SKIP2:\r
-      CopyMem (&Length16, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
-      ImageBlock += sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
-      ImageIdCurrent = (UINT16) (ImageIdCurrent + Length16);\r
+      Length = sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
+      ImageIdCurrent += ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_SKIP2_BLOCK *) CurrentImageBlock)->SkipCount);\r
       break;\r
 \r
     default:\r
@@ -164,7 +146,12 @@ GetImageIdOrAddress (
       // Unknown image blocks can not be skipped, processing halts.\r
       //\r
       ASSERT (FALSE);\r
+      Length = 0;\r
+      break;\r
     }\r
+\r
+    CurrentImageBlock = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) CurrentImageBlock + Length);\r
+\r
   }\r
 \r
   //\r
@@ -172,7 +159,7 @@ GetImageIdOrAddress (
   //\r
   if (*ImageId == 0) {\r
     *ImageId = ImageIdCurrent;\r
-    return ImageBlock;\r
+    return CurrentImageBlock;\r
   }\r
 \r
   return NULL;\r
@@ -689,7 +676,7 @@ HiiNewImage (
       ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)\r
       );\r
     FreePool (ImagePackage->ImageBlock);\r
-    ImagePackage->ImageBlock = ImageBlock;\r
+    ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) ImageBlock;\r
     ImageBlock += ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK);\r
     //\r
     // Temp memory to store new block.\r
@@ -741,12 +728,12 @@ HiiNewImage (
     // Fill in image blocks.\r
     //\r
     ImagePackage->ImageBlockSize = (UINT32) BlockSize;\r
-    ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (BlockSize);\r
+    ImagePackage->ImageBlock = AllocateZeroPool (BlockSize);\r
     if (ImagePackage->ImageBlock == NULL) {\r
       FreePool (ImagePackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    ImageBlock = ImagePackage->ImageBlock;\r
+    ImageBlock = (UINT8 *) ImagePackage->ImageBlock;\r
 \r
     //\r
     // Temp memory to store new block.\r
@@ -885,7 +872,7 @@ HiiGetImage (
   // Find the image block specified by ImageId\r
   //\r
   LocalImageId = ImageId;\r
-  ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+  ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
   if (ImageBlock == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -1083,7 +1070,7 @@ HiiSetImage (
   // Find the image block specified by ImageId\r
   //\r
   LocalImageId = ImageId;\r
-  ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+  ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
   if (ImageBlock == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -1171,7 +1158,7 @@ HiiSetImage (
   }\r
 \r
   BlockPtr  = Block;\r
-  Part1Size = (UINT32) (ImageBlock - ImagePackage->ImageBlock);\r
+  Part1Size = (UINT32) (ImageBlock - (UINT8 *) ImagePackage->ImageBlock);\r
   Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
   CopyMem (BlockPtr, ImagePackage->ImageBlock, Part1Size);\r
   BlockPtr += Part1Size;\r
@@ -1181,7 +1168,7 @@ HiiSetImage (
 \r
   FreePool (ImagePackage->ImageBlock);\r
   FreePool (NewBlock);\r
-  ImagePackage->ImageBlock     = Block;\r
+  ImagePackage->ImageBlock     = (EFI_HII_IMAGE_BLOCK *) Block;\r
   ImagePackage->ImageBlockSize = BlockSize;\r
   ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize;\r
   PackageListNode->PackageListHdr.PackageLength += NewBlockSize - OldBlockSize;\r