]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Perf.c
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Pei / PeiLib / Perf.c
CommitLineData
3eb9473e 1/*++\r
2\r
4ea9375a
HT
3Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
3eb9473e 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
12Module Name:\r
13\r
14 Perf.c\r
15\r
16Abstract:\r
17\r
18 Support for performance primitives. \r
19\r
20--*/\r
21\r
22#include "Tiano.h"\r
23#include "Pei.h"\r
24#include "PeiLib.h"\r
25#include "PeiHob.h"\r
26\r
27#include EFI_GUID_DEFINITION (PeiPerformanceHob)\r
28\r
29//\r
30// Perfomance HOB data definitions\r
31//\r
32\r
33#define MAX_PEI_PERF_LOG_ENTRIES 28\r
34\r
35//\r
36// Prototype functions\r
37// \r
38EFI_STATUS\r
39GetTimerValue (\r
40 OUT UINT64 *TimerValue\r
41 );\r
42\r
43\r
44VOID\r
c7f33ca4 45EFIAPI\r
3eb9473e 46PeiPerfMeasure (\r
47 EFI_PEI_SERVICES **PeiServices,\r
48 IN UINT16 *Token,\r
49 IN EFI_FFS_FILE_HEADER *FileHeader,\r
50 IN BOOLEAN EntryExit,\r
51 IN UINT64 Value\r
52 )\r
53/*++\r
54\r
55Routine Description:\r
56\r
57 Log a timestamp count.\r
58\r
59Arguments:\r
60\r
61 PeiServices - Pointer to the PEI Core Services table\r
62 \r
63 Token - Pointer to Token Name\r
64 \r
65 FileHeader - Pointer to the file header\r
66\r
67 EntryExit - Indicates start or stop measurement\r
68\r
69 Value - The start time or the stop time\r
70\r
71Returns:\r
72\r
73--*/\r
74{\r
75 EFI_STATUS Status;\r
76 EFI_HOB_GUID_TYPE *Hob;\r
77 EFI_HOB_GUID_DATA_PERFORMANCE_LOG *PerfHobData;\r
78 PEI_PERFORMANCE_MEASURE_LOG_ENTRY *Log;\r
79 EFI_PEI_PPI_DESCRIPTOR *PerfHobDescriptor;\r
80 UINT64 TimeCount;\r
81 INTN Index;\r
82 UINTN Index2;\r
83 EFI_GUID *Guid;\r
84 EFI_GUID *CheckGuid;\r
85\r
86 TimeCount = 0;\r
87 //\r
88 // Get the END time as early as possible to make it more accurate.\r
89 //\r
90 if (EntryExit) {\r
91 GetTimerValue (&TimeCount);\r
92 }\r
93\r
94 //\r
95 // Locate the Pei Performance Log Hob.\r
96 //\r
97 Status = (*PeiServices)->LocatePpi (\r
98 PeiServices,\r
99 &gEfiPeiPerformanceHobGuid,\r
100 0,\r
101 &PerfHobDescriptor,\r
102 NULL\r
103 );\r
104\r
105 //\r
106 // If the Performance Hob was not found, build and install one.\r
107 //\r
108 if (EFI_ERROR(Status)) {\r
109 Status = PeiBuildHobGuid (\r
110 PeiServices,\r
111 &gEfiPeiPerformanceHobGuid,\r
112 (sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG) +\r
113 ((MAX_PEI_PERF_LOG_ENTRIES-1) * \r
114 sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY)) +\r
115 sizeof(EFI_PEI_PPI_DESCRIPTOR)\r
116 ),\r
4b79797e 117 (VOID **) &Hob\r
3eb9473e 118 );\r
71f633dd 119 ASSERT_PEI_ERROR((CONST EFI_PEI_SERVICES **) PeiServices, Status);\r
3eb9473e 120\r
121 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(Hob+1);\r
122 PerfHobData->NumberOfEntries = 0;\r
123\r
124 PerfHobDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)((UINT8 *)(PerfHobData+1) +\r
125 (sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
126 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
127 )\r
128 );\r
129 PerfHobDescriptor->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);\r
130 PerfHobDescriptor->Guid = &gEfiPeiPerformanceHobGuid;\r
131 PerfHobDescriptor->Ppi = NULL;\r
132\r
133 (*PeiServices)->InstallPpi (\r
134 PeiServices,\r
135 PerfHobDescriptor\r
136 );\r
137 }\r
138\r
139 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(((UINT8 *)(PerfHobDescriptor)) -\r
140 ((sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
141 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
142 )\r
143 + sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG)\r
144 )\r
145 );\r
146\r
147 if (PerfHobData->NumberOfEntries >= MAX_PEI_PERF_LOG_ENTRIES) {\r
148 return;\r
149 }\r
150\r
151 if (!EntryExit) {\r
152 Log = &(PerfHobData->Log[PerfHobData->NumberOfEntries]);\r
153 (*PeiServices)->SetMem (Log, sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY), 0);\r
154\r
155 //\r
156 // If not NULL pointer, copy the file name\r
157 //\r
158 if (FileHeader != NULL) {\r
159 Log->Name = FileHeader->Name;\r
160 }\r
161\r
162 //\r
163 // Copy the description string\r
164 //\r
165 (*PeiServices)->CopyMem (\r
166 &(Log->DescriptionString), \r
167 Token,\r
168 (PEI_PERF_MAX_DESC_STRING-1) * sizeof(UINT16)\r
169 );\r
170\r
171 //\r
172 // Get the start time as late as possible to make it more accurate.\r
173 //\r
174 GetTimerValue (&TimeCount);\r
175\r
176 //\r
177 // Record the time stamp.\r
178 //\r
179 if (Value != 0) {\r
180 Log->StartTimeCount = Value;\r
181 } else {\r
182 Log->StartTimeCount = TimeCount;\r
183 }\r
184 Log->StopTimeCount = 0;\r
185\r
186 //\r
187 // Increment the number of valid log entries.\r
188 //\r
189 PerfHobData->NumberOfEntries++;\r
190\r
191 } else {\r
192\r
193 for (Index = PerfHobData->NumberOfEntries-1; Index >= 0; Index--) {\r
194 Log = NULL;\r
195 for (Index2 = 0; Index2 < PEI_PERF_MAX_DESC_STRING; Index2++) {\r
196 if (PerfHobData->Log[Index].DescriptionString[Index2] == 0) {\r
197 Log = &(PerfHobData->Log[Index]);\r
198 break;\r
199 }\r
200 if (PerfHobData->Log[Index].DescriptionString[Index2] !=\r
201 Token[Index2]) {\r
202 break;\r
203 }\r
204 }\r
205 if (Log != NULL) {\r
206 if (FileHeader != NULL) {\r
207 Guid = &(Log->Name);\r
208 CheckGuid = &(FileHeader->Name);\r
209 if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
210 (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
211 (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
212 (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {\r
213 if (Value != 0) {\r
214 Log->StopTimeCount = Value;\r
215 } else {\r
216 Log->StopTimeCount = TimeCount;\r
217 }\r
218 break;\r
219 }\r
220 } else {\r
221 if (Value != 0) {\r
222 Log->StopTimeCount = Value;\r
223 } else {\r
224 Log->StopTimeCount = TimeCount;\r
225 }\r
226 break;\r
227 }\r
228 }\r
229 }\r
230 \r
231 }\r
232\r
233 return;\r
234}\r