On 2/22/24 05:54, Gerd Hoffmann wrote:
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>
Looks good, just one minor comment below.
Reviewed-by: Tom Lendacky <thomas.lenda...@amd.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 ed94f1dc668f..9063ce1080d3 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 ada3dc0ffbe0..6e2063430802 100644
--- a/OvmfPkg/ResetVector/Ia32/PageTables64.asm
+++ b/OvmfPkg/ResetVector/Ia32/PageTables64.asm
@@ -250,6 +250,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
I think it is safe to invoke SevClearVcHandlerAndStack no matter what if
you want to avoid the cmp and jnz instructions.
Thanks,
Tom
+NoSevIa32:
;
; Restore initial EAX value into the EAX register
;
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116176): https://edk2.groups.io/g/devel/message/116176
Mute This Topic: https://groups.io/mt/104506799/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-