]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/X64/GccInlinePriv.c
MdePkg/Baseib: Filter/trace MSR access for IA32/X64
[mirror_edk2.git] / MdePkg / Library / BaseLib / X64 / GccInlinePriv.c
index 98be19b3c7b7962fb93f7662f5097a1de3ae9db8..e4920f21165b57a3d45cadf51ae704efa09d081b 100644 (file)
@@ -2,7 +2,7 @@
   GCC inline implementation of BaseLib processor specific functions that use\r
   privlidged instructions.\r
 \r
-  Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -10,6 +10,7 @@
 \r
 \r
 #include "BaseLibInternals.h"\r
+#include <Library/RegisterFilterLib.h>\r
 \r
 /**\r
   Enables CPU interrupts.\r
@@ -64,13 +65,20 @@ AsmReadMsr64 (
 {\r
   UINT32 LowData;\r
   UINT32 HighData;\r
-\r
-  __asm__ __volatile__ (\r
-    "rdmsr"\r
-    : "=a" (LowData),   // %0\r
-      "=d" (HighData)   // %1\r
-    : "c"  (Index)      // %2\r
-    );\r
+  UINT64 Value;\r
+  BOOLEAN Flag;\r
+\r
+  Flag = FilterBeforeMsrRead (Index, &Value);\r
+  if (Flag) {\r
+    __asm__ __volatile__ (\r
+      "rdmsr"\r
+      : "=a" (LowData),   // %0\r
+        "=d" (HighData)   // %1\r
+      : "c"  (Index)      // %2\r
+      );\r
+    Value = (((UINT64)HighData) << 32) | LowData;\r
+  }\r
+  FilterAfterMsrRead (Index, &Value);\r
 \r
   return (((UINT64)HighData) << 32) | LowData;\r
 }\r
@@ -101,17 +109,22 @@ AsmWriteMsr64 (
 {\r
   UINT32 LowData;\r
   UINT32 HighData;\r
+  BOOLEAN Flag;\r
 \r
   LowData  = (UINT32)(Value);\r
   HighData = (UINT32)(Value >> 32);\r
 \r
-  __asm__ __volatile__ (\r
-    "wrmsr"\r
-    :\r
-    : "c" (Index),\r
-      "a" (LowData),\r
-      "d" (HighData)\r
-    );\r
+  Flag = FilterBeforeMsrWrite (Index, &Value);\r
+  if (Flag) {\r
+    __asm__ __volatile__ (\r
+      "wrmsr"\r
+      :\r
+      : "c" (Index),\r
+        "a" (LowData),\r
+        "d" (HighData)\r
+      );\r
+  }\r
+  FilterAfterMsrWrite (Index, &Value);\r
 \r
   return Value;\r
 }\r