1427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney/** @file 2427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneySemaphore mechanism to indicate to the BSP that an AP has exited SMM 3427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyafter SMBASE relocation. 4427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 5427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyCopyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR> 6427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyThis program and the accompanying materials 7427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyare licensed and made available under the terms and conditions of the BSD License 8427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneywhich accompanies this distribution. The full text of the license may be found at 9427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyhttp://opensource.org/licenses/bsd-license.php 10427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 11427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 14427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney**/ 15427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 16427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney#include "PiSmmCpuDxeSmm.h" 17427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 18427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyextern UINT32 mSmmRelocationOriginalAddressPtr32; 19427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyextern UINT32 mRebasedFlagAddr32; 20427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 21427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyUINTN mSmmRelocationOriginalAddress; 22427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinneyvolatile BOOLEAN *mRebasedFlag; 23427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 24427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney/** 25427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyAP Semaphore operation in 32-bit mode while BSP runs in 64-bit mode. 26427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney**/ 27427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyVOID 28427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneySmmRelocationSemaphoreComplete32 ( 29427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney VOID 30427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney ); 31427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 32427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney/** 33427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney Hook return address of SMM Save State so that semaphore code 34427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney can be executed immediately after AP exits SMM to indicate to 35427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney the BSP that an AP has exited SMM after SMBASE relocation. 36427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 37427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney @param[in] CpuIndex The processor index. 38427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney @param[in] RebasedFlag A pointer to a flag that is set to TRUE 39427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney immediately after AP exits SMM. 40427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 41427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney**/ 42427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneyVOID 43427e3573426fe425141e413d17cf3ff65452fdb8Michael KinneySemaphoreHook ( 44427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney IN UINTN CpuIndex, 45427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney IN volatile BOOLEAN *RebasedFlag 46427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney ) 47427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney{ 48427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney SMRAM_SAVE_STATE_MAP *CpuState; 49427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney UINTN TempValue; 50427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 51427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney mRebasedFlag = RebasedFlag; 52427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney mRebasedFlagAddr32 = (UINT32)(UINTN)mRebasedFlag; 53427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 54427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); 55427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney mSmmRelocationOriginalAddress = HookReturnFromSmm ( 56427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney CpuIndex, 57427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney CpuState, 58427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney (UINT64)(UINTN)&SmmRelocationSemaphoreComplete32, 59427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney (UINT64)(UINTN)&SmmRelocationSemaphoreComplete 60427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney ); 61427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney 62427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney // 63427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney // Use temp value to fix ICC complier warning 64427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney // 65427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney TempValue = (UINTN)&mSmmRelocationOriginalAddress; 66427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney mSmmRelocationOriginalAddressPtr32 = (UINT32)TempValue; 67427e3573426fe425141e413d17cf3ff65452fdb8Michael Kinney} 68