summaryrefslogtreecommitdiff
path: root/BraswellPlatformPkg/Common/Silicon/IntelSiliconBasic/PiSmmCpuDxeSmm/Ia32/Semaphore.c
blob: 30e56083f554044145126d585c7b2d1817fa5669 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/** @file
  Semaphore mechanism to indicate to the BSP that an AP has exited SMM
  after SMBASE relocation.

  Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>

  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
  http://opensource.org/licenses/bsd-license.php.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#include "PiSmmCpuDxeSmm.h"

UINTN   mSmmRelocationOriginalAddress;
BOOLEAN *mRebasedFlag;

/**
  Hook return address of SMM Save State so that semaphore code
  can be executed immediately after AP exits SMM to indicate to
  the BSP that an AP has exited SMM after SMBASE relocation.

  @param CpuIndex  The processor index.
**/
VOID
SemaphoreHook (
  IN UINTN  CpuIndex
  )
{
  SOCKET_LGA_775_SMM_CPU_STATE  *CpuState;

  mRebasedFlag = (BOOLEAN *) &mRebased[CpuIndex];

  {
    CpuState = (SOCKET_LGA_775_SMM_CPU_STATE *)(UINTN)(SMM_DEFAULT_SMBASE + SMM_CPU_STATE_OFFSET);

    //
    // The offset of EIP/RIP is different depending on the SMMRevId
    //
    if (CpuState->x86.SMMRevId < SOCKET_LGA_775_SMM_MIN_REV_ID_x64) {
      mSmmRelocationOriginalAddress = (UINTN) CpuState->x86._EIP;
      CpuState->x86._EIP            = (UINT32) (UINTN) &SmmRelocationSemaphoreComplete;
    } else {
      mSmmRelocationOriginalAddress = (UINTN) CpuState->x64._RIP;
      CpuState->x64._RIP            = (UINT64) (UINTN) &SmmRelocationSemaphoreComplete;
    }

    if (CpuState->x86.AutoHALTRestart & BIT0) {
      //
      // Clear the auto HALT restart flag so the RSM instruction returns
      //   program control to the instruction following the HLT instruction,
      //   actually returns to SmmRelocationSemaphoreComplete
      //
      CpuState->x86.AutoHALTRestart &= ~BIT0;
    }
  }
}