]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MtrrLib: Remove the loop of calculating Fixed-MTRR Mask
authorJeff Fan <jeff.fan@intel.com>
Thu, 21 Apr 2016 02:28:17 +0000 (10:28 +0800)
committerJeff Fan <jeff.fan@intel.com>
Fri, 29 Apr 2016 02:07:07 +0000 (10:07 +0800)
Introduce the 32bit mask seeds to calculate Fixed-MTRR or&and mask values. It
could avoid the loop operation and 64bit shift operations.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
UefiCpuPkg/Library/MtrrLib/MtrrLib.c

index 06a361bd84334cba939a3e4925a0f92fa4f51a76..c4a39b554d064b08238d3e896b8d99ca58902b6d 100644 (file)
@@ -20,6 +20,9 @@
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
 \r
+#define OR_SEED      0x01010101\r
+#define CLEAR_SEED   0xFFFFFFFF\r
+\r
 //\r
 // Context to save and restore when MTRRs are programmed\r
 //\r
@@ -460,11 +463,12 @@ ProgramFixedMtrr (
 {\r
   UINT32  MsrNum;\r
   UINT32  ByteShift;\r
-  UINT64  OrMask;\r
-  UINT64  ClearMask;\r
+  UINT32  OrMask[2];\r
+  UINT32  ClearMask[2];\r
+  UINT64  SubLength;\r
 \r
-  OrMask    = 0;\r
-  ClearMask = 0;\r
+  *(UINT64 *)OrMask    = 0;\r
+  *(UINT64 *)ClearMask = 0;\r
 \r
   for (MsrNum = *LastMsrNum + 1; MsrNum < MTRR_NUMBER_OF_FIXED_MTRR; MsrNum++) {\r
     if ((*Base >= mMtrrLibFixedMtrrTable[MsrNum].BaseAddress) &&\r
@@ -493,24 +497,27 @@ ProgramFixedMtrr (
     return RETURN_UNSUPPORTED;\r
   }\r
 \r
-  for (\r
-        ;\r
-        ((ByteShift < 8) && (*Length >= mMtrrLibFixedMtrrTable[MsrNum].Length));\r
-        ByteShift++\r
-      ) {\r
-    OrMask |= LShiftU64 ((UINT64) MemoryCacheType, (UINT32) (ByteShift * 8));\r
-    ClearMask |= LShiftU64 ((UINT64) 0xFF, (UINT32) (ByteShift * 8));\r
-    *Length -= mMtrrLibFixedMtrrTable[MsrNum].Length;\r
-    *Base += mMtrrLibFixedMtrrTable[MsrNum].Length;\r
+  if (ByteShift < 4) {\r
+    OrMask[0]    = OR_SEED * (UINT32)MemoryCacheType;\r
+    ClearMask[0] = CLEAR_SEED;\r
+    OrMask[1]    = (OR_SEED * (UINT32)MemoryCacheType) >> ((4 - ByteShift) * 8);\r
+    ClearMask[1] = CLEAR_SEED >> ((4 - ByteShift) * 8);\r
+  } else {\r
+    OrMask[0]    = (OR_SEED * (UINT32)MemoryCacheType) >> ((8 - ByteShift) * 8);\r
+    ClearMask[0] = CLEAR_SEED >> ((8 - ByteShift) * 8);\r
   }\r
 \r
-  if (ByteShift < 8 && (*Length != 0)) {\r
+  SubLength = mMtrrLibFixedMtrrTable[MsrNum].Length * (8 - ByteShift);\r
+  if (*Length < SubLength) {\r
     return RETURN_UNSUPPORTED;\r
   }\r
 \r
+  *Length -= SubLength;\r
+  *Base   += SubLength;\r
+\r
   *LastMsrNum      = MsrNum;\r
-  *ReturnClearMask = ClearMask;\r
-  *ReturnOrMask    = OrMask;\r
+  *ReturnClearMask = *(UINT64 *)ClearMask;\r
+  *ReturnOrMask    = *(UINT64 *)OrMask;\r
 \r
   return RETURN_SUCCESS;\r
 }\r