]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MtrrLib/MtrrLib.c
UefiCpuPkg/MtrrLib: Refine the debug messages
[mirror_edk2.git] / UefiCpuPkg / Library / MtrrLib / MtrrLib.c
index 2fd1d0153ee6d9f5accfecd99c3271101ab1d69e..ddf90e2a8c0fea3e035a642958549f5020d16889 100644 (file)
@@ -5,7 +5,7 @@
     Most of services in this library instance are suggested to be invoked by BSP only,\r
     except for MtrrSetAllMtrrs() which is used to sync BSP's MTRR setting to APs.\r
 \r
-  Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -1570,7 +1570,7 @@ MtrrLibCalculateMtrrs (
   //\r
   VectorCount = VectorIndex + 1;\r
   DEBUG ((\r
-    DEBUG_CACHE, "VectorCount (%016lx - %016lx) = %d\n", \r
+    DEBUG_CACHE, "  VectorCount (%016lx - %016lx) = %d\n",\r
     Ranges[0].BaseAddress, Ranges[RangeCount - 1].BaseAddress + Ranges[RangeCount - 1].Length, VectorCount\r
     ));\r
   ASSERT (VectorCount < MAX_UINT16);\r
@@ -1683,7 +1683,7 @@ MtrrLibCalculateMtrrs (
 \r
 \r
 /**\r
-  Apply the variable MTRR settings to memory range array.\r
+  Apply the fixed MTRR settings to memory range array.\r
 \r
   @param Fixed             The fixed MTRR settings.\r
   @param Ranges            Return the memory range array holding memory type\r
@@ -2114,22 +2114,32 @@ MtrrLibSetBelow1MBMemoryAttribute (
   UINT64                    OrMask;\r
   UINT64                    ClearMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];\r
   UINT64                    OrMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];\r
+  BOOLEAN                   LocalModified[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];\r
 \r
   ASSERT (BaseAddress < BASE_1MB);\r
 \r
+  SetMem (LocalModified, sizeof (LocalModified), FALSE);\r
+\r
+  //\r
+  // (Value & ~0 | 0) still equals to (Value)\r
+  //\r
+  SetMem (ClearMasks, sizeof (ClearMasks), 0);\r
+  SetMem (OrMasks, sizeof (OrMasks), 0);\r
+\r
   MsrIndex = (UINT32)-1;\r
   while ((BaseAddress < BASE_1MB) && (Length != 0)) {\r
     Status = MtrrLibProgramFixedMtrr (Type, &BaseAddress, &Length, &MsrIndex, &ClearMask, &OrMask);\r
     if (RETURN_ERROR (Status)) {\r
       return Status;\r
     }\r
-    ClearMasks[MsrIndex] = ClearMask;\r
-    OrMasks[MsrIndex]    = OrMask;\r
-    Modified[MsrIndex]   = TRUE;\r
+    ClearMasks[MsrIndex]    = ClearMask;\r
+    OrMasks[MsrIndex]       = OrMask;\r
+    Modified[MsrIndex]      = TRUE;\r
+    LocalModified[MsrIndex] = TRUE;\r
   }\r
 \r
   for (MsrIndex = 0; MsrIndex < ARRAY_SIZE (mMtrrLibFixedMtrrTable); MsrIndex++) {\r
-    if (Modified[MsrIndex]) {\r
+    if (LocalModified[MsrIndex]) {\r
       FixedSettings->Mtrr[MsrIndex] = (FixedSettings->Mtrr[MsrIndex] & ~ClearMasks[MsrIndex]) | OrMasks[MsrIndex];\r
     }\r
   }\r
@@ -2148,7 +2158,7 @@ MtrrLibSetBelow1MBMemoryAttribute (
                                 When range overlap happens, the last one takes higher priority.\r
                                 When the function returns, either all the attributes are set successfully,\r
                                 or none of them is set.\r
-  @param[in]                    Count of MTRR_MEMORY_RANGE.\r
+  @param[in]       RangeCount   Count of MTRR_MEMORY_RANGE.\r
 \r
   @retval RETURN_SUCCESS            The attributes were set for all the memory ranges.\r
   @retval RETURN_INVALID_PARAMETER  Length in any range is zero.\r
@@ -2199,6 +2209,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
   MTRR_CONTEXT              MtrrContext;\r
   BOOLEAN                   MtrrContextValid;\r
 \r
+  Status = RETURN_SUCCESS;\r
   MtrrLibInitializeMtrrMask (&MtrrValidBitsMask, &MtrrValidAddressMask);\r
 \r
   //\r
@@ -2216,24 +2227,48 @@ MtrrSetMemoryAttributesInMtrrSettings (
   Above1MbExist             = FALSE;\r
   OriginalVariableMtrrCount = 0;\r
 \r
+  //\r
+  // 0. Dump the requests.\r
+  //\r
+  DEBUG_CODE (\r
+    DEBUG ((DEBUG_CACHE, "Mtrr: Set Mem Attribute to %a, ScratchSize = %x%a",\r
+            (MtrrSetting == NULL) ? "Hardware" : "Buffer", *ScratchSize,\r
+            (RangeCount <= 1) ? "," : "\n"\r
+            ));\r
+    for (Index = 0; Index < RangeCount; Index++) {\r
+      DEBUG ((DEBUG_CACHE, " %a: [%016lx, %016lx)\n",\r
+              mMtrrMemoryCacheTypeShortName[MIN (Ranges[Index].Type, CacheInvalid)],\r
+              Ranges[Index].BaseAddress, Ranges[Index].BaseAddress + Ranges[Index].Length\r
+              ));\r
+    }\r
+  );\r
+\r
   //\r
   // 1. Validate the parameters.\r
   //\r
+  if (!IsMtrrSupported ()) {\r
+    Status = RETURN_UNSUPPORTED;\r
+    goto Exit;\r
+  }\r
+\r
   for (Index = 0; Index < RangeCount; Index++) {\r
     if (Ranges[Index].Length == 0) {\r
-      return RETURN_INVALID_PARAMETER;\r
+      Status = RETURN_INVALID_PARAMETER;\r
+      goto Exit;\r
     }\r
     if (((Ranges[Index].BaseAddress & ~MtrrValidAddressMask) != 0) ||\r
         ((Ranges[Index].Length & ~MtrrValidAddressMask) != 0)\r
         ) {\r
-      return RETURN_UNSUPPORTED;\r
+      Status = RETURN_UNSUPPORTED;\r
+      goto Exit;\r
     }\r
     if ((Ranges[Index].Type != CacheUncacheable) &&\r
         (Ranges[Index].Type != CacheWriteCombining) &&\r
         (Ranges[Index].Type != CacheWriteThrough) &&\r
         (Ranges[Index].Type != CacheWriteProtected) &&\r
         (Ranges[Index].Type != CacheWriteBack)) {\r
-      return RETURN_INVALID_PARAMETER;\r
+      Status = RETURN_INVALID_PARAMETER;\r
+      goto Exit;\r
     }\r
     if (Ranges[Index].BaseAddress + Ranges[Index].Length > BASE_1MB) {\r
       Above1MbExist = TRUE;\r
@@ -2299,7 +2334,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
       if (Status == RETURN_ALREADY_STARTED) {\r
         Status = RETURN_SUCCESS;\r
       } else if (Status == RETURN_OUT_OF_RESOURCES) {\r
-        return Status;\r
+        goto Exit;\r
       } else {\r
         ASSERT_RETURN_ERROR (Status);\r
         Modified = TRUE;\r
@@ -2317,7 +2352,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
                  WorkingVariableMtrr, FirmwareVariableMtrrCount + 1, &WorkingVariableMtrrCount\r
                  );\r
       if (RETURN_ERROR (Status)) {\r
-        return Status;\r
+        goto Exit;\r
       }\r
 \r
       //\r
@@ -2336,7 +2371,8 @@ MtrrSetMemoryAttributesInMtrrSettings (
       }\r
 \r
       if (WorkingVariableMtrrCount > FirmwareVariableMtrrCount) {\r
-        return RETURN_OUT_OF_RESOURCES;\r
+        Status = RETURN_OUT_OF_RESOURCES;\r
+        goto Exit;\r
       }\r
 \r
       //\r
@@ -2354,6 +2390,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
   //\r
   // 3. Apply the below-1MB memory attribute settings.\r
   //\r
+  ZeroMem (WorkingFixedSettings.Mtrr, sizeof (WorkingFixedSettings.Mtrr));\r
   for (Index = 0; Index < RangeCount; Index++) {\r
     if (Ranges[Index].BaseAddress >= BASE_1MB) {\r
       continue;\r
@@ -2364,7 +2401,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
                Ranges[Index].BaseAddress, Ranges[Index].Length, Ranges[Index].Type\r
                );\r
     if (RETURN_ERROR (Status)) {\r
-      return Status;\r
+      goto Exit;\r
     }\r
   }\r
 \r
@@ -2430,7 +2467,12 @@ MtrrSetMemoryAttributesInMtrrSettings (
     }\r
   }\r
 \r
-  return RETURN_SUCCESS;\r
+Exit:\r
+  DEBUG ((DEBUG_CACHE, "  Result = %r\n", Status));\r
+  if (!RETURN_ERROR (Status)) {\r
+    MtrrDebugPrintAllMtrrsWorker (MtrrSetting);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -2464,28 +2506,15 @@ MtrrSetMemoryAttributeInMtrrSettings (
   IN MTRR_MEMORY_CACHE_TYPE  Attribute\r
   )\r
 {\r
-  RETURN_STATUS              Status;\r
   UINT8                      Scratch[SCRATCH_BUFFER_SIZE];\r
   UINTN                      ScratchSize;\r
   MTRR_MEMORY_RANGE          Range;\r
 \r
-  if (!IsMtrrSupported ()) {\r
-    return RETURN_UNSUPPORTED;\r
-  }\r
-\r
   Range.BaseAddress = BaseAddress;\r
   Range.Length      = Length;\r
   Range.Type        = Attribute;\r
   ScratchSize = sizeof (Scratch);\r
-  Status = MtrrSetMemoryAttributesInMtrrSettings (MtrrSetting, Scratch, &ScratchSize, &Range, 1);\r
-  DEBUG ((DEBUG_CACHE, "MtrrSetMemoryAttribute(MtrrSettings = %p) %s: [%016lx, %016lx) - %x\n",\r
-          MtrrSetting,\r
-          mMtrrMemoryCacheTypeShortName[Attribute], BaseAddress, BaseAddress + Length, Status));\r
-\r
-  if (!RETURN_ERROR (Status)) {\r
-    MtrrDebugPrintAllMtrrsWorker (MtrrSetting);\r
-  }\r
-  return Status;\r
+  return MtrrSetMemoryAttributesInMtrrSettings (MtrrSetting, Scratch, &ScratchSize, &Range, 1);\r
 }\r
 \r
 /**\r
@@ -2776,6 +2805,8 @@ MtrrDebugPrintAllMtrrsWorker (
     UINTN             RangeCount;\r
     UINT64            MtrrValidBitsMask;\r
     UINT64            MtrrValidAddressMask;\r
+    UINT32            VariableMtrrCount;\r
+    BOOLEAN           ContainVariableMtrr;\r
     MTRR_MEMORY_RANGE Ranges[\r
       ARRAY_SIZE (mMtrrLibFixedMtrrTable) * sizeof (UINT64) + 2 * ARRAY_SIZE (Mtrrs->Variables.Mtrr) + 1\r
       ];\r
@@ -2785,6 +2816,8 @@ MtrrDebugPrintAllMtrrsWorker (
       return;\r
     }\r
 \r
+    VariableMtrrCount = GetVariableMtrrCountWorker ();\r
+\r
     if (MtrrSetting != NULL) {\r
       Mtrrs = MtrrSetting;\r
     } else {\r
@@ -2795,32 +2828,36 @@ MtrrDebugPrintAllMtrrsWorker (
     //\r
     // Dump RAW MTRR contents\r
     //\r
-    DEBUG((DEBUG_CACHE, "MTRR Settings\n"));\r
-    DEBUG((DEBUG_CACHE, "=============\n"));\r
-    DEBUG((DEBUG_CACHE, "MTRR Default Type: %016lx\n", Mtrrs->MtrrDefType));\r
+    DEBUG ((DEBUG_CACHE, "MTRR Settings:\n"));\r
+    DEBUG ((DEBUG_CACHE, "=============\n"));\r
+    DEBUG ((DEBUG_CACHE, "MTRR Default Type: %016lx\n", Mtrrs->MtrrDefType));\r
     for (Index = 0; Index < ARRAY_SIZE (mMtrrLibFixedMtrrTable); Index++) {\r
-      DEBUG((DEBUG_CACHE, "Fixed MTRR[%02d]   : %016lx\n", Index, Mtrrs->Fixed.Mtrr[Index]));\r
+      DEBUG ((DEBUG_CACHE, "Fixed MTRR[%02d]   : %016lx\n", Index, Mtrrs->Fixed.Mtrr[Index]));\r
     }\r
-\r
-    for (Index = 0; Index < ARRAY_SIZE (Mtrrs->Variables.Mtrr); Index++) {\r
+    ContainVariableMtrr = FALSE;\r
+    for (Index = 0; Index < VariableMtrrCount; Index++) {\r
       if (((MSR_IA32_MTRR_PHYSMASK_REGISTER *)&Mtrrs->Variables.Mtrr[Index].Mask)->Bits.V == 0) {\r
         //\r
         // If mask is not valid, then do not display range\r
         //\r
         continue;\r
       }\r
+      ContainVariableMtrr = TRUE;\r
       DEBUG ((DEBUG_CACHE, "Variable MTRR[%02d]: Base=%016lx Mask=%016lx\n",\r
         Index,\r
         Mtrrs->Variables.Mtrr[Index].Base,\r
         Mtrrs->Variables.Mtrr[Index].Mask\r
         ));\r
     }\r
+    if (!ContainVariableMtrr) {\r
+      DEBUG ((DEBUG_CACHE, "Variable MTRR    : None.\n"));\r
+    }\r
     DEBUG((DEBUG_CACHE, "\n"));\r
 \r
     //\r
     // Dump MTRR setting in ranges\r
     //\r
-    DEBUG((DEBUG_CACHE, "MTRR Ranges\n"));\r
+    DEBUG((DEBUG_CACHE, "Memory Ranges:\n"));\r
     DEBUG((DEBUG_CACHE, "====================================\n"));\r
     MtrrLibInitializeMtrrMask (&MtrrValidBitsMask, &MtrrValidAddressMask);\r
     Ranges[0].BaseAddress = 0;\r
@@ -2829,11 +2866,11 @@ MtrrDebugPrintAllMtrrsWorker (
     RangeCount = 1;\r
 \r
     MtrrLibGetRawVariableRanges (\r
-      &Mtrrs->Variables, ARRAY_SIZE (Mtrrs->Variables.Mtrr),\r
+      &Mtrrs->Variables, VariableMtrrCount,\r
       MtrrValidBitsMask, MtrrValidAddressMask, RawVariableRanges\r
       );\r
     MtrrLibApplyVariableMtrrs (\r
-      RawVariableRanges, ARRAY_SIZE (RawVariableRanges),\r
+      RawVariableRanges, VariableMtrrCount,\r
       Ranges, ARRAY_SIZE (Ranges), &RangeCount\r
       );\r
 \r