]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c
EmulatorPkg/DxeTimerLib: drop superfluous cast
[mirror_edk2.git] / EmulatorPkg / Library / DxeTimerLib / DxeTimerLib.c
index 14bb17f00e120835bd1cf0dd3c610e678d8f2976..9c3e97e680a1423431908c04252be078404b403a 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   A non-functional instance of the Timer Library.\r
 \r
-  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -36,17 +30,17 @@ RegisterTimerArchProtocol (
   )\r
 {\r
   EFI_STATUS  Status;\r
-  \r
+\r
   Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **)&gTimerAp);\r
-  if (!EFI_ERROR (Status)) {    \r
+  if (!EFI_ERROR (Status)) {\r
     Status = gTimerAp->GetTimerPeriod (gTimerAp, &gTimerPeriod);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     // Convert to Nanoseconds.\r
     gTimerPeriod = MultU64x32 (gTimerPeriod, 100);\r
-    \r
+\r
     if (gTimerEvent == NULL) {\r
-      Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, (VOID **)&gTimerEvent);\r
+      Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &gTimerEvent);\r
       ASSERT_EFI_ERROR (Status);\r
     }\r
   }\r
@@ -93,21 +87,21 @@ NanoSecondDelay (
   EFI_STATUS  Status;\r
   UINT64      HundredNanoseconds;\r
   UINTN       Index;\r
-  \r
-  if ((gTimerPeriod != 0) && \r
-      ((UINT64)NanoSeconds > gTimerPeriod) && \r
+\r
+  if ((gTimerPeriod != 0) &&\r
+      ((UINT64)NanoSeconds > gTimerPeriod) &&\r
       (EfiGetCurrentTpl () == TPL_APPLICATION)) {\r
     //\r
     // This stall is long, so use gBS->WaitForEvent () to yield CPU to DXE Core\r
     //\r
-    \r
+\r
     HundredNanoseconds = DivU64x32 (NanoSeconds, 100);\r
     Status = gBS->SetTimer (gTimerEvent, TimerRelative, HundredNanoseconds);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     Status = gBS->WaitForEvent (sizeof (gTimerEvent)/sizeof (EFI_EVENT), &gTimerEvent, &Index);\r
     ASSERT_EFI_ERROR (Status);\r
-  \r
+\r
   } else {\r
     gEmuThunk->Sleep (NanoSeconds);\r
   }\r
@@ -172,7 +166,7 @@ GetPerformanceCounterProperties (
   if (EndValue != NULL) {\r
     *EndValue = (UINT64)-1LL;\r
   }\r
-  \r
+\r
   return gEmuThunk->QueryPerformanceFrequency ();\r
 }\r
 \r
@@ -204,3 +198,46 @@ DxeTimerLibConstructor (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Converts elapsed ticks of performance counter to time in nanoseconds.\r
+\r
+  This function converts the elapsed ticks of running performance counter to\r
+  time value in unit of nanoseconds.\r
+\r
+  @param  Ticks     The number of elapsed ticks of running performance counter.\r
+\r
+  @return The elapsed time in nanoseconds.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+GetTimeInNanoSecond (\r
+  IN UINT64  Ticks\r
+  )\r
+{\r
+  UINT64  Frequency;\r
+  UINT64  NanoSeconds;\r
+  UINT64  Remainder;\r
+  INTN    Shift;\r
+\r
+  Frequency = GetPerformanceCounterProperties (NULL, NULL);\r
+\r
+  //\r
+  //          Ticks\r
+  // Time = --------- x 1,000,000,000\r
+  //        Frequency\r
+  //\r
+  NanoSeconds = MultU64x32 (DivU64x64Remainder (Ticks, Frequency, &Remainder), 1000000000u);\r
+\r
+  //\r
+  // Ensure (Remainder * 1,000,000,000) will not overflow 64-bit.\r
+  // Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,\r
+  // i.e. highest bit set in Remainder should <= 33.\r
+  //\r
+  Shift = MAX (0, HighBitSet64 (Remainder) - 33);\r
+  Remainder = RShiftU64 (Remainder, (UINTN) Shift);\r
+  Frequency = RShiftU64 (Frequency, (UINTN) Shift);\r
+  NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);\r
+\r
+  return NanoSeconds;\r
+}\r