diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c index 2c27fc0695..83f49d7c00 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c @@ -253,7 +253,7 @@ DxeMain ( VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *)(GET_GUID_HOB_DATA (GuidHob)); } - Status = InitializeCpuExceptionHandlersEx (VectorInfoList, NULL); + Status = InitializeCpuExceptionHandlers (VectorInfoList); ASSERT_EFI_ERROR (Status); // diff --git a/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h b/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h index d4649bebe1..9a495081f7 100644 --- a/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h +++ b/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h @@ -103,32 +103,20 @@ InitializeCpuExceptionHandlers ( ); /** - Initializes all CPU exceptions entries with optional extra initializations. + Setup separate stacks for certain exception handlers. - By default, this method should include all functionalities implemented by - InitializeCpuExceptionHandlers(), plus extra initialization works, if any. - This could be done by calling InitializeCpuExceptionHandlers() directly - in this method besides the extra works. + InitData is optional and processor arch dependent. - InitData is optional and its use and content are processor arch dependent. - The typical usage of it is to convey resources which have to be reserved - elsewhere and are necessary for the extra initializations of exception. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data optional for extra initializations - of exception. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ); diff --git a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c index 54f38788fe..8aeedcb4d1 100644 --- a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c +++ b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c @@ -82,34 +82,22 @@ DumpCpuContext ( } /** - Initializes all CPU exceptions entries with optional extra initializations. + Setup separate stacks for certain exception handlers. - By default, this method should include all functionalities implemented by - InitializeCpuExceptionHandlers(), plus extra initialization works, if any. - This could be done by calling InitializeCpuExceptionHandlers() directly - in this method besides the extra works. + InitData is optional and processor arch dependent. - InitData is optional and its use and content are processor arch dependent. - The typical usage of it is to convey resources which have to be reserved - elsewhere and are necessary for the extra initializations of exception. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data optional for extra initializations - of exception. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ) { - return InitializeCpuExceptionHandlers (VectorInfo); + return EFI_UNSUPPORTED; } diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 1f218367b3..e385f585c7 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -1,7 +1,7 @@ /** @file CPU DXE Module to produce CPU MP Protocol. - Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2008 - 2022, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -617,7 +617,7 @@ GetGdtr ( /** Initializes CPU exceptions handlers for the sake of stack switch requirement. - This function is a wrapper of InitializeCpuExceptionHandlersEx. It's mainly + This function is a wrapper of InitializeSeparateExceptionStacks. It's mainly for the sake of AP's init because of EFI_AP_PROCEDURE API requirement. @param[in,out] Buffer The pointer to private data buffer. @@ -641,7 +641,7 @@ InitializeExceptionStackSwitchHandlers ( AsmReadIdtr (&Idtr); EssData->Ia32.IdtTable = (VOID *)Idtr.Base; EssData->Ia32.IdtTableSize = Idtr.Limit + 1; - Status = InitializeCpuExceptionHandlersEx (NULL, EssData); + Status = InitializeSeparateExceptionStacks (EssData); ASSERT_EFI_ERROR (Status); } diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index 1e68c91d95..d4786979fa 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -432,7 +432,7 @@ GetGdtr ( /** Initializes CPU exceptions handlers for the sake of stack switch requirement. - This function is a wrapper of InitializeCpuExceptionHandlersEx. It's mainly + This function is a wrapper of InitializeSeparateExceptionStacks. It's mainly for the sake of AP's init because of EFI_AP_PROCEDURE API requirement. @param[in,out] Buffer The pointer to private data buffer. @@ -456,7 +456,7 @@ InitializeExceptionStackSwitchHandlers ( AsmReadIdtr (&Idtr); EssData->Ia32.IdtTable = (VOID *)Idtr.Base; EssData->Ia32.IdtTableSize = Idtr.Limit + 1; - Status = InitializeCpuExceptionHandlersEx (NULL, EssData); + Status = InitializeSeparateExceptionStacks (EssData); ASSERT_EFI_ERROR (Status); } diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c index c7c1fe31d2..e62bb5e6c0 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c @@ -103,82 +103,49 @@ RegisterCpuInterruptHandler ( } /** - Initializes CPU exceptions entries and setup stack switch for given exceptions. + Setup separate stacks for certain exception handlers. - This method will call InitializeCpuExceptionHandlers() to setup default - exception handlers unless indicated not to do it explicitly. + InitData is optional and processor arch dependent. - If InitData is passed with NULL, this method will use the resource reserved - by global variables to initialize it; Otherwise it will use data in InitData - to setup stack switch. This is for the different use cases in DxeCore and - Cpu MP exception initialization. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data required to setup stack switch for - given exceptions. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. + @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ) { - EFI_STATUS Status; CPU_EXCEPTION_INIT_DATA EssData; IA32_DESCRIPTOR Idtr; IA32_DESCRIPTOR Gdtr; - // - // To avoid repeat initialization of default handlers, the caller should pass - // an extended init data with InitDefaultHandlers set to FALSE. There's no - // need to call this method to just initialize default handlers. Call non-ex - // version instead; or this method must be implemented as a simple wrapper of - // non-ex version of it, if this version has to be called. - // - if ((InitData == NULL) || InitData->X64.InitDefaultHandlers) { - Status = InitializeCpuExceptionHandlers (VectorInfo); - } else { - Status = EFI_SUCCESS; + if (InitData == NULL) { + SetMem (mNewGdt, sizeof (mNewGdt), 0); + + AsmReadIdtr (&Idtr); + AsmReadGdtr (&Gdtr); + + EssData.X64.Revision = CPU_EXCEPTION_INIT_DATA_REV; + EssData.X64.KnownGoodStackTop = (UINTN)mNewStack + sizeof (mNewStack); + EssData.X64.KnownGoodStackSize = CPU_KNOWN_GOOD_STACK_SIZE; + EssData.X64.StackSwitchExceptions = CPU_STACK_SWITCH_EXCEPTION_LIST; + EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER; + EssData.X64.IdtTable = (VOID *)Idtr.Base; + EssData.X64.IdtTableSize = Idtr.Limit + 1; + EssData.X64.GdtTable = mNewGdt; + EssData.X64.GdtTableSize = sizeof (mNewGdt); + EssData.X64.ExceptionTssDesc = mNewGdt + Gdtr.Limit + 1; + EssData.X64.ExceptionTssDescSize = CPU_TSS_DESC_SIZE; + EssData.X64.ExceptionTss = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE; + EssData.X64.ExceptionTssSize = CPU_TSS_SIZE; + + InitData = &EssData; } - if (!EFI_ERROR (Status)) { - // - // Initializing stack switch is only necessary for Stack Guard functionality. - // - if (PcdGetBool (PcdCpuStackGuard)) { - if (InitData == NULL) { - SetMem (mNewGdt, sizeof (mNewGdt), 0); - - AsmReadIdtr (&Idtr); - AsmReadGdtr (&Gdtr); - - EssData.X64.Revision = CPU_EXCEPTION_INIT_DATA_REV; - EssData.X64.KnownGoodStackTop = (UINTN)mNewStack + sizeof (mNewStack); - EssData.X64.KnownGoodStackSize = CPU_KNOWN_GOOD_STACK_SIZE; - EssData.X64.StackSwitchExceptions = CPU_STACK_SWITCH_EXCEPTION_LIST; - EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER; - EssData.X64.IdtTable = (VOID *)Idtr.Base; - EssData.X64.IdtTableSize = Idtr.Limit + 1; - EssData.X64.GdtTable = mNewGdt; - EssData.X64.GdtTableSize = sizeof (mNewGdt); - EssData.X64.ExceptionTssDesc = mNewGdt + Gdtr.Limit + 1; - EssData.X64.ExceptionTssDescSize = CPU_TSS_DESC_SIZE; - EssData.X64.ExceptionTss = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE; - EssData.X64.ExceptionTssSize = CPU_TSS_SIZE; - - InitData = &EssData; - } - - Status = ArchSetupExceptionStack (InitData); - } - } - - return Status; + return ArchSetupExceptionStack (InitData); } diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c index 1ae611c75e..494c2ab433 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c @@ -150,57 +150,26 @@ InitializeCpuExceptionHandlers ( } /** - Initializes all CPU exceptions entries with optional extra initializations. + Setup separate stacks for certain exception handlers. - By default, this method should include all functionalities implemented by - InitializeCpuExceptionHandlers(), plus extra initialization works, if any. - This could be done by calling InitializeCpuExceptionHandlers() directly - in this method besides the extra works. + InitData is optional and processor arch dependent. - InitData is optional and its use and content are processor arch dependent. - The typical usage of it is to convey resources which have to be reserved - elsewhere and are necessary for the extra initializations of exception. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data optional for extra initializations - of exception. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. + @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ) { - EFI_STATUS Status; - - // - // To avoid repeat initialization of default handlers, the caller should pass - // an extended init data with InitDefaultHandlers set to FALSE. There's no - // need to call this method to just initialize default handlers. Call non-ex - // version instead; or this method must be implemented as a simple wrapper of - // non-ex version of it, if this version has to be called. - // - if ((InitData == NULL) || InitData->Ia32.InitDefaultHandlers) { - Status = InitializeCpuExceptionHandlers (VectorInfo); - } else { - Status = EFI_SUCCESS; + if (InitData == NULL) { + return EFI_UNSUPPORTED; } - if (!EFI_ERROR (Status)) { - // - // Initializing stack switch is only necessary for Stack Guard functionality. - // - if (PcdGetBool (PcdCpuStackGuard) && (InitData != NULL)) { - Status = ArchSetupExceptionStack (InitData); - } - } - - return Status; + return ArchSetupExceptionStack (InitData); } diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c index e894ead612..4313cc5582 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c @@ -200,33 +200,22 @@ RegisterCpuInterruptHandler ( } /** - Initializes all CPU exceptions entries with optional extra initializations. + Setup separate stacks for certain exception handlers. - By default, this method should include all functionalities implemented by - InitializeCpuExceptionHandlers(), plus extra initialization works, if any. - This could be done by calling InitializeCpuExceptionHandlers() directly - in this method besides the extra works. + InitData is optional and processor arch dependent. - InitData is optional and its use and content are processor arch dependent. - The typical usage of it is to convey resources which have to be reserved - elsewhere and are necessary for the extra initializations of exception. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data optional for extra initializations - of exception. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. + @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ) { - return InitializeCpuExceptionHandlers (VectorInfo); + return EFI_UNSUPPORTED; } diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c index ec643556c7..1c97dab926 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c @@ -96,33 +96,22 @@ RegisterCpuInterruptHandler ( } /** - Initializes all CPU exceptions entries with optional extra initializations. + Setup separate stacks for certain exception handlers. - By default, this method should include all functionalities implemented by - InitializeCpuExceptionHandlers(), plus extra initialization works, if any. - This could be done by calling InitializeCpuExceptionHandlers() directly - in this method besides the extra works. + InitData is optional and processor arch dependent. - InitData is optional and its use and content are processor arch dependent. - The typical usage of it is to convey resources which have to be reserved - elsewhere and are necessary for the extra initializations of exception. + @param[in] InitData Pointer to data optional for information about how + to assign stacks for certain exception handlers. - @param[in] VectorInfo Pointer to reserved vector list. - @param[in] InitData Pointer to data optional for extra initializations - of exception. - - @retval EFI_SUCCESS The exceptions have been successfully - initialized. - @retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid - content. + @retval EFI_SUCCESS The stacks are assigned successfully. + @retval EFI_UNSUPPORTED This function is not supported. **/ EFI_STATUS EFIAPI -InitializeCpuExceptionHandlersEx ( - IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, +InitializeSeparateExceptionStacks ( IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL ) { - return InitializeCpuExceptionHandlers (VectorInfo); + return EFI_UNSUPPORTED; }