]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/TianoTools/Common/PeiLib/Perf.c
Add <FrameworkModules> in EdkModulePkg-All-Archs.fpd and MdePkg-All-Archs.fpd file...
[mirror_edk2.git] / Tools / Source / TianoTools / Common / PeiLib / Perf.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2004 - 2005, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
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
45PeiPerfMeasure (\r
46 EFI_PEI_SERVICES **PeiServices,\r
47 IN UINT16 *Token,\r
48 IN EFI_FFS_FILE_HEADER *FileHeader,\r
49 IN BOOLEAN EntryExit,\r
50 IN UINT64 Value\r
51 )\r
52/*++\r
53\r
54Routine Description:\r
55\r
56 Log a timestamp count.\r
57\r
58Arguments:\r
59\r
60 PeiServices - Pointer to the PEI Core Services table\r
61 \r
62 Token - Pointer to Token Name\r
63 \r
64 FileHeader - Pointer to the file header\r
65\r
66 EntryExit - Indicates start or stop measurement\r
67\r
68 Value - The start time or the stop time\r
69\r
70Returns:\r
71\r
72--*/\r
73{\r
74 EFI_STATUS Status;\r
75 EFI_HOB_GUID_TYPE *Hob;\r
76 EFI_HOB_GUID_DATA_PERFORMANCE_LOG *PerfHobData;\r
77 PEI_PERFORMANCE_MEASURE_LOG_ENTRY *Log;\r
78 EFI_PEI_PPI_DESCRIPTOR *PerfHobDescriptor;\r
79 UINT64 TimeCount;\r
80 INTN Index;\r
81 UINTN Index2;\r
82 EFI_GUID *Guid;\r
83 EFI_GUID *CheckGuid;\r
84\r
85 TimeCount = 0;\r
86 //\r
87 // Get the END time as early as possible to make it more accurate.\r
88 //\r
89 if (EntryExit) {\r
90 GetTimerValue (&TimeCount);\r
91 }\r
92\r
93 //\r
94 // Locate the Pei Performance Log Hob.\r
95 //\r
96 Status = (*PeiServices)->LocatePpi (\r
97 PeiServices,\r
98 &gEfiPeiPerformanceHobGuid,\r
99 0,\r
100 &PerfHobDescriptor,\r
101 NULL\r
102 );\r
103\r
104 //\r
105 // If the Performance Hob was not found, build and install one.\r
106 //\r
107 if (EFI_ERROR(Status)) {\r
108 Status = PeiBuildHobGuid (\r
109 PeiServices,\r
110 &gEfiPeiPerformanceHobGuid,\r
111 (sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG) +\r
112 ((MAX_PEI_PERF_LOG_ENTRIES-1) * \r
113 sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY)) +\r
114 sizeof(EFI_PEI_PPI_DESCRIPTOR)\r
115 ),\r
116 &Hob\r
117 );\r
118 ASSERT_PEI_ERROR(PeiServices, Status);\r
119\r
120 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(Hob+1);\r
121 PerfHobData->NumberOfEntries = 0;\r
122\r
123 PerfHobDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)((UINT8 *)(PerfHobData+1) +\r
124 (sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
125 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
126 )\r
127 );\r
128 PerfHobDescriptor->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);\r
129 PerfHobDescriptor->Guid = &gEfiPeiPerformanceHobGuid;\r
130 PerfHobDescriptor->Ppi = NULL;\r
131\r
132 (*PeiServices)->InstallPpi (\r
133 PeiServices,\r
134 PerfHobDescriptor\r
135 );\r
136 }\r
137\r
138 PerfHobData = (EFI_HOB_GUID_DATA_PERFORMANCE_LOG *)(((UINT8 *)(PerfHobDescriptor)) -\r
139 ((sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY) *\r
140 (MAX_PEI_PERF_LOG_ENTRIES-1)\r
141 )\r
142 + sizeof(EFI_HOB_GUID_DATA_PERFORMANCE_LOG)\r
143 )\r
144 );\r
145\r
146 if (PerfHobData->NumberOfEntries >= MAX_PEI_PERF_LOG_ENTRIES) {\r
147 return;\r
148 }\r
149\r
150 if (!EntryExit) {\r
151 Log = &(PerfHobData->Log[PerfHobData->NumberOfEntries]);\r
152 (*PeiServices)->SetMem (Log, sizeof(PEI_PERFORMANCE_MEASURE_LOG_ENTRY), 0);\r
153\r
154 //\r
155 // If not NULL pointer, copy the file name\r
156 //\r
157 if (FileHeader != NULL) {\r
158 Log->Name = FileHeader->Name;\r
159 }\r
160\r
161 //\r
162 // Copy the description string\r
163 //\r
164 (*PeiServices)->CopyMem (\r
165 &(Log->DescriptionString), \r
166 Token,\r
167 (PEI_PERF_MAX_DESC_STRING-1) * sizeof(UINT16)\r
168 );\r
169\r
170 //\r
171 // Get the start time as late as possible to make it more accurate.\r
172 //\r
173 GetTimerValue (&TimeCount);\r
174\r
175 //\r
176 // Record the time stamp.\r
177 //\r
178 if (Value != 0) {\r
179 Log->StartTimeCount = Value;\r
180 } else {\r
181 Log->StartTimeCount = TimeCount;\r
182 }\r
183 Log->StopTimeCount = 0;\r
184\r
185 //\r
186 // Increment the number of valid log entries.\r
187 //\r
188 PerfHobData->NumberOfEntries++;\r
189\r
190 } else {\r
191\r
192 for (Index = PerfHobData->NumberOfEntries-1; Index >= 0; Index--) {\r
193 Log = NULL;\r
194 for (Index2 = 0; Index2 < PEI_PERF_MAX_DESC_STRING; Index2++) {\r
195 if (PerfHobData->Log[Index].DescriptionString[Index2] == 0) {\r
196 Log = &(PerfHobData->Log[Index]);\r
197 break;\r
198 }\r
199 if (PerfHobData->Log[Index].DescriptionString[Index2] !=\r
200 Token[Index2]) {\r
201 break;\r
202 }\r
203 }\r
204 if (Log != NULL) {\r
205 if (FileHeader != NULL) {\r
206 Guid = &(Log->Name);\r
207 CheckGuid = &(FileHeader->Name);\r
208 if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
209 (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
210 (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
211 (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {\r
212 if (Value != 0) {\r
213 Log->StopTimeCount = Value;\r
214 } else {\r
215 Log->StopTimeCount = TimeCount;\r
216 }\r
217 break;\r
218 }\r
219 } else {\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 }\r
228 }\r
229 \r
230 }\r
231\r
232 return;\r
233}\r