diff --git a/BootloaderCommonPkg/Include/Library/MtrrLib.h b/BootloaderCommonPkg/Include/Library/MtrrLib.h
new file mode 100644
index 00000000..6deba0a7
--- /dev/null
+++ b/BootloaderCommonPkg/Include/Library/MtrrLib.h
@@ -0,0 +1,27 @@
+/** @file
+ This library class defines a set of methods related with MTRR.
+
+Copyright (c) 2020, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __MTRR_LIB_H__
+#define __MTRR_LIB_H__
+
+#include
+
+
+/**
+ Print MTRR settings.
+
+ @param[in] Str A string will be print before MTRR data if it is not NULL.
+
+**/
+VOID
+EFIAPI
+PrintMtrr (
+ IN CHAR8 *Str
+ );
+
+#endif
diff --git a/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.c b/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.c
new file mode 100644
index 00000000..abfcbba3
--- /dev/null
+++ b/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.c
@@ -0,0 +1,105 @@
+/** @file
+ MTRR related functions.
+
+Copyright (c) 2020, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include
+#include
+
+/**
+ Convert the MTRR memory type to a readable str
+
+ @param[in] type MTRR type to convert to a string.
+
+ @retval String return based on the MTRR type
+
+**/
+CONST CHAR8*
+MtrrTypeToStr (
+ IN UINTN Type
+ )
+{
+ switch (Type) {
+ case 0x00:
+ return "Uncacheable";
+ case 0x01:
+ return "Write Combining";
+ case 0x04:
+ return "Write-Through";
+ case 0x05:
+ return "Write-Protected";
+ case 0x06:
+ return "Write-Back";
+ default:
+ return "Unknown";
+ }
+}
+
+/**
+ Print MTRR settings
+
+ @param[in] Str A string will be print before MTRR data if it is not NULL.
+
+**/
+VOID
+EFIAPI
+PrintMtrr (
+ IN CHAR8 *Str
+ )
+{
+ UINT32 Index;
+ UINT32 BaseMsr;
+ UINT32 MaskMsr;
+ UINT32 Type;
+ BOOLEAN MtrrEnabled;
+ BOOLEAN FixedMtrrEnabled;
+ BOOLEAN Valid;
+ UINT64 DefType;
+ UINT64 BaseVal;
+ UINT64 Base;
+ UINT64 MaskVal;
+ UINT64 Mask;
+ UINT64 Range;
+ UINT64 Limit;
+
+ if (Str != NULL) {
+ DEBUG ((DEBUG_INFO, "%a\n", Str));
+ }
+
+ // Dump IA32_MTRR_DEF_TYPE
+ DefType = AsmReadMsr64 (0x2ff);
+ MtrrEnabled = ((DefType & (1 << 11)) != 0);
+ FixedMtrrEnabled = ((DefType & (1 << 10)) != 0);
+ DEBUG ((DEBUG_INFO, "MTRRs..............: %a\n", MtrrEnabled ? "Enabled" : "Disabled"));
+ DEBUG ((DEBUG_INFO, "Fixed MTRRs........: %a\n", FixedMtrrEnabled ? "Enabled" : "Disabled"));
+ DEBUG ((DEBUG_INFO, "Default............: %a\n\n", MtrrTypeToStr (DefType & 0xff)));
+
+ // Dump Variable MTRR registers
+ DEBUG ((DEBUG_INFO, "Variable MTRRs\n"));
+ for (Index = 0; Index < 10; Index++) {
+ BaseMsr = 0x200 + (Index * 2);
+ MaskMsr = BaseMsr + 1;
+
+ BaseVal = AsmReadMsr64 (BaseMsr);
+ MaskVal = AsmReadMsr64 (MaskMsr);
+
+ Valid = ((MaskVal & (1 << 11)) != 0);
+ if (!Valid) {
+ continue;
+ }
+
+ Type = BaseVal & 0xff;
+ Base = BaseVal & 0xffffff000ull;
+ Mask = MaskVal & 0xffffff000ull;
+ Range = (~Mask & 0xfffffffffull);
+ Limit = Base + Range;
+
+ DEBUG ((DEBUG_INFO, "[0x%09llx-0x%09llx] %a\n", Base, Limit, MtrrTypeToStr (Type)));
+ DEBUG ((DEBUG_INFO, " IA32_MTRR_PHYSBASE_%d (0x%x): 0x%016llx\n", Index, BaseMsr, BaseVal));
+ DEBUG ((DEBUG_INFO, " IA32_MTRR_PHYSMASK_%d (0x%x): 0x%016llx\n", Index, MaskMsr, MaskVal));
+ }
+}
+
diff --git a/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.inf b/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.inf
new file mode 100644
index 00000000..f4d392f3
--- /dev/null
+++ b/BootloaderCommonPkg/Library/MtrrLib/MtrrLib.inf
@@ -0,0 +1,35 @@
+## @file
+#
+# Copyright (c) 2020, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = MtrrLib
+ FILE_GUID = AF1550E2-3ED3-4DBD-9846-2A9F3A877885
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = MtrrLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[Sources]
+ MtrrLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ BootloaderCommonPkg/BootloaderCommonPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ DebugLib
+
+[Guids]
+
+[Pcd]
diff --git a/BootloaderCommonPkg/Library/ShellLib/CmdMtrr.c b/BootloaderCommonPkg/Library/ShellLib/CmdMtrr.c
index 15eaff36..e53b20e8 100644
--- a/BootloaderCommonPkg/Library/ShellLib/CmdMtrr.c
+++ b/BootloaderCommonPkg/Library/ShellLib/CmdMtrr.c
@@ -83,9 +83,21 @@ ShellCommandMtrrFunc (
IN CHAR16 *Argv[]
)
{
- UINT32 Index, BaseMsr, MaskMsr, Type;
- BOOLEAN MtrrEnabled, FixedMtrrEnabled, Valid, Verbose;
- UINT64 DefType, BaseVal, Base, MaskVal, Mask, Range, Limit;
+ UINT32 Index;
+ UINT32 BaseMsr;
+ UINT32 MaskMsr;
+ UINT32 Type;
+ BOOLEAN MtrrEnabled;
+ BOOLEAN FixedMtrrEnabled;
+ BOOLEAN Valid;
+ UINT64 DefType;
+ UINT64 BaseVal;
+ UINT64 Base;
+ UINT64 MaskVal;
+ UINT64 Mask;
+ UINT64 Range;
+ UINT64 Limit;
+ BOOLEAN Verbose;
Verbose = FALSE;
diff --git a/BootloaderCorePkg/BootloaderCorePkg.dsc b/BootloaderCorePkg/BootloaderCorePkg.dsc
index 45866ce1..0e8cd390 100644
--- a/BootloaderCorePkg/BootloaderCorePkg.dsc
+++ b/BootloaderCorePkg/BootloaderCorePkg.dsc
@@ -117,6 +117,7 @@
SerialPortLib|BootloaderCommonPkg/Library/SerialPortLib/SerialPortLib.inf
SortLib|BootloaderCommonPkg/Library/SortLib/SortLib.inf
IoMmuLib|BootloaderCommonPkg/Library/IoMmuLib/IoMmuLib.inf
+ MtrrLib|BootloaderCommonPkg/Library/MtrrLib/MtrrLib.inf
!if $(ENABLE_SOURCE_DEBUG)
DebugAgentLib|BootloaderCommonPkg/Library/DebugAgentLib/DebugAgentLib.inf