From 672b80c8b74718e8c82373b9d59a06f5b10ddc8c Mon Sep 17 00:00:00 2001 From: Michael Kinney Date: Thu, 17 Nov 2016 12:41:35 -0800 Subject: UefiCpuPkg/PiSmmCpuDxeSmm: TransferApToSafeState() use UINTN params Update TransferApToSafeState() use UINTN params to reduce the number of type casts required in these calls. Also change the NumberToFinish parameter from UINT32* to UINTN NumberToFinishAddress to resolve issues with conversion from a volatile pointer to a non-volatile pointer. The assembly code that receives the NumberToFinishAddress value must treat that memory location as a volatile to track the number of APs. Cc: Liming Gao Cc: Laszlo Ersek Cc: Andrew Fish Cc: Jeff Fan Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney Reviewed-by: Laszlo Ersek Reviewed-by: Jeff Fan --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 8 ++++---- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c | 18 +++++++++--------- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 12 ++++++------ UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c | 18 +++++++++--------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index 3fb686439a..4af86b70f2 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -385,7 +385,7 @@ MPRendezvousProcedure ( CPU_REGISTER_TABLE *RegisterTableList; UINT32 InitApicId; UINTN Index; - UINT32 TopOfStack; + UINTN TopOfStack; UINT8 Stack[128]; ProgramVirtualWireMode (); @@ -403,10 +403,10 @@ MPRendezvousProcedure ( // // Place AP into the safe code, count down the number with lock mechanism in the safe code. // - TopOfStack = (UINT32) (UINTN) Stack + sizeof (Stack); - TopOfStack &= ~(UINT32) (CPU_STACK_ALIGNMENT - 1); + TopOfStack = (UINTN) Stack + sizeof (Stack); + TopOfStack &= ~(UINTN) (CPU_STACK_ALIGNMENT - 1); CopyMem ((VOID *) (UINTN) mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate)); - TransferApToSafeState ((UINT32) (UINTN) mApHltLoopCode, TopOfStack, &mNumberToFinish); + TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish); } /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c index 4281698313..f4db6c8b60 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c @@ -129,23 +129,23 @@ InitGdt ( /** Transfer AP to safe hlt-loop after it finished restore CPU features on S3 patch. - @param[in] ApHltLoopCode The 32-bit address of the safe hlt-loop function. - @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. - @param[in] NumberToFinish Semaphore of APs finish count. + @param[in] ApHltLoopCode The address of the safe hlt-loop function. + @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. + @param[in] NumberToFinishAddress Address of Semaphore of APs finish count. **/ VOID TransferApToSafeState ( - IN UINT32 ApHltLoopCode, - IN UINT32 TopOfStack, - IN UINT32 *NumberToFinish + IN UINTN ApHltLoopCode, + IN UINTN TopOfStack, + IN UINTN NumberToFinishAddress ) { SwitchStack ( - (SWITCH_STACK_ENTRY_POINT) (UINTN) ApHltLoopCode, - NumberToFinish, + (SWITCH_STACK_ENTRY_POINT)ApHltLoopCode, + (VOID *)NumberToFinishAddress, NULL, - (VOID *) (UINTN) TopOfStack + (VOID *)TopOfStack ); // // It should never reach here diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index 907526e406..abe5cc612b 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -974,16 +974,16 @@ GetAcpiS3EnableFlag ( /** Transfer AP to safe hlt-loop after it finished restore CPU features on S3 patch. - @param[in] ApHltLoopCode The 32-bit address of the safe hlt-loop function. - @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. - @param[in] NumberToFinish Semaphore of APs finish count. + @param[in] ApHltLoopCode The address of the safe hlt-loop function. + @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. + @param[in] NumberToFinishAddress Address of Semaphore of APs finish count. **/ VOID TransferApToSafeState ( - IN UINT32 ApHltLoopCode, - IN UINT32 TopOfStack, - IN UINT32 *NumberToFinish + IN UINTN ApHltLoopCode, + IN UINTN TopOfStack, + IN UINTN NumberToFinishAddress ); #endif diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c index d6d6a1a503..9fc00c1578 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c @@ -129,24 +129,24 @@ GetProtectedModeCS ( /** Transfer AP to safe hlt-loop after it finished restore CPU features on S3 patch. - @param[in] ApHltLoopCode The 32-bit address of the safe hlt-loop function. - @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. - @param[in] NumberToFinish Semaphore of APs finish count. + @param[in] ApHltLoopCode The address of the safe hlt-loop function. + @param[in] TopOfStack A pointer to the new stack to use for the ApHltLoopCode. + @param[in] NumberToFinishAddress Address of Semaphore of APs finish count. **/ VOID TransferApToSafeState ( - IN UINT32 ApHltLoopCode, - IN UINT32 TopOfStack, - IN UINT32 *NumberToFinish + IN UINTN ApHltLoopCode, + IN UINTN TopOfStack, + IN UINTN NumberToFinishAddress ) { AsmDisablePaging64 ( GetProtectedModeCS (), - (UINT32) (UINTN) ApHltLoopCode, - (UINT32) (UINTN) NumberToFinish, + (UINT32)ApHltLoopCode, + (UINT32)NumberToFinishAddress, 0, - TopOfStack + (UINT32)TopOfStack ); // // It should never reach here -- cgit v1.2.3