]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MtrrLib: refine MtrrLibProgramFixedMtrr()
authorRuiyu Ni <ruiyu.ni@intel.com>
Tue, 26 Sep 2017 15:09:50 +0000 (23:09 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Mon, 16 Oct 2017 05:09:45 +0000 (13:09 +0800)
The patch replaces some if-checks with assertions because
they are impossible to happen.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
UefiCpuPkg/Library/MtrrLib/MtrrLib.c

index cf1af29936ad85846bcaf198445386ac4c2a5bb4..5b21fe11f11147cfeee190797fa798926f367227 100644 (file)
@@ -466,10 +466,10 @@ MtrrGetVariableMtrr (
   @param[in]      Type             The memory type to set.\r
   @param[in, out] Base             The base address of memory range.\r
   @param[in, out] Length           The length of memory range.\r
   @param[in]      Type             The memory type to set.\r
   @param[in, out] Base             The base address of memory range.\r
   @param[in, out] Length           The length of memory range.\r
-  @param[in, out] LastMsrNum       On input, the last index of the fixed MTRR MSR to program.\r
+  @param[in, out] LastMsrIndex     On input, the last index of the fixed MTRR MSR to program.\r
                                    On return, the current index of the fixed MTRR MSR to program.\r
                                    On return, the current index of the fixed MTRR MSR to program.\r
-  @param[out]     ReturnClearMask  The bits to clear in the fixed MTRR MSR.\r
-  @param[out]     ReturnOrMask     The bits to set in the fixed MTRR MSR.\r
+  @param[out]     ClearMask        The bits to clear in the fixed MTRR MSR.\r
+  @param[out]     OrMask           The bits to set in the fixed MTRR MSR.\r
 \r
   @retval RETURN_SUCCESS      The cache type was updated successfully\r
   @retval RETURN_UNSUPPORTED  The requested range or cache type was invalid\r
 \r
   @retval RETURN_SUCCESS      The cache type was updated successfully\r
   @retval RETURN_UNSUPPORTED  The requested range or cache type was invalid\r
@@ -481,27 +481,25 @@ MtrrLibProgramFixedMtrr (
   IN     MTRR_MEMORY_CACHE_TYPE  Type,\r
   IN OUT UINT64                  *Base,\r
   IN OUT UINT64                  *Length,\r
   IN     MTRR_MEMORY_CACHE_TYPE  Type,\r
   IN OUT UINT64                  *Base,\r
   IN OUT UINT64                  *Length,\r
-  IN OUT UINT32                  *LastMsrNum,\r
-  OUT    UINT64                  *ReturnClearMask,\r
-  OUT    UINT64                  *ReturnOrMask\r
+  IN OUT UINT32                  *LastMsrIndex,\r
+  OUT    UINT64                  *ClearMask,\r
+  OUT    UINT64                  *OrMask\r
   )\r
 {\r
   )\r
 {\r
-  UINT32  MsrNum;\r
+  UINT32  MsrIndex;\r
   UINT32  LeftByteShift;\r
   UINT32  RightByteShift;\r
   UINT32  LeftByteShift;\r
   UINT32  RightByteShift;\r
-  UINT64  OrMask;\r
-  UINT64  ClearMask;\r
   UINT64  SubLength;\r
 \r
   //\r
   // Find the fixed MTRR index to be programmed\r
   //\r
   UINT64  SubLength;\r
 \r
   //\r
   // Find the fixed MTRR index to be programmed\r
   //\r
-  for (MsrNum = *LastMsrNum + 1; MsrNum < MTRR_NUMBER_OF_FIXED_MTRR; MsrNum++) {\r
-    if ((*Base >= mMtrrLibFixedMtrrTable[MsrNum].BaseAddress) &&\r
+  for (MsrIndex = *LastMsrIndex + 1; MsrIndex < ARRAY_SIZE (mMtrrLibFixedMtrrTable); MsrIndex++) {\r
+    if ((*Base >= mMtrrLibFixedMtrrTable[MsrIndex].BaseAddress) &&\r
         (*Base <\r
             (\r
         (*Base <\r
             (\r
-              mMtrrLibFixedMtrrTable[MsrNum].BaseAddress +\r
-              (8 * mMtrrLibFixedMtrrTable[MsrNum].Length)\r
+              mMtrrLibFixedMtrrTable[MsrIndex].BaseAddress +\r
+              (8 * mMtrrLibFixedMtrrTable[MsrIndex].Length)\r
             )\r
           )\r
         ) {\r
             )\r
           )\r
         ) {\r
@@ -509,65 +507,63 @@ MtrrLibProgramFixedMtrr (
     }\r
   }\r
 \r
     }\r
   }\r
 \r
-  if (MsrNum == MTRR_NUMBER_OF_FIXED_MTRR) {\r
-    return RETURN_UNSUPPORTED;\r
-  }\r
+  ASSERT (MsrIndex != ARRAY_SIZE (mMtrrLibFixedMtrrTable));\r
 \r
   //\r
   // Find the begin offset in fixed MTRR and calculate byte offset of left shift\r
   //\r
 \r
   //\r
   // Find the begin offset in fixed MTRR and calculate byte offset of left shift\r
   //\r
-  LeftByteShift = ((UINT32)*Base - mMtrrLibFixedMtrrTable[MsrNum].BaseAddress)\r
-               / mMtrrLibFixedMtrrTable[MsrNum].Length;\r
-\r
-  if (LeftByteShift >= 8) {\r
+  if ((((UINT32)*Base - mMtrrLibFixedMtrrTable[MsrIndex].BaseAddress) % mMtrrLibFixedMtrrTable[MsrIndex].Length) != 0) {\r
+    //\r
+    // Base address should be aligned to the begin of a certain Fixed MTRR range.\r
+    //\r
     return RETURN_UNSUPPORTED;\r
   }\r
     return RETURN_UNSUPPORTED;\r
   }\r
+  LeftByteShift = ((UINT32)*Base - mMtrrLibFixedMtrrTable[MsrIndex].BaseAddress) / mMtrrLibFixedMtrrTable[MsrIndex].Length;\r
+  ASSERT (LeftByteShift < 8);\r
 \r
   //\r
   // Find the end offset in fixed MTRR and calculate byte offset of right shift\r
   //\r
 \r
   //\r
   // Find the end offset in fixed MTRR and calculate byte offset of right shift\r
   //\r
-  SubLength = mMtrrLibFixedMtrrTable[MsrNum].Length * (8 - LeftByteShift);\r
+  SubLength = mMtrrLibFixedMtrrTable[MsrIndex].Length * (8 - LeftByteShift);\r
   if (*Length >= SubLength) {\r
     RightByteShift = 0;\r
   } else {\r
   if (*Length >= SubLength) {\r
     RightByteShift = 0;\r
   } else {\r
-    RightByteShift = 8 - LeftByteShift -\r
-                (UINT32)(*Length) / mMtrrLibFixedMtrrTable[MsrNum].Length;\r
-    if ((LeftByteShift >= 8) ||\r
-        (((UINT32)(*Length) % mMtrrLibFixedMtrrTable[MsrNum].Length) != 0)\r
-        ) {\r
+    if (((UINT32)(*Length) % mMtrrLibFixedMtrrTable[MsrIndex].Length) != 0) {\r
+      //\r
+      // Length should be aligned to the end of a certain Fixed MTRR range.\r
+      //\r
       return RETURN_UNSUPPORTED;\r
     }\r
       return RETURN_UNSUPPORTED;\r
     }\r
+    RightByteShift = 8 - LeftByteShift - (UINT32)(*Length) / mMtrrLibFixedMtrrTable[MsrIndex].Length;\r
     //\r
     // Update SubLength by actual length\r
     //\r
     SubLength = *Length;\r
   }\r
 \r
     //\r
     // Update SubLength by actual length\r
     //\r
     SubLength = *Length;\r
   }\r
 \r
-  ClearMask = CLEAR_SEED;\r
-  OrMask    = MultU64x32 (OR_SEED, (UINT32) Type);\r
+  *ClearMask = CLEAR_SEED;\r
+  *OrMask    = MultU64x32 (OR_SEED, (UINT32) Type);\r
 \r
   if (LeftByteShift != 0) {\r
     //\r
     // Clear the low bits by LeftByteShift\r
     //\r
 \r
   if (LeftByteShift != 0) {\r
     //\r
     // Clear the low bits by LeftByteShift\r
     //\r
-    ClearMask &= LShiftU64 (ClearMask, LeftByteShift * 8);\r
-    OrMask    &= LShiftU64 (OrMask, LeftByteShift * 8);\r
+    *ClearMask &= LShiftU64 (*ClearMask, LeftByteShift * 8);\r
+    *OrMask    &= LShiftU64 (*OrMask,    LeftByteShift * 8);\r
   }\r
 \r
   if (RightByteShift != 0) {\r
     //\r
     // Clear the high bits by RightByteShift\r
     //\r
   }\r
 \r
   if (RightByteShift != 0) {\r
     //\r
     // Clear the high bits by RightByteShift\r
     //\r
-    ClearMask &= RShiftU64 (ClearMask, RightByteShift * 8);\r
-    OrMask    &= RShiftU64 (OrMask, RightByteShift * 8);\r
+    *ClearMask &= RShiftU64 (*ClearMask, RightByteShift * 8);\r
+    *OrMask    &= RShiftU64 (*OrMask,    RightByteShift * 8);\r
   }\r
 \r
   *Length -= SubLength;\r
   *Base   += SubLength;\r
 \r
   }\r
 \r
   *Length -= SubLength;\r
   *Base   += SubLength;\r
 \r
-  *LastMsrNum      = MsrNum;\r
-  *ReturnClearMask = ClearMask;\r
-  *ReturnOrMask    = OrMask;\r
+  *LastMsrIndex    = MsrIndex;\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 \r
   return RETURN_SUCCESS;\r
 }\r