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;
}
}
}
|