]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MtrrLib: Optimize MtrrLibLeastAlignment()
authorRuiyu Ni <ruiyu.ni@intel.com>
Wed, 27 Sep 2017 09:47:37 +0000 (17:47 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Mon, 16 Oct 2017 05:09:45 +0000 (13:09 +0800)
The patch changes MtrrLibLeastAlignment() to
MtrrLibBiggestAlignment() and optimizes the implementation
to be more efficient.

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 5b21fe11f11147cfeee190797fa798926f367227..0fecc0122ca02620dcc4f7ec2c8fba52ad3a6953 100644 (file)
@@ -656,7 +656,8 @@ MtrrGetMemoryAttributeInVariableMtrr (
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
-  Return the least alignment of address.\r
+  Return the biggest alignment (lowest set bit) of address.\r
+  The function is equivalent to: 1 << LowBitSet64 (Address).\r
 \r
   @param Address    The address to return the alignment.\r
   @param Alignment0 The alignment to return when Address is 0.\r
 \r
   @param Address    The address to return the alignment.\r
   @param Alignment0 The alignment to return when Address is 0.\r
@@ -664,7 +665,7 @@ MtrrGetMemoryAttributeInVariableMtrr (
   @return The least alignment of the Address.\r
 **/\r
 UINT64\r
   @return The least alignment of the Address.\r
 **/\r
 UINT64\r
-MtrrLibLeastAlignment (\r
+MtrrLibBiggestAlignment (\r
   UINT64    Address,\r
   UINT64    Alignment0\r
 )\r
   UINT64    Address,\r
   UINT64    Alignment0\r
 )\r
@@ -673,7 +674,7 @@ MtrrLibLeastAlignment (
     return Alignment0;\r
   }\r
 \r
     return Alignment0;\r
   }\r
 \r
-  return LShiftU64 (1, (UINTN) LowBitSet64 (Address));\r
+  return Address & ((~Address) + 1);\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -705,12 +706,12 @@ MtrrLibGetPositiveMtrrNumber (
   //\r
   for (MtrrNumber = 0; Length != 0; MtrrNumber++) {\r
     if (UseLeastAlignment) {\r
   //\r
   for (MtrrNumber = 0; Length != 0; MtrrNumber++) {\r
     if (UseLeastAlignment) {\r
-      SubLength = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+      SubLength = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
 \r
       if (SubLength > Length) {\r
         //\r
         // Set a flag when remaining length is too small\r
 \r
       if (SubLength > Length) {\r
         //\r
         // Set a flag when remaining length is too small\r
-        //  so that MtrrLibLeastAlignment() is not called in following loops.\r
+        //  so that MtrrLibBiggestAlignment() is not called in following loops.\r
         //\r
         UseLeastAlignment = FALSE;\r
       }\r
         //\r
         UseLeastAlignment = FALSE;\r
       }\r
@@ -873,7 +874,7 @@ MtrrLibGetMtrrNumber (
     // Left subtraction bit by bit, to find the optimal left subtraction solution.\r
     //\r
     for (SubtractiveMtrrNumber = 0, SubtractiveCount = 1; BaseAddress != 0; SubtractiveCount++) {\r
     // Left subtraction bit by bit, to find the optimal left subtraction solution.\r
     //\r
     for (SubtractiveMtrrNumber = 0, SubtractiveCount = 1; BaseAddress != 0; SubtractiveCount++) {\r
-      Alignment = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+      Alignment = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
 \r
       //\r
       // Check whether the memory type of [BaseAddress - Alignment, BaseAddress) can override Type.\r
 \r
       //\r
       // Check whether the memory type of [BaseAddress - Alignment, BaseAddress) can override Type.\r
@@ -928,7 +929,7 @@ MtrrLibGetMtrrNumber (
   //\r
   MiddleMtrrNumber = 0;\r
   while (Length != 0) {\r
   //\r
   MiddleMtrrNumber = 0;\r
   while (Length != 0) {\r
-    BaseAlignment = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+    BaseAlignment = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
     if (BaseAlignment > Length) {\r
       break;\r
     }\r
     if (BaseAlignment > Length) {\r
       break;\r
     }\r
@@ -953,7 +954,7 @@ MtrrLibGetMtrrNumber (
   LeastRightMtrrNumber = MtrrLibGetPositiveMtrrNumber (BaseAddress, Length, Alignment0);\r
 \r
   for (SubtractiveCount = 1; Length < BaseAlignment; SubtractiveCount++) {\r
   LeastRightMtrrNumber = MtrrLibGetPositiveMtrrNumber (BaseAddress, Length, Alignment0);\r
 \r
   for (SubtractiveCount = 1; Length < BaseAlignment; SubtractiveCount++) {\r
-    Alignment = MtrrLibLeastAlignment (BaseAddress + Length, Alignment0);\r
+    Alignment = MtrrLibBiggestAlignment (BaseAddress + Length, Alignment0);\r
     if (!MtrrLibSubstractable (Ranges, RangeCount, Type, BaseAddress + Length, Alignment)) {\r
       break;\r
     }\r
     if (!MtrrLibSubstractable (Ranges, RangeCount, Type, BaseAddress + Length, Alignment)) {\r
       break;\r
     }\r
@@ -1644,7 +1645,7 @@ MtrrLibSetMemoryAttributeInVariableMtrr (
   }\r
 \r
   while (SubtractiveLeft-- != 0) {\r
   }\r
 \r
   while (SubtractiveLeft-- != 0) {\r
-    Alignment = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+    Alignment = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
     ASSERT (Alignment <= Length);\r
 \r
     MtrrLibAddVariableMtrr (Ranges, RangeCount, VariableMtrr, VariableMtrrCapacity, VariableMtrrCount,\r
     ASSERT (Alignment <= Length);\r
 \r
     MtrrLibAddVariableMtrr (Ranges, RangeCount, VariableMtrr, VariableMtrrCapacity, VariableMtrrCount,\r
@@ -1654,7 +1655,7 @@ MtrrLibSetMemoryAttributeInVariableMtrr (
   }\r
 \r
   while (Length != 0) {\r
   }\r
 \r
   while (Length != 0) {\r
-    Alignment = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+    Alignment = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
     if (Alignment > Length) {\r
       break;\r
     }\r
     if (Alignment > Length) {\r
       break;\r
     }\r
@@ -1665,7 +1666,7 @@ MtrrLibSetMemoryAttributeInVariableMtrr (
   }\r
 \r
   while (SubtractiveRight-- != 0) {\r
   }\r
 \r
   while (SubtractiveRight-- != 0) {\r
-    Alignment = MtrrLibLeastAlignment (BaseAddress + Length, Alignment0);\r
+    Alignment = MtrrLibBiggestAlignment (BaseAddress + Length, Alignment0);\r
     MtrrLibAddVariableMtrr (Ranges, RangeCount, VariableMtrr, VariableMtrrCapacity, VariableMtrrCount,\r
                             BaseAddress + Length, Alignment, CacheInvalid, Alignment0);\r
     Length += Alignment;\r
     MtrrLibAddVariableMtrr (Ranges, RangeCount, VariableMtrr, VariableMtrrCapacity, VariableMtrrCount,\r
                             BaseAddress + Length, Alignment, CacheInvalid, Alignment0);\r
     Length += Alignment;\r
@@ -1674,7 +1675,7 @@ MtrrLibSetMemoryAttributeInVariableMtrr (
   UseLeastAlignment = TRUE;\r
   while (Length != 0) {\r
     if (UseLeastAlignment) {\r
   UseLeastAlignment = TRUE;\r
   while (Length != 0) {\r
     if (UseLeastAlignment) {\r
-      Alignment = MtrrLibLeastAlignment (BaseAddress, Alignment0);\r
+      Alignment = MtrrLibBiggestAlignment (BaseAddress, Alignment0);\r
       if (Alignment > Length) {\r
         UseLeastAlignment = FALSE;\r
       }\r
       if (Alignment > Length) {\r
         UseLeastAlignment = FALSE;\r
       }\r