]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/EdkIIGlueLib/Library/PeiPerformanceLib/PerformanceLib.c
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EdkIIGlueLib / Library / PeiPerformanceLib / PerformanceLib.c
CommitLineData
c7f33ca4 1/*++\r
2\r
2c7e5c2f
HT
3Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
c7f33ca4 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12\r
13Module Name:\r
14\r
15 PerformanceLib.c\r
16 \r
17Abstract: \r
18\r
19 Support routines used by PEI_PERF_START() and PEI_PERF_END()\r
20\r
21--*/\r
22\r
23#include "EdkIIGluePeim.h"\r
24\r
25\r
26#define MAX_PEI_PERF_LOG_ENTRIES 28\r
27\r
28\r
29STATIC\r
30VOID\r
31InternalGetTimerValue (\r
32 OUT UINT64 *TimerValue\r
33 )\r
34/*++\r
35\r
36Routine Description:\r
37\r
38 Set TimerValue with current tick.\r
39\r
40Arguments:\r
41\r
42 TimerValue - Timer value to be set\r
43\r
44Returns:\r
45\r
46 EFI_SUCCESS - TimerValue is set.\r
47\r
48--*/\r
49{\r
50 *TimerValue = AsmReadTsc ();\r
51}\r
52\r
53\r
54VOID\r
55EFIAPI\r
56PeiPerfMeasure (\r
57 EFI_PEI_SERVICES **PeiServices,\r
58 IN UINT16 *Token,\r
59 IN EFI_FFS_FILE_HEADER *FileHeader,\r
60 IN BOOLEAN EntryExit,\r
61 IN UINT64 Value\r
62 )\r
63/*++\r
64\r
65Routine Description:\r
66\r
67 Log a timestamp count.\r
68\r
69Arguments:\r
70\r
71 PeiServices - Pointer to the PEI Core Services table\r
72 \r
73 Token - Pointer to Token Name\r
74 \r
75 FileHeader - Pointer to the file header\r
76\r
77 EntryExit - Indicates start or stop measurement\r
78\r
79 Value - The start time or the stop time\r
80\r
81Returns:\r
82\r
83--*/\r
84{\r
85 EFI_STATUS Status;\r
86 EFI_HOB_GUID_TYPE *Hob;\r
87 EFI_HOB_GUID_DATA_PERFORMANCE_LOG *PerfHobData;\r
88 PEI_PERFORMANCE_MEASURE_LOG_ENTRY *Log;\r
89 EFI_PEI_PPI_DESCRIPTOR *PerfHobDescriptor;\r
90 UINT64 TimeCount;\r
91 INTN Index;\r
92 UINTN Index2;\r
93 EFI_GUID *Guid;\r
94 EFI_GUID *CheckGuid;\r
95\r
96 TimeCount = 0;\r
97 //\r
98 // Get the END time as early as possible to make it more accurate.\r
99 //\r
100 if (EntryExit) {\r
101 InternalGetTimerValue (&TimeCount);\r
102 }\r
103\r
104 //\r
105 // Locate the Pei Performance Log Hob.\r
106 //\r
107 Status = PeiServicesLocatePpi (\r
108 &gEfiPeiPerformanceHobGuid, \r
109 0, \r
110 &PerfHobDescriptor, \r
111 NULL\r
112 );\r
113\r
114 //\r
115 // If the Performance Hob was not found, build and install one.\r
116 //\r
117 if (EFI_ERROR(Status)) {\r
118 Hob = BuildGuidHob (\r
119 &gEfiPeiPerformanceHobGuid, \r
120 (sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG) +\r
121 ((MAX_PEI_PERF_LOG_ENTRIES-1) * \r
122 sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY)) +\r
123 sizeof(EFI_PEI_PPI_DESCRIPTOR)\r
124 )); \r
125 Hob = (VOID *)((UINTN)Hob - sizeof (EFI_HOB_GUID_TYPE));\r
126 ASSERT_EFI_ERROR (Status);\r
127\r
128 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(Hob+1);\r
129 PerfHobData->NumberOfEntries = 0;\r
130\r
131 PerfHobDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)((UINT8 *)(PerfHobData+1) +\r
132 (sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
133 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
134 )\r
135 );\r
136 PerfHobDescriptor->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);\r
137 PerfHobDescriptor->Guid = &gEfiPeiPerformanceHobGuid;\r
138 PerfHobDescriptor->Ppi = NULL;\r
139\r
140 (*PeiServices)->InstallPpi (\r
141 PeiServices,\r
142 PerfHobDescriptor\r
143 );\r
144 }\r
145\r
146 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(((UINT8 *)(PerfHobDescriptor)) -\r
147 ((sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
148 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
149 )\r
150 + sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG)\r
151 )\r
152 );\r
153\r
154 if (PerfHobData->NumberOfEntries >= MAX_PEI_PERF_LOG_ENTRIES) {\r
155 return;\r
156 }\r
157\r
158 if (!EntryExit) {\r
159 Log = &(PerfHobData->Log[PerfHobData->NumberOfEntries]);\r
160 ((*PeiServices)->SetMem) (Log, sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY), 0);\r
161\r
162 //\r
163 // If not NULL pointer, copy the file name\r
164 //\r
165 if (FileHeader != NULL) {\r
166 Log->Name = FileHeader->Name;\r
167 }\r
168\r
169 //\r
170 // Copy the description string\r
171 //\r
172 ((*PeiServices)->CopyMem) (\r
173 &(Log->DescriptionString), \r
174 Token,\r
175 (PEI_PERF_MAX_DESC_STRING-1) * sizeof(UINT16)\r
176 );\r
177\r
178 //\r
179 // Get the start time as late as possible to make it more accurate.\r
180 //\r
181 InternalGetTimerValue (&TimeCount);\r
182\r
183 //\r
184 // Record the time stamp.\r
185 //\r
186 if (Value != 0) {\r
187 Log->StartTimeCount = Value;\r
188 } else {\r
189 Log->StartTimeCount = TimeCount;\r
190 }\r
191 Log->StopTimeCount = 0;\r
192\r
193 //\r
194 // Increment the number of valid log entries.\r
195 //\r
196 PerfHobData->NumberOfEntries++;\r
197\r
198 } else {\r
199\r
200 for (Index = PerfHobData->NumberOfEntries-1; Index >= 0; Index--) {\r
201 Log = NULL;\r
202 for (Index2 = 0; Index2 < PEI_PERF_MAX_DESC_STRING; Index2++) {\r
203 if (PerfHobData->Log[Index].DescriptionString[Index2] == 0) {\r
204 Log = &(PerfHobData->Log[Index]);\r
205 break;\r
206 }\r
207 if (PerfHobData->Log[Index].DescriptionString[Index2] !=\r
208 Token[Index2]) {\r
209 break;\r
210 }\r
211 }\r
212 if (Log != NULL) {\r
213 if (FileHeader != NULL) {\r
214 Guid = &(Log->Name);\r
215 CheckGuid = &(FileHeader->Name);\r
216 if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
217 (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
218 (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
219 (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {\r
220 if (Value != 0) {\r
221 Log->StopTimeCount = Value;\r
222 } else {\r
223 Log->StopTimeCount = TimeCount;\r
224 }\r
225 break;\r
226 }\r
227 } else {\r
228 if (Value != 0) {\r
229 Log->StopTimeCount = Value;\r
230 } else {\r
231 Log->StopTimeCount = TimeCount;\r
232 }\r
233 break;\r
234 }\r
235 }\r
236 }\r
237 \r
238 }\r
239\r
240 return;\r
241}\r