]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkUnixPkg/Dxe/UnixThunk/Chipset/Timer/Timer.c
start timer at initialization
[mirror_edk2.git] / EdkUnixPkg / Dxe / UnixThunk / Chipset / Timer / Timer.c
index 8001138b948ffbd703511e609c6d5202b8a5202d..37fdde5ed3628435ef35a0b5e519781dc983c763 100644 (file)
@@ -48,12 +48,8 @@ EFI_TIMER_NOTIFY        mTimerNotifyFunction = NULL;
 //\r
 // The current period of the timer interrupt\r
 //\r
-UINT64                  mTimerPeriod;\r
+UINT64                  mTimerPeriodMs;\r
 \r
-//\r
-// The timer value from the last timer interrupt\r
-//\r
-UINT32                  mNtLastTick;\r
 \r
 VOID\r
 TimerCallback (UINT64 DeltaMs)
@@ -83,15 +79,17 @@ Returns:
 \r
   OriginalTPL = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL);\r
 \r
-  CallbackFunction = mTimerNotifyFunction;\r
+  if (OriginalTPL < EFI_TPL_HIGH_LEVEL) {
+    CallbackFunction = mTimerNotifyFunction;\r
 \r
-  //\r
-  // Only invoke the callback function if a Non-NULL handler has been\r
-  // registered. Assume all other handlers are legal.\r
-  //\r
-  if (CallbackFunction != NULL) {\r
-    CallbackFunction ((UINT64) (DeltaMs * 10000));\r
-  }\r
+    //\r
+    // Only invoke the callback function if a Non-NULL handler has been\r
+    // registered. Assume all other handlers are legal.\r
+    //\r
+    if (CallbackFunction != NULL) {\r
+      CallbackFunction ((UINT64) (DeltaMs * 10000));\r
+    }\r
+  }
 \r
   gBS->RestoreTPL (OriginalTPL);\r
 \r
@@ -161,7 +159,7 @@ Returns:
     gUnix->SetTimer (0, TimerCallback);
   } else if (mTimerNotifyFunction == NULL) {
     /* Enable Timer.  */
-    gUnix->SetTimer (mTimerPeriod * 10, TimerCallback);
+    gUnix->SetTimer (mTimerPeriodMs, TimerCallback);
   }
   mTimerNotifyFunction = NotifyFunction;\r
 \r
@@ -219,9 +217,9 @@ Returns:
   if (TimerPeriod == 0
       || ((TimerPeriod > TIMER_MINIMUM_VALUE)
          && (TimerPeriod < TIMER_MAXIMUM_VALUE))) {\r
-    mTimerPeriod = TimerPeriod;\r
+    mTimerPeriodMs = DivU64x32 (TimerPeriod + 5000, 10000);\r
 
-    gUnix->SetTimer (TimerPeriod * 10, TimerCallback);
+    gUnix->SetTimer (mTimerPeriodMs, TimerCallback);
   }
 \r
   return EFI_SUCCESS;\r
@@ -261,7 +259,7 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  *TimerPeriod = mTimerPeriod;\r
+  *TimerPeriod = mTimerPeriodMs * 10000;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -354,5 +352,13 @@ Returns:
     return Status;\r
   }\r
 \r
+  //\r
+  // Start the timer thread at the default timer period\r
+  //\r
+  Status = mTimer.SetTimerPeriod (&mTimer, DEFAULT_TIMER_TICK_DURATION);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+
   return EFI_SUCCESS;\r
 }\r