From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E56E181C48 for ; Tue, 29 Nov 2016 23:22:47 -0800 (PST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP; 29 Nov 2016 23:22:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,720,1473145200"; d="scan'208";a="792464392" Received: from jfan12-desk.ccr.corp.intel.com ([10.239.9.5]) by FMSMGA003.fm.intel.com with ESMTP; 29 Nov 2016 23:22:46 -0800 From: Jeff Fan To: edk2-devel@lists.01.org Cc: Feng Tian , Jiewen Yao , Michael D Kinney Date: Wed, 30 Nov 2016 15:22:41 +0800 Message-Id: <20161130072243.35268-2-jeff.fan@intel.com> X-Mailer: git-send-email 2.9.3.windows.2 In-Reply-To: <20161130072243.35268-1-jeff.fan@intel.com> References: <20161130072243.35268-1-jeff.fan@intel.com> Subject: [PATCH 1/3] UefiCpuPkg: Add ExceptionHandlerData for ArchSaveExceptionContext() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Nov 2016 07:22:48 -0000 mReservedVectors is not set, we could add parameter ExceptionHandlerData for ArchSaveExceptionContext() that could use it instead of mReservedVectors. Cc: Feng Tian Cc: Jiewen Yao Cc: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan --- .../CpuExceptionHandlerLib/CpuExceptionCommon.h | 11 ++++---- .../Ia32/ArchExceptionHandler.c | 26 +++++++++++-------- .../CpuExceptionHandlerLib/PeiDxeSmmCpuException.c | 2 +- .../X64/ArchExceptionHandler.c | 29 +++++++++++++--------- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h index 9c88012..dc5d941 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h @@ -197,14 +197,15 @@ UpdateIdtTable ( /** Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case. - @param[in] ExceptionType Exception type. - @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. - + @param[in] ExceptionType Exception type. + @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. + @param[in] ExceptionHandlerData Pointer to exception handler data. **/ VOID ArchSaveExceptionContext ( - IN UINTN ExceptionType, - IN EFI_SYSTEM_CONTEXT SystemContext + IN UINTN ExceptionType, + IN EFI_SYSTEM_CONTEXT SystemContext, + IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData ); /** diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c index 7a183bf..b96636b 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c @@ -1,7 +1,7 @@ /** @file IA32 CPU Exception Handler functons. - Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -50,24 +50,28 @@ ArchGetIdtHandler ( /** Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case. - @param ExceptionType Exception type. - @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. - + @param[in] ExceptionType Exception type. + @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. + @param[in] ExceptionHandlerData Pointer to exception handler data. **/ VOID ArchSaveExceptionContext ( - IN UINTN ExceptionType, - IN EFI_SYSTEM_CONTEXT SystemContext + IN UINTN ExceptionType, + IN EFI_SYSTEM_CONTEXT SystemContext, + IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData ) { IA32_EFLAGS32 Eflags; + RESERVED_VECTORS_DATA *ReservedVectors; + + ReservedVectors = ExceptionHandlerData->ReservedVectors; // // Save Exception context in global variable // - mReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextIa32->Eflags; - mReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextIa32->Cs; - mReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextIa32->Eip; - mReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextIa32->ExceptionData; + ReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextIa32->Eflags; + ReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextIa32->Cs; + ReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextIa32->Eip; + ReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextIa32->ExceptionData; // // Clear IF flag to avoid old IDT handler enable interrupt by IRET // @@ -77,7 +81,7 @@ ArchSaveExceptionContext ( // // Modify the EIP in stack, then old IDT handler will return to the stub code // - SystemContext.SystemContextIa32->Eip = (UINTN) mReservedVectors[ExceptionType].HookAfterStubHeaderCode; + SystemContext.SystemContextIa32->Eip = (UINTN) ReservedVectors[ExceptionType].HookAfterStubHeaderCode; } /** diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c index e55709c..483a417 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c @@ -55,7 +55,7 @@ CommonExceptionHandlerWorker ( // Need to execute old IDT handler before running this exception handler // ReservedVectors[ExceptionType].ApicId = GetApicId (); - ArchSaveExceptionContext (ExceptionType, SystemContext); + ArchSaveExceptionContext (ExceptionType, SystemContext, ExceptionHandlerData); ExceptionHandlerContext->ExceptionDataFlag = (mErrorCodeFlag & (1 << ExceptionType)) ? TRUE : FALSE; ExceptionHandlerContext->OldIdtHandler = ReservedVectors[ExceptionType].ExceptonHandler; return; diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c index f711c31..f84b1a8 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c @@ -1,7 +1,7 @@ /** @file x64 CPU Exception Handler. - Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -51,25 +51,30 @@ ArchGetIdtHandler ( /** Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case. - @param ExceptionType Exception type. - @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. + @param[in] ExceptionType Exception type. + @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. + @param[in] ExceptionHandlerData Pointer to exception handler data. **/ VOID ArchSaveExceptionContext ( - IN UINTN ExceptionType, - IN EFI_SYSTEM_CONTEXT SystemContext + IN UINTN ExceptionType, + IN EFI_SYSTEM_CONTEXT SystemContext, + IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData ) { IA32_EFLAGS32 Eflags; + RESERVED_VECTORS_DATA *ReservedVectors; + + ReservedVectors = ExceptionHandlerData->ReservedVectors; // // Save Exception context in global variable // - mReservedVectors[ExceptionType].OldSs = SystemContext.SystemContextX64->Ss; - mReservedVectors[ExceptionType].OldSp = SystemContext.SystemContextX64->Rsp; - mReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextX64->Rflags; - mReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextX64->Cs; - mReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextX64->Rip; - mReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextX64->ExceptionData; + ReservedVectors[ExceptionType].OldSs = SystemContext.SystemContextX64->Ss; + ReservedVectors[ExceptionType].OldSp = SystemContext.SystemContextX64->Rsp; + ReservedVectors[ExceptionType].OldFlags = SystemContext.SystemContextX64->Rflags; + ReservedVectors[ExceptionType].OldCs = SystemContext.SystemContextX64->Cs; + ReservedVectors[ExceptionType].OldIp = SystemContext.SystemContextX64->Rip; + ReservedVectors[ExceptionType].ExceptionData = SystemContext.SystemContextX64->ExceptionData; // // Clear IF flag to avoid old IDT handler enable interrupt by IRET // @@ -79,7 +84,7 @@ ArchSaveExceptionContext ( // // Modify the EIP in stack, then old IDT handler will return to the stub code // - SystemContext.SystemContextX64->Rip = (UINTN) mReservedVectors[ExceptionType].HookAfterStubHeaderCode; + SystemContext.SystemContextX64->Rip = (UINTN) ReservedVectors[ExceptionType].HookAfterStubHeaderCode; } /** -- 2.9.3.windows.2