summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoth, Michael via groups.io <Michael.Roth=amd.com@groups.io>2023-04-26 04:32:57 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-04-26 13:39:01 +0000
commitce781cf8bb5e72d130b1db6a242c3bd312f5eb40 (patch)
treef847f5a1f66341ed94c8a681ba9c2d0c9a6ed202
parente5c7d0b017dd20a283ab5765a5d444ab38f7a4c6 (diff)
downloadedk2-ce781cf8bb5e72d130b1db6a242c3bd312f5eb40.tar.gz
edk2-ce781cf8bb5e72d130b1db6a242c3bd312f5eb40.tar.bz2
edk2-ce781cf8bb5e72d130b1db6a242c3bd312f5eb40.zip
OvmfPkg/CcExitLib: Fix SEV-SNP XSave area size calculation
CPUID leaf 0xD sub-leafs 0x0 and 0x1 contain cumulative sizes for the enabled XSave areas. Those sizes are calculated by tallying up all the other sub-leafs that contain per-area size information for XSave areas that are currently enabled in XCr0/XSS. The current check has the logic inverted. Fix that. This doesn't seem to cause problems currently, but could in the future if OVMF made more extensive use of XSave areas. It was noticed while implementing SNP-related tests for KVM Unit Tests, which re-uses the OVMF #VC handler in some cases. Reported-by: Pavan Kumar Paluri <papaluri@amd.com> Cc: Pavan Kumar Paluri <papaluri@amd.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Acked-by: Jiewen Yao <jiewen.yao@intel.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Michael Roth <michael.roth@amd.com>
-rw-r--r--OvmfPkg/Library/CcExitLib/CcExitVcHandler.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c b/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
index 7fe11c5324..94f0c4872c 100644
--- a/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
+++ b/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
@@ -1145,9 +1145,7 @@ GetCpuidXSaveSize (
for (Idx = 0; Idx < CpuidInfo->Count; Idx++) {
SEV_SNP_CPUID_FUNCTION *CpuidFn = &CpuidInfo->function[Idx];
- if (!((CpuidFn->EaxIn == 0xD) &&
- ((CpuidFn->EcxIn == 0) || (CpuidFn->EcxIn == 1))))
- {
+ if (!((CpuidFn->EaxIn == 0xD) && (CpuidFn->EcxIn > 1))) {
continue;
}