From 037090cb7c0063bcb7788982cab73bf7c5b66924 Mon Sep 17 00:00:00 2001 From: Takuto Naito Date: Mon, 12 Apr 2021 23:07:18 +0800 Subject: MdePkg: Fix AsmReadMsr64() and AsmWriteMsr64() with GCC toolchain REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3325 1. AsmReadMsr64() in X64/GccInlinePriv.c AsmReadMsr64 can return uninitialized value if FilterBeforeMsrRead returns False. This causes build error with the CLANG toolchain. 2. AsmWriteMsr64() in X64/GccInlinePriv.c In the case that FilterBeforeMsrWrite changes Value and returns True, The original Value, not the changed Value, is written to the MSR. This behavior is different from the one of AsmWriteMsr64() in X64/WriteMsr64.c for the MSFT toolchain. Signed-off-by: Takuto Naito Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Reviewed-by: Liming Gao --- MdePkg/Library/BaseLib/X64/GccInlinePriv.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'MdePkg') diff --git a/MdePkg/Library/BaseLib/X64/GccInlinePriv.c b/MdePkg/Library/BaseLib/X64/GccInlinePriv.c index e4920f2116..244bd62ee6 100644 --- a/MdePkg/Library/BaseLib/X64/GccInlinePriv.c +++ b/MdePkg/Library/BaseLib/X64/GccInlinePriv.c @@ -80,7 +80,7 @@ AsmReadMsr64 ( } FilterAfterMsrRead (Index, &Value); - return (((UINT64)HighData) << 32) | LowData; + return Value; } /** @@ -111,11 +111,10 @@ AsmWriteMsr64 ( UINT32 HighData; BOOLEAN Flag; - LowData = (UINT32)(Value); - HighData = (UINT32)(Value >> 32); - Flag = FilterBeforeMsrWrite (Index, &Value); if (Flag) { + LowData = (UINT32)(Value); + HighData = (UINT32)(Value >> 32); __asm__ __volatile__ ( "wrmsr" : -- cgit v1.2.3