1 /** @file 2 Declarations of objects defined internally to the Dp Application. 3 4 Declarations of data and functions which are private to the Dp application. 5 This file should never be referenced by anything other than components of the 6 Dp application. In addition to global data, function declarations for 7 DpUtilities.c, DpTrace.c, and DpProfile.c are included here. 8 9 Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved. 10 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> 11 This program and the accompanying materials 12 are licensed and made available under the terms and conditions of the BSD License 13 which accompanies this distribution. The full text of the license may be found at 14 http://opensource.org/licenses/bsd-license.php 15 16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 17 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 18 **/ 19 #ifndef _DP_INTELNAL_H_ 20 #define _DP_INTELNAL_H_ 21 22 #define DP_GAUGE_STRING_LENGTH 36 23 24 // 25 /// Module-Global Variables 26 ///@{ 27 extern EFI_HII_HANDLE gDpHiiHandle; 28 extern CHAR16 mGaugeString[DP_GAUGE_STRING_LENGTH + 1]; 29 extern CHAR16 mUnicodeToken[DXE_PERFORMANCE_STRING_SIZE]; 30 extern UINT64 mInterestThreshold; 31 extern BOOLEAN mShowId; 32 33 extern PERF_SUMMARY_DATA SummaryData; ///< Create the SummaryData structure and init. to ZERO. 34 35 /// Timer Specific Information. 36 extern TIMER_INFO TimerInfo; 37 38 /// Items for which to gather cumulative statistics. 39 extern PERF_CUM_DATA CumData[]; 40 41 /// Number of items for which we are gathering cumulative statistics. 42 extern UINT32 const NumCum; 43 44 ///@} 45 46 /** 47 Calculate an event's duration in timer ticks. 48 49 Given the count direction and the event's start and end timer values, 50 calculate the duration of the event in timer ticks. Information for 51 the current measurement is pointed to by the parameter. 52 53 If the measurement's start time is 1, it indicates that the developer 54 is indicating that the measurement began at the release of reset. 55 The start time is adjusted to the timer's starting count before performing 56 the elapsed time calculation. 57 58 The calculated duration, in ticks, is the absolute difference between 59 the measurement's ending and starting counts. 60 61 @param Measurement Pointer to a MEASUREMENT_RECORD structure containing 62 data for the current measurement. 63 64 @return The 64-bit duration of the event. 65 **/ 66 UINT64 67 GetDuration ( 68 IN OUT MEASUREMENT_RECORD *Measurement 69 ); 70 71 /** 72 Determine whether the Measurement record is for an EFI Phase. 73 74 The Token and Module members of the measurement record are checked. 75 Module must be empty and Token must be one of SEC, PEI, DXE, BDS, or SHELL. 76 77 @param[in] Measurement A pointer to the Measurement record to test. 78 79 @retval TRUE The measurement record is for an EFI Phase. 80 @retval FALSE The measurement record is NOT for an EFI Phase. 81 **/ 82 BOOLEAN 83 IsPhase( 84 IN MEASUREMENT_RECORD *Measurement 85 ); 86 87 /** 88 Get the file name portion of the Pdb File Name. 89 90 The portion of the Pdb File Name between the last backslash and 91 either a following period or the end of the string is converted 92 to Unicode and copied into UnicodeBuffer. The name is truncated, 93 if necessary, to ensure that UnicodeBuffer is not overrun. 94 95 @param[in] PdbFileName Pdb file name. 96 @param[out] UnicodeBuffer The resultant Unicode File Name. 97 98 **/ 99 VOID 100 DpGetShortPdbFileName ( 101 IN CHAR8 *PdbFileName, 102 OUT CHAR16 *UnicodeBuffer 103 ); 104 105 /** 106 Get a human readable name for an image handle. 107 The following methods will be tried orderly: 108 1. Image PDB 109 2. ComponentName2 protocol 110 3. FFS UI section 111 4. Image GUID 112 5. Image DevicePath 113 6. Unknown Driver Name 114 115 @param[in] Handle 116 117 @post The resulting Unicode name string is stored in the 118 mGaugeString global array. 119 120 **/ 121 VOID 122 DpGetNameFromHandle ( 123 IN EFI_HANDLE Handle 124 ); 125 126 /** 127 Calculate the Duration in microseconds. 128 129 Duration is multiplied by 1000, instead of Frequency being divided by 1000 or 130 multiplying the result by 1000, in order to maintain precision. Since Duration is 131 a 64-bit value, multiplying it by 1000 is unlikely to produce an overflow. 132 133 The time is calculated as (Duration * 1000) / Timer_Frequency. 134 135 @param[in] Duration The event duration in timer ticks. 136 137 @return A 64-bit value which is the Elapsed time in microseconds. 138 **/ 139 UINT64 140 DurationInMicroSeconds ( 141 IN UINT64 Duration 142 ); 143 144 /** 145 Get index of Measurement Record's match in the CumData array. 146 147 If the Measurement's Token value matches a Token in one of the CumData 148 records, the index of the matching record is returned. The returned 149 index is a signed value so that negative values can indicate that 150 the Measurement didn't match any entry in the CumData array. 151 152 @param[in] Measurement A pointer to a Measurement Record to match against the CumData array. 153 154 @retval <0 Token is not in the CumData array. 155 @retval >=0 Return value is the index into CumData where Token is found. 156 **/ 157 INTN 158 GetCumulativeItem( 159 IN MEASUREMENT_RECORD *Measurement 160 ); 161 162 /** 163 Collect verbose statistics about the logged performance measurements. 164 165 General Summary information for all Trace measurements is gathered and 166 stored within the SummaryData structure. This information is both 167 used internally by subsequent reporting functions, and displayed 168 at the end of verbose reports. 169 170 @pre The SummaryData and CumData structures must be initialized 171 prior to calling this function. 172 173 @post The SummaryData and CumData structures contain statistics for the 174 current performance logs. 175 176 @param[in, out] CustomCumulativeData The pointer to the custom cumulative data. 177 178 **/ 179 VOID 180 GatherStatistics( 181 IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL 182 ); 183 184 /** 185 Gather and print ALL Trace Records. 186 187 Displays all "interesting" Trace measurements in order.<BR> 188 The number of records displayed is controlled by: 189 - records with a duration less than mInterestThreshold microseconds are not displayed. 190 - No more than Limit records are displayed. A Limit of zero will not limit the output. 191 - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not 192 displayed. 193 194 @pre The mInterestThreshold global variable is set to the shortest duration to be printed. 195 The mGaugeString and mUnicodeToken global arrays are used for temporary string storage. 196 They must not be in use by a calling function. 197 198 @param[in] Limit The number of records to print. Zero is ALL. 199 @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. 200 201 **/ 202 VOID 203 DumpAllTrace( 204 IN UINTN Limit, 205 IN BOOLEAN ExcludeFlag 206 ); 207 208 /** 209 Gather and print Raw Trace Records. 210 211 All Trace measurements with a duration greater than or equal to 212 mInterestThreshold are printed without interpretation. 213 214 The number of records displayed is controlled by: 215 - records with a duration less than mInterestThreshold microseconds are not displayed. 216 - No more than Limit records are displayed. A Limit of zero will not limit the output. 217 - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not 218 displayed. 219 220 @pre The mInterestThreshold global variable is set to the shortest duration to be printed. 221 222 @param[in] Limit The number of records to print. Zero is ALL. 223 @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. 224 225 **/ 226 VOID 227 DumpRawTrace( 228 IN UINTN Limit, 229 IN BOOLEAN ExcludeFlag 230 ); 231 232 /** 233 Gather and print Major Phase metrics. 234 235 @param[in] Ticker The timer value for the END of Shell phase 236 237 **/ 238 VOID 239 ProcessPhases( 240 IN UINT64 Ticker 241 ); 242 243 244 /** 245 Gather and print Handle data. 246 247 @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. 248 249 @return Status from a call to gBS->LocateHandle(). 250 **/ 251 EFI_STATUS 252 ProcessHandles( 253 IN BOOLEAN ExcludeFlag 254 ); 255 256 257 /** 258 Gather and print PEIM data. 259 260 Only prints complete PEIM records 261 262 **/ 263 VOID 264 ProcessPeims( 265 VOID 266 ); 267 268 /** 269 Gather and print global data. 270 271 Strips out incomplete or "Execution Phase" records 272 Only prints records where Handle is NULL 273 Increment TIndex for every record, even skipped ones, so that we have an 274 indication of every measurement record taken. 275 276 **/ 277 VOID 278 ProcessGlobal( 279 VOID 280 ); 281 282 /** 283 Gather and print cumulative data. 284 285 Traverse the measurement records and:<BR> 286 For each record with a Token listed in the CumData array:<BR> 287 - Update the instance count and the total, minimum, and maximum durations. 288 Finally, print the gathered cumulative statistics. 289 290 @param[in] CustomCumulativeData The pointer to the custom cumulative data. 291 292 **/ 293 VOID 294 ProcessCumulative( 295 IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL 296 ); 297 298 /** 299 Gather and print ALL Profiling Records. 300 301 Displays all "interesting" Profile measurements in order. 302 The number of records displayed is controlled by: 303 - records with a duration less than mInterestThreshold microseconds are not displayed. 304 - No more than Limit records are displayed. A Limit of zero will not limit the output. 305 - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not 306 displayed. 307 308 @pre The mInterestThreshold global variable is set to the shortest duration to be printed. 309 The mGaugeString and mUnicodeToken global arrays are used for temporary string storage. 310 They must not be in use by a calling function. 311 312 @param[in] Limit The number of records to print. Zero is ALL. 313 @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. 314 315 **/ 316 VOID 317 DumpAllProfile( 318 IN UINTN Limit, 319 IN BOOLEAN ExcludeFlag 320 ); 321 322 /** 323 Gather and print Raw Profile Records. 324 325 All Profile measurements with a duration greater than or equal to 326 mInterestThreshold are printed without interpretation. 327 328 The number of records displayed is controlled by: 329 - records with a duration less than mInterestThreshold microseconds are not displayed. 330 - No more than Limit records are displayed. A Limit of zero will not limit the output. 331 - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not 332 displayed. 333 334 @pre The mInterestThreshold global variable is set to the shortest duration to be printed. 335 336 @param[in] Limit The number of records to print. Zero is ALL. 337 @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. 338 339 **/ 340 VOID 341 DumpRawProfile( 342 IN UINTN Limit, 343 IN BOOLEAN ExcludeFlag 344 ); 345 346 #endif 347