From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com []) by mx.groups.io with SMTP id smtpd.web09.6529.1616932987103991041 for ; Sun, 28 Mar 2021 05:03:33 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: dandan.bi@intel.com) IronPort-SDR: R2PB9iEsw0TqjElQGmW7KfQ5E6L07AzVTP9KukUcIeK0fl9QNUt0gKpNKVTNaPjC5F0eawJpR2 fJRzEKtmgOcQ== X-IronPort-AV: E=McAfee;i="6000,8403,9936"; a="276547916" X-IronPort-AV: E=Sophos;i="5.81,285,1610438400"; d="scan'208";a="276547916" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Mar 2021 05:03:32 -0700 IronPort-SDR: ppCTWX3zt+XnlFvyNUaM/T79dBdQiuwklDWHIGk+SUc+WzQCcshwaLPgM9XF97qUDraJA5EJI4 nioNh4/pCrUA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.81,285,1610438400"; d="scan'208";a="377796859" Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.154.141]) by orsmga006.jf.intel.com with ESMTP; 28 Mar 2021 05:03:31 -0700 From: "Dandan Bi" To: devel@edk2.groups.io Cc: Michael D Kinney , Liming Gao , Zhiguang Liu Subject: [patch V4 29/29] MdePkg/Baseib: Filter/trace MSR access for IA32/X64 Date: Sun, 28 Mar 2021 20:02:29 +0800 Message-Id: <20210328120229.24828-30-dandan.bi@intel.com> X-Mailer: git-send-email 2.18.0.windows.1 In-Reply-To: <20210328120229.24828-1-dandan.bi@intel.com> References: <20210328120229.24828-1-dandan.bi@intel.com> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3246 Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Signed-off-by: Dandan Bi Acked-by: Ard Biesheuvel Reviewed-by: Liming Gao --- MdePkg/Library/BaseLib/BaseLib.inf | 5 ++- MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c | 38 +++++++++++------- MdePkg/Library/BaseLib/Ia32/ReadMsr64.c | 38 ++++++++++++++++-- MdePkg/Library/BaseLib/Ia32/WriteMsr64.c | 22 +++++++---- MdePkg/Library/BaseLib/X64/GccInlinePriv.c | 43 ++++++++++++++------- MdePkg/Library/BaseLib/X64/ReadMsr64.c | 15 ++++++- MdePkg/Library/BaseLib/X64/WriteMsr64.c | 13 ++++++- 7 files changed, 130 insertions(+), 44 deletions(-) diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 3b85c56c3c..58e29cc7af 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -1,9 +1,9 @@ ## @file # Base Library implementation. # -# Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.
# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
# Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -409,10 +409,13 @@ [Packages] [LibraryClasses] PcdLib DebugLib BaseMemoryLib +[LibraryClasses.X64, LibraryClasses.IA32] + RegisterFilterLib + [Pcd] gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ## SOMETIMES_CONSUMES diff --git a/MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c b/MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c index 30aa63243b..40e8c08beb 100644 --- a/MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c +++ b/MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c @@ -1,17 +1,18 @@ /** @file GCC inline implementation of BaseLib processor specific functions that use privlidged instructions. - Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "BaseLibInternals.h" +#include /** Enables CPU interrupts. Enables CPU interrupts. @@ -61,16 +62,21 @@ EFIAPI AsmReadMsr64 ( IN UINT32 Index ) { UINT64 Data; - - __asm__ __volatile__ ( - "rdmsr" - : "=A" (Data) // %0 - : "c" (Index) // %1 - ); + BOOLEAN Flag; + + Flag = FilterBeforeMsrRead (Index, &Data); + if (Flag) { + __asm__ __volatile__ ( + "rdmsr" + : "=A" (Data) // %0 + : "c" (Index) // %1 + ); + } + FilterAfterMsrRead (Index, &Data); return Data; } /** @@ -95,16 +101,22 @@ EFIAPI AsmWriteMsr64 ( IN UINT32 Index, IN UINT64 Value ) { - __asm__ __volatile__ ( - "wrmsr" - : - : "c" (Index), - "A" (Value) - ); + BOOLEAN Flag; + + Flag = FilterBeforeMsrWrite (Index, &Value); + if (Flag) { + __asm__ __volatile__ ( + "wrmsr" + : + : "c" (Index), + "A" (Value) + ); + } + FilterAfterMsrWrite (Index, &Value); return Value; } /** diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMsr64.c b/MdePkg/Library/BaseLib/Ia32/ReadMsr64.c index 6d2394b1a3..afe3aa5bdc 100644 --- a/MdePkg/Library/BaseLib/Ia32/ReadMsr64.c +++ b/MdePkg/Library/BaseLib/Ia32/ReadMsr64.c @@ -1,15 +1,15 @@ /** @file AsmReadMsr64 function - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ - +#include /** Returns a 64-bit Machine Specific Register(MSR). Reads and returns the 64-bit MSR specified by Index. No parameter checking is @@ -22,16 +22,46 @@ @return The value of the MSR identified by Index. **/ UINT64 -EFIAPI -AsmReadMsr64 ( +AsmReadMsr64Internal ( IN UINT32 Index ) { _asm { mov ecx, Index rdmsr } } +/** + Returns a 64-bit Machine Specific Register(MSR). + + Reads and returns the 64-bit MSR specified by Index. No parameter checking is + performed on Index, and some Index values may cause CPU exceptions. The + caller must either guarantee that Index is valid, or the caller must set up + exception handlers to catch the exceptions. This function is only available + on IA-32 and x64. + + @param Index The 32-bit MSR index to read. + + @return The value of the MSR identified by Index. + +**/ +UINT64 +EFIAPI +AsmReadMsr64 ( + IN UINT32 Index + ) +{ + UINT64 Value; + BOOLEAN Flag; + + Flag = FilterBeforeMsrRead (Index, &Value); + if (Flag) { + Value = AsmReadMsr64Internal (Index); + } + FilterAfterMsrRead (Index, &Value); + + return Value; +} diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMsr64.c b/MdePkg/Library/BaseLib/Ia32/WriteMsr64.c index badf1d8e58..ba0cf3f74c 100644 --- a/MdePkg/Library/BaseLib/Ia32/WriteMsr64.c +++ b/MdePkg/Library/BaseLib/Ia32/WriteMsr64.c @@ -1,15 +1,15 @@ /** @file AsmWriteMsr64 function - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ - +#include /** Writes a 64-bit value to a Machine Specific Register(MSR), and returns the value. @@ -31,13 +31,21 @@ EFIAPI AsmWriteMsr64 ( IN UINT32 Index, IN UINT64 Value ) { - _asm { - mov edx, dword ptr [Value + 4] - mov eax, dword ptr [Value + 0] - mov ecx, Index - wrmsr + BOOLEAN Flag; + + Flag = FilterBeforeMsrWrite (Index, &Value); + if (Flag) { + _asm { + mov edx, dword ptr [Value + 4] + mov eax, dword ptr [Value + 0] + mov ecx, Index + wrmsr + } } + FilterAfterMsrWrite (Index, &Value); + + return Value; } diff --git a/MdePkg/Library/BaseLib/X64/GccInlinePriv.c b/MdePkg/Library/BaseLib/X64/GccInlinePriv.c index 98be19b3c7..e4920f2116 100644 --- a/MdePkg/Library/BaseLib/X64/GccInlinePriv.c +++ b/MdePkg/Library/BaseLib/X64/GccInlinePriv.c @@ -1,17 +1,18 @@ /** @file GCC inline implementation of BaseLib processor specific functions that use privlidged instructions. - Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "BaseLibInternals.h" +#include /** Enables CPU interrupts. Enables CPU interrupts. @@ -62,17 +63,24 @@ AsmReadMsr64 ( IN UINT32 Index ) { UINT32 LowData; UINT32 HighData; - - __asm__ __volatile__ ( - "rdmsr" - : "=a" (LowData), // %0 - "=d" (HighData) // %1 - : "c" (Index) // %2 - ); + UINT64 Value; + BOOLEAN Flag; + + Flag = FilterBeforeMsrRead (Index, &Value); + if (Flag) { + __asm__ __volatile__ ( + "rdmsr" + : "=a" (LowData), // %0 + "=d" (HighData) // %1 + : "c" (Index) // %2 + ); + Value = (((UINT64)HighData) << 32) | LowData; + } + FilterAfterMsrRead (Index, &Value); return (((UINT64)HighData) << 32) | LowData; } /** @@ -99,21 +107,26 @@ AsmWriteMsr64 ( IN UINT64 Value ) { UINT32 LowData; UINT32 HighData; + BOOLEAN Flag; LowData = (UINT32)(Value); HighData = (UINT32)(Value >> 32); - __asm__ __volatile__ ( - "wrmsr" - : - : "c" (Index), - "a" (LowData), - "d" (HighData) - ); + Flag = FilterBeforeMsrWrite (Index, &Value); + if (Flag) { + __asm__ __volatile__ ( + "wrmsr" + : + : "c" (Index), + "a" (LowData), + "d" (HighData) + ); + } + FilterAfterMsrWrite (Index, &Value); return Value; } /** diff --git a/MdePkg/Library/BaseLib/X64/ReadMsr64.c b/MdePkg/Library/BaseLib/X64/ReadMsr64.c index 5ee7ca53f3..36a349432c 100644 --- a/MdePkg/Library/BaseLib/X64/ReadMsr64.c +++ b/MdePkg/Library/BaseLib/X64/ReadMsr64.c @@ -1,17 +1,19 @@ /** @file CpuBreakpoint function. - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ /** Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics. **/ +#include + unsigned __int64 __readmsr (int register); #pragma intrinsic(__readmsr) /** @@ -26,8 +28,17 @@ UINT64 EFIAPI AsmReadMsr64 ( IN UINT32 Index ) { - return __readmsr (Index); + UINT64 Value; + BOOLEAN Flag; + + Flag = FilterBeforeMsrRead (Index, &Value); + if (Flag) { + Value = __readmsr (Index); + } + FilterAfterMsrRead (Index, &Value); + + return Value; } diff --git a/MdePkg/Library/BaseLib/X64/WriteMsr64.c b/MdePkg/Library/BaseLib/X64/WriteMsr64.c index 98c5458d8a..bb030832c4 100644 --- a/MdePkg/Library/BaseLib/X64/WriteMsr64.c +++ b/MdePkg/Library/BaseLib/X64/WriteMsr64.c @@ -1,17 +1,19 @@ /** @file CpuBreakpoint function. - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ /** Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics. **/ +#include + void __writemsr (unsigned long Register, unsigned __int64 Value); #pragma intrinsic(__writemsr) /** @@ -28,9 +30,16 @@ EFIAPI AsmWriteMsr64 ( IN UINT32 Index, IN UINT64 Value ) { - __writemsr (Index, Value); + BOOLEAN Flag; + + Flag = FilterBeforeMsrWrite (Index, &Value); + if (Flag) { + __writemsr (Index, Value); + } + FilterAfterMsrWrite (Index, &Value); + return Value; } -- 2.18.0.windows.1