diff options
author | Min Xu <min.m.xu@intel.com> | 2021-07-18 10:20:21 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2022-04-02 08:15:12 +0000 |
commit | de327f7d8a6e2090e1a32cb4907e3264e40f5792 (patch) | |
tree | beb165045e007356c85767ffe96e5fe8a4d6d852 /UefiCpuPkg | |
parent | daf8f642f38b3701ada62a2bff87680b134d63c3 (diff) | |
download | edk2-de327f7d8a6e2090e1a32cb4907e3264e40f5792.tar.gz |
UefiCpuPkg/CpuExceptionHandler: Add base support for the #VE exception
RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429
Add base support to handle #VE exceptions. Update the common exception
handlers to invoke the VmTdExitHandleVe () function of the VmgExitLib
library when a #VE is encountered. A non-zero return code will propagate
to the targeted exception handler.
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r-- | UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c | 53 | ||||
-rw-r--r-- | UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c | 57 |
2 files changed, 79 insertions, 31 deletions
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c index 762ea2460f..f47a80dcab 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c @@ -24,25 +24,48 @@ CommonExceptionHandlerWorker ( IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData
)
{
+ EFI_STATUS Status;
EXCEPTION_HANDLER_CONTEXT *ExceptionHandlerContext;
RESERVED_VECTORS_DATA *ReservedVectors;
EFI_CPU_INTERRUPT_HANDLER *ExternalInterruptHandler;
- if (ExceptionType == VC_EXCEPTION) {
- EFI_STATUS Status;
- //
- // #VC needs to be handled immediately upon enabling exception handling
- // and therefore can't use the RegisterCpuInterruptHandler() interface.
- //
- // Handle the #VC:
- // On EFI_SUCCESS - Exception has been handled, return
- // On other - ExceptionType contains (possibly new) exception
- // value
- //
- Status = VmgExitHandleVc (&ExceptionType, SystemContext);
- if (!EFI_ERROR (Status)) {
- return;
- }
+ switch (ExceptionType) {
+ case VC_EXCEPTION:
+ //
+ // #VC needs to be handled immediately upon enabling exception handling
+ // and therefore can't use the RegisterCpuInterruptHandler() interface.
+ //
+ // Handle the #VC:
+ // On EFI_SUCCESS - Exception has been handled, return
+ // On other - ExceptionType contains (possibly new) exception
+ // value
+ //
+ Status = VmgExitHandleVc (&ExceptionType, SystemContext);
+ if (!EFI_ERROR (Status)) {
+ return;
+ }
+
+ break;
+
+ case VE_EXCEPTION:
+ //
+ // #VE needs to be handled immediately upon enabling exception handling
+ // and therefore can't use the RegisterCpuInterruptHandler() interface.
+ //
+ // Handle the #VE:
+ // On EFI_SUCCESS - Exception has been handled, return
+ // On other - ExceptionType contains (possibly new) exception
+ // value
+ //
+ Status = VmTdExitHandleVe (&ExceptionType, SystemContext);
+ if (!EFI_ERROR (Status)) {
+ return;
+ }
+
+ break;
+
+ default:
+ break;
}
ExceptionHandlerContext = (EXCEPTION_HANDLER_CONTEXT *)(UINTN)(SystemContext.SystemContextIa32);
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c index c614d5b0b6..6e5216380d 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c @@ -25,22 +25,47 @@ CommonExceptionHandler ( IN EFI_SYSTEM_CONTEXT SystemContext
)
{
- if (ExceptionType == VC_EXCEPTION) {
- EFI_STATUS Status;
- //
- // #VC needs to be handled immediately upon enabling exception handling
- // and therefore can't use the RegisterCpuInterruptHandler() interface
- // (which isn't supported under Sec and Pei anyway).
- //
- // Handle the #VC:
- // On EFI_SUCCESS - Exception has been handled, return
- // On other - ExceptionType contains (possibly new) exception
- // value
- //
- Status = VmgExitHandleVc (&ExceptionType, SystemContext);
- if (!EFI_ERROR (Status)) {
- return;
- }
+ EFI_STATUS Status;
+
+ switch (ExceptionType) {
+ case VC_EXCEPTION:
+ //
+ // #VC needs to be handled immediately upon enabling exception handling
+ // and therefore can't use the RegisterCpuInterruptHandler() interface
+ // (which isn't supported under Sec and Pei anyway).
+ //
+ // Handle the #VC:
+ // On EFI_SUCCESS - Exception has been handled, return
+ // On other - ExceptionType contains (possibly new) exception
+ // value
+ //
+ Status = VmgExitHandleVc (&ExceptionType, SystemContext);
+ if (!EFI_ERROR (Status)) {
+ return;
+ }
+
+ break;
+
+ case VE_EXCEPTION:
+ //
+ // #VE needs to be handled immediately upon enabling exception handling
+ // and therefore can't use the RegisterCpuInterruptHandler() interface
+ // (which isn't supported under Sec and Pei anyway).
+ //
+ // Handle the #VE:
+ // On EFI_SUCCESS - Exception has been handled, return
+ // On other - ExceptionType contains (possibly new) exception
+ // value
+ //
+ Status = VmTdExitHandleVe (&ExceptionType, SystemContext);
+ if (!EFI_ERROR (Status)) {
+ return;
+ }
+
+ break;
+
+ default:
+ break;
}
//
|