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