mirror of https://github.com/acidanthera/audk.git
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>
This commit is contained in:
parent
83876950ab
commit
037090cb7c
|
@ -80,7 +80,7 @@ AsmReadMsr64 (
|
||||||
}
|
}
|
||||||
FilterAfterMsrRead (Index, &Value);
|
FilterAfterMsrRead (Index, &Value);
|
||||||
|
|
||||||
return (((UINT64)HighData) << 32) | LowData;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,11 +111,10 @@ AsmWriteMsr64 (
|
||||||
UINT32 HighData;
|
UINT32 HighData;
|
||||||
BOOLEAN Flag;
|
BOOLEAN Flag;
|
||||||
|
|
||||||
LowData = (UINT32)(Value);
|
|
||||||
HighData = (UINT32)(Value >> 32);
|
|
||||||
|
|
||||||
Flag = FilterBeforeMsrWrite (Index, &Value);
|
Flag = FilterBeforeMsrWrite (Index, &Value);
|
||||||
if (Flag) {
|
if (Flag) {
|
||||||
|
LowData = (UINT32)(Value);
|
||||||
|
HighData = (UINT32)(Value >> 32);
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"wrmsr"
|
"wrmsr"
|
||||||
:
|
:
|
||||||
|
|
Loading…
Reference in New Issue