UefiCpuPkg/CpuExceptionHandler: Add base support for the #VC exception
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198 Add base support to handle #VC exceptions. Update the common exception handlers to invoke the VmgExitHandleVc () function of the VmgExitLib library when a #VC is encountered. A non-zero return code will propagate to the targeted exception handler. Under SEV-ES, a DR7 read or write intercept generates a #VC exception. To avoid exception recursion, a #VC exception will not try to read and push the actual debug registers into the EFI_SYSTEM_CONTEXT_X64 struct and instead push zeroes. The #VC exception handler does not make use of the debug registers from the saved context and the exception processing exit code does not attempt to restore the debug register values. Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
committed by
mergify[bot]
parent
3a4a6ead32
commit
5277540e37
@ -18,6 +18,8 @@
|
||||
; CommonExceptionHandler()
|
||||
;
|
||||
|
||||
%define VC_EXCEPTION 29
|
||||
|
||||
extern ASM_PFX(mErrorCodeFlag) ; Error code flags for exceptions
|
||||
extern ASM_PFX(mDoFarReturnFlag) ; Do far return flag
|
||||
extern ASM_PFX(CommonExceptionHandler)
|
||||
@ -225,6 +227,9 @@ HasErrorCode:
|
||||
push rax
|
||||
|
||||
;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
|
||||
cmp qword [rbp + 8], VC_EXCEPTION
|
||||
je VcDebugRegs ; For SEV-ES (#VC) Debug registers ignored
|
||||
|
||||
mov rax, dr7
|
||||
push rax
|
||||
mov rax, dr6
|
||||
@ -237,7 +242,19 @@ HasErrorCode:
|
||||
push rax
|
||||
mov rax, dr0
|
||||
push rax
|
||||
jmp DrFinish
|
||||
|
||||
VcDebugRegs:
|
||||
;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7 are skipped for #VC to avoid exception recursion
|
||||
xor rax, rax
|
||||
push rax
|
||||
push rax
|
||||
push rax
|
||||
push rax
|
||||
push rax
|
||||
push rax
|
||||
|
||||
DrFinish:
|
||||
;; FX_SAVE_STATE_X64 FxSaveState;
|
||||
sub rsp, 512
|
||||
mov rdi, rsp
|
||||
|
Reference in New Issue
Block a user