Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/UefiCpuPkg/Library/CpuTimerLib/CpuTimerLib.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156854
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/UefiCpuPkg/Library/CpuTimerLib/CpuTimerLib.c
r80721 r99404 14 14 #include <Register/Cpuid.h> 15 15 16 GUID mCpuCrystalFrequencyHobGuid = { 0xe1ec5ad0, 0x8569, 0x46bd, { 0x8d, 0xcd, 0x3b, 0x9f, 0x6f, 0x45, 0x82, 0x7a } }; 16 GUID mCpuCrystalFrequencyHobGuid = { 17 0xe1ec5ad0, 0x8569, 0x46bd, { 0x8d, 0xcd, 0x3b, 0x9f, 0x6f, 0x45, 0x82, 0x7a } 18 }; 17 19 18 20 /** … … 42 44 ) 43 45 { 44 UINT64 45 UINT64 46 UINT32 47 UINT32 48 UINT32 46 UINT64 TscFrequency; 47 UINT64 CoreXtalFrequency; 48 UINT32 RegEax; 49 UINT32 RegEbx; 50 UINT32 RegEcx; 49 51 50 52 // … … 58 60 // If EAX or EBX returns 0, the XTAL ratio is not enumerated. 59 61 // 60 if ( RegEax == 0 || RegEbx ==0) {62 if ((RegEax == 0) || (RegEbx == 0)) { 61 63 ASSERT (RegEax != 0); 62 64 ASSERT (RegEbx != 0); 63 65 return 0; 64 66 } 67 65 68 // 66 69 // If ECX returns 0, the XTAL frequency is not enumerated. … … 70 73 CoreXtalFrequency = PcdGet64 (PcdCpuCoreCrystalClockFrequency); 71 74 } else { 72 CoreXtalFrequency = (UINT64) 75 CoreXtalFrequency = (UINT64)RegEcx; 73 76 } 74 77 … … 100 103 // The target timer count is calculated here 101 104 // 102 Ticks = AsmReadTsc () + Delay;105 Ticks = AsmReadTsc () + Delay; 103 106 104 107 // … … 108 111 // Intel guarantees a minimum of 10 years before the TSC wraps. 109 112 // 110 while (AsmReadTsc () <= Ticks) {111 CpuPause ();113 while (AsmReadTsc () <= Ticks) { 114 CpuPause (); 112 115 } 113 116 } … … 129 132 ) 130 133 { 131 132 134 InternalCpuDelay ( 133 135 DivU64x32 ( … … 137 139 ), 138 140 1000000u 139 )140 );141 ) 142 ); 141 143 142 144 return MicroSeconds; … … 159 161 ) 160 162 { 161 162 163 InternalCpuDelay ( 163 164 DivU64x32 ( … … 167 168 ), 168 169 1000000000u 169 )170 );170 ) 171 ); 171 172 172 173 return NanoSeconds; … … 220 221 EFIAPI 221 222 GetPerformanceCounterProperties ( 222 OUT UINT64 *StartValue , OPTIONAL223 OUT UINT64 *StartValue OPTIONAL, 223 224 OUT UINT64 *EndValue OPTIONAL 224 225 ) … … 231 232 *EndValue = 0xffffffffffffffffULL; 232 233 } 234 233 235 return InternalGetPerformanceCounterFrequency (); 234 236 } … … 270 272 // i.e. highest bit set in Remainder should <= 33. 271 273 // 272 Shift = MAX (0, HighBitSet64 (Remainder) - 33);273 Remainder = RShiftU64 (Remainder, (UINTN)Shift);274 Frequency = RShiftU64 (Frequency, (UINTN)Shift);274 Shift = MAX (0, HighBitSet64 (Remainder) - 33); 275 Remainder = RShiftU64 (Remainder, (UINTN)Shift); 276 Frequency = RShiftU64 (Frequency, (UINTN)Shift); 275 277 NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL); 276 278 277 279 return NanoSeconds; 278 280 } 279
Note:
See TracChangeset
for help on using the changeset viewer.