]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / SyncTimer.c
CommitLineData
529a5a86
MK
1/** @file\r
2SMM Timer feature support\r
3\r
4Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
0acd8697 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
529a5a86
MK
6\r
7**/\r
8\r
9#include "PiSmmCpuDxeSmm.h"\r
10\r
053e878b 11UINT64 mTimeoutTicker = 0;\r
529a5a86
MK
12//\r
13// Number of counts in a roll-over cycle of the performance counter.\r
14//\r
053e878b 15UINT64 mCycle = 0;\r
529a5a86
MK
16//\r
17// Flag to indicate the performance counter is count-up or count-down.\r
18//\r
19BOOLEAN mCountDown;\r
20\r
21/**\r
22 Initialize Timer for SMM AP Sync.\r
23\r
24**/\r
25VOID\r
26InitializeSmmTimer (\r
27 VOID\r
28 )\r
29{\r
30 UINT64 TimerFrequency;\r
31 UINT64 Start;\r
32 UINT64 End;\r
33\r
34 TimerFrequency = GetPerformanceCounterProperties (&Start, &End);\r
35 mTimeoutTicker = DivU64x32 (\r
053e878b 36 MultU64x64 (TimerFrequency, PcdGet64 (PcdCpuSmmApSyncTimeout)),\r
529a5a86
MK
37 1000 * 1000\r
38 );\r
39 if (End < Start) {\r
40 mCountDown = TRUE;\r
053e878b 41 mCycle = Start - End;\r
529a5a86
MK
42 } else {\r
43 mCountDown = FALSE;\r
053e878b 44 mCycle = End - Start;\r
529a5a86
MK
45 }\r
46}\r
47\r
48/**\r
49 Start Timer for SMM AP Sync.\r
50\r
51**/\r
52UINT64\r
53EFIAPI\r
54StartSyncTimer (\r
55 VOID\r
56 )\r
57{\r
58 return GetPerformanceCounter ();\r
59}\r
60\r
529a5a86
MK
61/**\r
62 Check if the SMM AP Sync timer is timeout.\r
63\r
64 @param Timer The start timer from the begin.\r
65\r
66**/\r
67BOOLEAN\r
68EFIAPI\r
69IsSyncTimerTimeout (\r
053e878b 70 IN UINT64 Timer\r
529a5a86
MK
71 )\r
72{\r
73 UINT64 CurrentTimer;\r
74 UINT64 Delta;\r
75\r
76 CurrentTimer = GetPerformanceCounter ();\r
77 //\r
78 // We need to consider the case that CurrentTimer is equal to Timer\r
79 // when some timer runs too slow and CPU runs fast. We think roll over\r
80 // condition does not happen on this case.\r
81 //\r
82 if (mCountDown) {\r
83 //\r
84 // The performance counter counts down. Check for roll over condition.\r
85 //\r
86 if (CurrentTimer <= Timer) {\r
87 Delta = Timer - CurrentTimer;\r
88 } else {\r
89 //\r
90 // Handle one roll-over.\r
91 //\r
92 Delta = mCycle - (CurrentTimer - Timer) + 1;\r
93 }\r
94 } else {\r
95 //\r
96 // The performance counter counts up. Check for roll over condition.\r
97 //\r
98 if (CurrentTimer >= Timer) {\r
99 Delta = CurrentTimer - Timer;\r
100 } else {\r
101 //\r
102 // Handle one roll-over.\r
103 //\r
104 Delta = mCycle - (Timer - CurrentTimer) + 1;\r
105 }\r
106 }\r
107\r
053e878b 108 return (BOOLEAN)(Delta >= mTimeoutTicker);\r
529a5a86 109}\r