]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
CpuException: Add InitializeSeparateExceptionStacks
[mirror_edk2.git] / UefiCpuPkg / Library / CpuExceptionHandlerLib / DxeException.c
index c7c1fe31d2e7955bfc4f709aff8fad9f44d8cf28..e62bb5e6c07c1b2767277918cabc0e6751d5d1e3 100644 (file)
@@ -103,82 +103,49 @@ RegisterCpuInterruptHandler (
 }\r
 \r
 /**\r
-  Initializes CPU exceptions entries and setup stack switch for given exceptions.\r
+  Setup separate stacks for certain exception handlers.\r
 \r
-  This method will call InitializeCpuExceptionHandlers() to setup default\r
-  exception handlers unless indicated not to do it explicitly.\r
+  InitData is optional and processor arch dependent.\r
 \r
-  If InitData is passed with NULL, this method will use the resource reserved\r
-  by global variables to initialize it; Otherwise it will use data in InitData\r
-  to setup stack switch. This is for the different use cases in DxeCore and\r
-  Cpu MP exception initialization.\r
+  @param[in]  InitData      Pointer to data optional for information about how\r
+                            to assign stacks for certain exception handlers.\r
 \r
-  @param[in]  VectorInfo    Pointer to reserved vector list.\r
-  @param[in]  InitData      Pointer to data required to setup stack switch for\r
-                            given exceptions.\r
-\r
-  @retval EFI_SUCCESS             The exceptions have been successfully\r
-                                  initialized.\r
-  @retval EFI_INVALID_PARAMETER   VectorInfo or InitData contains invalid\r
-                                  content.\r
+  @retval EFI_SUCCESS             The stacks are assigned successfully.\r
+  @retval EFI_UNSUPPORTED         This function is not supported.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-InitializeCpuExceptionHandlersEx (\r
-  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL,\r
+InitializeSeparateExceptionStacks (\r
   IN CPU_EXCEPTION_INIT_DATA  *InitData OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS               Status;\r
   CPU_EXCEPTION_INIT_DATA  EssData;\r
   IA32_DESCRIPTOR          Idtr;\r
   IA32_DESCRIPTOR          Gdtr;\r
 \r
-  //\r
-  // To avoid repeat initialization of default handlers, the caller should pass\r
-  // an extended init data with InitDefaultHandlers set to FALSE. There's no\r
-  // need to call this method to just initialize default handlers. Call non-ex\r
-  // version instead; or this method must be implemented as a simple wrapper of\r
-  // non-ex version of it, if this version has to be called.\r
-  //\r
-  if ((InitData == NULL) || InitData->X64.InitDefaultHandlers) {\r
-    Status = InitializeCpuExceptionHandlers (VectorInfo);\r
-  } else {\r
-    Status = EFI_SUCCESS;\r
-  }\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Initializing stack switch is only necessary for Stack Guard functionality.\r
-    //\r
-    if (PcdGetBool (PcdCpuStackGuard)) {\r
-      if (InitData == NULL) {\r
-        SetMem (mNewGdt, sizeof (mNewGdt), 0);\r
-\r
-        AsmReadIdtr (&Idtr);\r
-        AsmReadGdtr (&Gdtr);\r
-\r
-        EssData.X64.Revision                   = CPU_EXCEPTION_INIT_DATA_REV;\r
-        EssData.X64.KnownGoodStackTop          = (UINTN)mNewStack + sizeof (mNewStack);\r
-        EssData.X64.KnownGoodStackSize         = CPU_KNOWN_GOOD_STACK_SIZE;\r
-        EssData.X64.StackSwitchExceptions      = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
-        EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER;\r
-        EssData.X64.IdtTable                   = (VOID *)Idtr.Base;\r
-        EssData.X64.IdtTableSize               = Idtr.Limit + 1;\r
-        EssData.X64.GdtTable                   = mNewGdt;\r
-        EssData.X64.GdtTableSize               = sizeof (mNewGdt);\r
-        EssData.X64.ExceptionTssDesc           = mNewGdt + Gdtr.Limit + 1;\r
-        EssData.X64.ExceptionTssDescSize       = CPU_TSS_DESC_SIZE;\r
-        EssData.X64.ExceptionTss               = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
-        EssData.X64.ExceptionTssSize           = CPU_TSS_SIZE;\r
-\r
-        InitData = &EssData;\r
-      }\r
-\r
-      Status = ArchSetupExceptionStack (InitData);\r
-    }\r
+  if (InitData == NULL) {\r
+    SetMem (mNewGdt, sizeof (mNewGdt), 0);\r
+\r
+    AsmReadIdtr (&Idtr);\r
+    AsmReadGdtr (&Gdtr);\r
+\r
+    EssData.X64.Revision                   = CPU_EXCEPTION_INIT_DATA_REV;\r
+    EssData.X64.KnownGoodStackTop          = (UINTN)mNewStack + sizeof (mNewStack);\r
+    EssData.X64.KnownGoodStackSize         = CPU_KNOWN_GOOD_STACK_SIZE;\r
+    EssData.X64.StackSwitchExceptions      = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
+    EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER;\r
+    EssData.X64.IdtTable                   = (VOID *)Idtr.Base;\r
+    EssData.X64.IdtTableSize               = Idtr.Limit + 1;\r
+    EssData.X64.GdtTable                   = mNewGdt;\r
+    EssData.X64.GdtTableSize               = sizeof (mNewGdt);\r
+    EssData.X64.ExceptionTssDesc           = mNewGdt + Gdtr.Limit + 1;\r
+    EssData.X64.ExceptionTssDescSize       = CPU_TSS_DESC_SIZE;\r
+    EssData.X64.ExceptionTss               = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
+    EssData.X64.ExceptionTssSize           = CPU_TSS_SIZE;\r
+\r
+    InitData = &EssData;\r
   }\r
 \r
-  return Status;\r
+  return ArchSetupExceptionStack (InitData);\r
 }\r