When running in SEV mode keep the VC handler installed. Add a function to uninstall it later.
This allows using the cpuid instruction in SetCr3ForPageTables64, which is needed to check for la57 & 1G page support. Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- OvmfPkg/ResetVector/Ia32/AmdSev.asm | 12 ++++++++++-- OvmfPkg/ResetVector/Ia32/PageTables64.asm | 1 + OvmfPkg/ResetVector/Main.asm | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm index 23e4c5ebbe92..cbb86871636f 100644 --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm @@ -320,9 +320,9 @@ NoSevEsVcHlt: NoSevPass: xor eax, eax -SevExit: ; - ; Clear exception handlers and stack + ; When NOT running in SEV mode: clear exception handlers and stack here. + ; Otherwise: SevClearVcHandlerAndStack must be called later. ; push eax mov eax, ADDR_OF(IdtrClear) @@ -330,8 +330,16 @@ SevExit: pop eax mov esp, 0 +SevExit: OneTimeCallRet CheckSevFeatures +SevClearVcHandlerAndStack: + ; Clear exception handlers and stack + mov eax, ADDR_OF(IdtrClear) + lidt [cs:eax] + mov esp, 0 + OneTimeCallRet SevClearVcHandlerAndStack + ; Start of #VC exception handling routines ; diff --git a/OvmfPkg/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/ResetVector/Ia32/PageTables64.asm index b922c845f297..29ce155eed8d 100644 --- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm +++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm @@ -254,6 +254,7 @@ SevInit: CreatePageTables4Level edx ; Clear the C-bit from the GHCB page if the SEV-ES is enabled. OneTimeCall SevClearPageEncMaskForGhcbPage + OneTimeCall SevClearVcHandlerAndStack jmp SetCr3 TdxBspInit: diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm index 46cfa87c4c0a..88b25db3bc9e 100644 --- a/OvmfPkg/ResetVector/Main.asm +++ b/OvmfPkg/ResetVector/Main.asm @@ -80,7 +80,11 @@ SearchBfv: ; Set the OVMF/SEV work area as appropriate. ; OneTimeCall CheckSevFeatures + cmp byte[WORK_AREA_GUEST_TYPE], 1 + jnz NoSevIa32 + OneTimeCall SevClearVcHandlerAndStack +NoSevIa32: ; ; Restore initial EAX value into the EAX register ; -- 2.44.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116221): https://edk2.groups.io/g/devel/message/116221 Mute This Topic: https://groups.io/mt/104660115/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-