OvmfPkg/ResetVector: split SEV and non-CoCo workflows

Use separate control flows for SEV and non-CoCo cases.

SevClearPageEncMaskForGhcbPage and GetSevCBitMaskAbove31 will now only
be called when running in SEV mode, so the SEV check in these functions
is not needed any more.

No functional change.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20240301074402.98625-6-kraxel@redhat.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Oliver Steffen <osteffen@redhat.com>
Cc: Michael Roth <michael.roth@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
[lersek@redhat.com: turn the "Cc:" message headers from Gerd's on-list
 posting into "Cc:" tags in the commit message, in order to pacify
 "PatchCheck.py"]
This commit is contained in:
Gerd Hoffmann 2024-03-01 08:43:57 +01:00 committed by mergify[bot]
parent b7a97bfac5
commit e3bd782373
2 changed files with 15 additions and 16 deletions

View File

@ -154,10 +154,6 @@ SevEsUnexpectedRespTerminate:
; If SEV-ES is enabled then initialize and make the GHCB page shared ; If SEV-ES is enabled then initialize and make the GHCB page shared
SevClearPageEncMaskForGhcbPage: SevClearPageEncMaskForGhcbPage:
; Check if SEV is enabled
cmp byte[WORK_AREA_GUEST_TYPE], 1
jnz SevClearPageEncMaskForGhcbPageExit
; Check if SEV-ES is enabled ; Check if SEV-ES is enabled
mov ecx, 1 mov ecx, 1
bt [SEV_ES_WORK_AREA_STATUS_MSR], ecx bt [SEV_ES_WORK_AREA_STATUS_MSR], ecx
@ -195,20 +191,12 @@ pageTableEntries4kLoop:
SevClearPageEncMaskForGhcbPageExit: SevClearPageEncMaskForGhcbPageExit:
OneTimeCallRet SevClearPageEncMaskForGhcbPage OneTimeCallRet SevClearPageEncMaskForGhcbPage
; Check if SEV is enabled, and get the C-bit mask above 31. ; Get the C-bit mask above 31.
; Modified: EDX ; Modified: EDX
; ;
; The value is returned in the EDX ; The value is returned in the EDX
GetSevCBitMaskAbove31: GetSevCBitMaskAbove31:
xor edx, edx
; Check if SEV is enabled
cmp byte[WORK_AREA_GUEST_TYPE], 1
jnz GetSevCBitMaskAbove31Exit
mov edx, dword[SEV_ES_WORK_AREA_ENC_MASK + 4] mov edx, dword[SEV_ES_WORK_AREA_ENC_MASK + 4]
GetSevCBitMaskAbove31Exit:
OneTimeCallRet GetSevCBitMaskAbove31 OneTimeCallRet GetSevCBitMaskAbove31
%endif %endif

View File

@ -118,15 +118,26 @@ SetCr3ForPageTables64:
; Check whether the SEV is active and populate the SevEsWorkArea ; Check whether the SEV is active and populate the SevEsWorkArea
OneTimeCall CheckSevFeatures OneTimeCall CheckSevFeatures
cmp byte[WORK_AREA_GUEST_TYPE], 1
jz SevInit
;
; normal (non-CoCo) workflow
;
ClearOvmfPageTables
CreatePageTables4Level 0
jmp SetCr3
SevInit:
;
; SEV workflow
;
ClearOvmfPageTables
; If SEV is enabled, the C-bit position is always above 31. ; If SEV is enabled, the C-bit position is always above 31.
; The mask will be saved in the EDX and applied during the ; The mask will be saved in the EDX and applied during the
; the page table build below. ; the page table build below.
OneTimeCall GetSevCBitMaskAbove31 OneTimeCall GetSevCBitMaskAbove31
ClearOvmfPageTables
CreatePageTables4Level edx CreatePageTables4Level edx
; Clear the C-bit from the GHCB page if the SEV-ES is enabled. ; Clear the C-bit from the GHCB page if the SEV-ES is enabled.
OneTimeCall SevClearPageEncMaskForGhcbPage OneTimeCall SevClearPageEncMaskForGhcbPage
jmp SetCr3 jmp SetCr3