]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/EfiLdr/TianoDecompress.c
Fix bugs in decompress implement in EfiLdr, and enable FAT driver in FDF file.
[mirror_edk2.git] / DuetPkg / EfiLdr / TianoDecompress.c
index 9a9ab70be449380881cccec0717fd7eece9765cb..d326805c28e573e3af09db65059ef6bb6c646f3c 100644 (file)
@@ -26,7 +26,6 @@ Abstract:
 #define MAXMATCH  256\r
 #define THRESHOLD 3\r
 #define CODE_BIT  16\r
-#define UINT8_MAX 0xff\r
 #define BAD_TABLE - 1\r
 \r
 //\r
@@ -74,7 +73,6 @@ typedef struct {
   UINT8   mPBit;\r
 } SCRATCH_DATA;\r
 \r
-STATIC\r
 VOID\r
 FillBuf (\r
   IN  SCRATCH_DATA  *Sd,\r
@@ -124,7 +122,6 @@ Returns: (VOID)
   Sd->mBitBuf |= Sd->mSubBitBuf >> Sd->mBitCount;\r
 }\r
 \r
-STATIC\r
 UINT32\r
 GetBits (\r
   IN  SCRATCH_DATA  *Sd,\r
@@ -158,7 +155,6 @@ Returns:
   return OutBits;\r
 }\r
 \r
-STATIC\r
 UINT16\r
 MakeTable (\r
   IN  SCRATCH_DATA  *Sd,\r
@@ -193,17 +189,19 @@ Returns:
   UINT16  Start[18];\r
   UINT16  *Pointer;\r
   UINT16  Index3;\r
-  UINT16  Index;\r
+  volatile UINT16  Index;\r
   UINT16  Len;\r
   UINT16  Char;\r
   UINT16  JuBits;\r
   UINT16  Avail;\r
   UINT16  NextCode;\r
   UINT16  Mask;\r
+  UINT16  WordOfStart;\r
+  UINT16  WordOfCount;\r
 \r
   for (Index = 1; Index <= 16; Index++) {\r
     Count[Index] = 0;\r
-  }\r
+  }  \r
 \r
   for (Index = 0; Index < NumOfChar; Index++) {\r
     Count[BitLen[Index]]++;\r
@@ -212,7 +210,9 @@ Returns:
   Start[1] = 0;\r
 \r
   for (Index = 1; Index <= 16; Index++) {\r
-    Start[Index + 1] = (UINT16) (Start[Index] + (Count[Index] << (16 - Index)));\r
+    WordOfStart = Start[Index];\r
+    WordOfCount = Count[Index];\r
+    Start[Index + 1] = (UINT16) (WordOfStart + (WordOfCount << (16 - Index)));\r
   }\r
 \r
   if (Start[17] != 0) {\r
@@ -228,7 +228,8 @@ Returns:
   }\r
 \r
   while (Index <= 16) {\r
-    Weight[Index++] = (UINT16) (1U << (16 - Index));\r
+    Weight[Index] = (UINT16) (1U << (16 - Index));\r
+    Index++;\r
   }\r
 \r
   Index = (UINT16) (Start[TableBits + 1] >> JuBits);\r
@@ -292,7 +293,6 @@ Returns:
   return 0;\r
 }\r
 \r
-STATIC\r
 UINT32\r
 DecodeP (\r
   IN  SCRATCH_DATA  *Sd\r
@@ -346,7 +346,6 @@ Returns:
   return Pos;\r
 }\r
 \r
-STATIC\r
 UINT16\r
 ReadPTLen (\r
   IN  SCRATCH_DATA  *Sd,\r
@@ -376,7 +375,7 @@ Returns:
 {\r
   UINT16  Number;\r
   UINT16  CharC;\r
-  UINT16  Index;\r
+  volatile UINT16  Index;\r
   UINT32  Mask;\r
 \r
   Number = (UINT16) GetBits (Sd, nbit);\r
@@ -428,7 +427,6 @@ Returns:
   return MakeTable (Sd, nn, Sd->mPTLen, 8, Sd->mPTTable);\r
 }\r
 \r
-STATIC\r
 VOID\r
 ReadCLen (\r
   SCRATCH_DATA  *Sd\r
@@ -449,7 +447,7 @@ Returns: (VOID)
 {\r
   UINT16  Number;\r
   UINT16  CharC;\r
-  UINT16  Index;\r
+  volatile UINT16  Index;\r
   UINT32  Mask;\r
 \r
   Number = (UINT16) GetBits (Sd, CBIT);\r
@@ -522,7 +520,6 @@ Returns: (VOID)
   return ;\r
 }\r
 \r
-STATIC\r
 UINT16\r
 DecodeC (\r
   SCRATCH_DATA  *Sd\r
@@ -588,7 +585,6 @@ Returns:
   return Index2;\r
 }\r
 \r
-STATIC\r
 VOID\r
 Decode (\r
   SCRATCH_DATA  *Sd\r
@@ -618,7 +614,7 @@ Returns: (VOID)
   for (;;) {\r
     CharC = DecodeC (Sd);\r
     if (Sd->mBadTableFlag != 0) {\r
-      return ;\r
+      goto Done ;\r
     }\r
 \r
     if (CharC < 256) {\r
@@ -626,7 +622,7 @@ Returns: (VOID)
       // Process an Original character\r
       //\r
       if (Sd->mOutBuf >= Sd->mOrigSize) {\r
-        return ;\r
+        goto Done ;\r
       } else {\r
         Sd->mDstBase[Sd->mOutBuf++] = (UINT8) CharC;\r
       }\r
@@ -635,7 +631,7 @@ Returns: (VOID)
       //\r
       // Process a Pointer\r
       //\r
-      CharC       = (UINT16) (CharC - (UINT8_MAX + 1 - THRESHOLD));\r
+      CharC       = (UINT16) (CharC - (BIT8 - THRESHOLD));\r
 \r
       BytesRemain = CharC;\r
 \r
@@ -645,7 +641,7 @@ Returns: (VOID)
       while ((INT16) (BytesRemain) >= 0) {\r
         Sd->mDstBase[Sd->mOutBuf++] = Sd->mDstBase[DataIdx++];\r
         if (Sd->mOutBuf >= Sd->mOrigSize) {\r
-          return ;\r
+          goto Done ;\r
         }\r
 \r
         BytesRemain--;\r
@@ -653,6 +649,7 @@ Returns: (VOID)
     }\r
   }\r
 \r
+Done:\r
   return ;\r
 }\r
 \r
@@ -731,14 +728,14 @@ Returns:
 \r
 --*/\r
 {\r
-  UINT32        Index;\r
   UINT32        CompSize;\r
   UINT32        OrigSize;\r
   EFI_STATUS    Status;\r
   SCRATCH_DATA  *Sd;\r
   UINT8         *Src;\r
   UINT8         *Dst;\r
-\r
+  volatile UINT32  Index;\r
+  \r
   Status  = EFI_SUCCESS;\r
   Src     = Source;\r
   Dst     = Destination;\r
@@ -776,6 +773,7 @@ Returns:
   for (Index = 0; Index < sizeof (SCRATCH_DATA); Index++) {\r
     ((UINT8 *) Sd)[Index] = 0;\r
   }\r
+  \r
   //\r
   // The length of the field 'Position Set Code Length Array Size' in Block Header.\r
   // For EFI 1.1 de/compression algorithm(Version 1), mPBit = 4\r