}\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