diff options
author | Takuto Naito <naitaku@gmail.com> | 2021-04-12 23:07:18 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2021-04-14 01:50:19 +0000 |
commit | 037090cb7c0063bcb7788982cab73bf7c5b66924 (patch) | |
tree | 4fde3d032a3afec3c394cd203ba948d2dac9885b /MdePkg/Library | |
parent | 83876950ab3cf5278d0ae7542086bd4be75059d3 (diff) | |
download | edk2-037090cb7c0063bcb7788982cab73bf7c5b66924.tar.gz edk2-037090cb7c0063bcb7788982cab73bf7c5b66924.tar.bz2 edk2-037090cb7c0063bcb7788982cab73bf7c5b66924.zip |
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 <naitaku@gmail.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Diffstat (limited to 'MdePkg/Library')
-rw-r--r-- | MdePkg/Library/BaseLib/X64/GccInlinePriv.c | 7 |
1 files changed, 3 insertions, 4 deletions
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"
:
|