//\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)
\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
gUnix->SetTimer (0, TimerCallback);
} else if (mTimerNotifyFunction == NULL) {
/* Enable Timer. */
- gUnix->SetTimer (mTimerPeriod * 10, TimerCallback);
+ gUnix->SetTimer (mTimerPeriodMs, TimerCallback);
}
mTimerNotifyFunction = NotifyFunction;\r
\r
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
return EFI_INVALID_PARAMETER;\r
}\r
\r
- *TimerPeriod = mTimerPeriod;\r
+ *TimerPeriod = mTimerPeriodMs * 10000;\r
\r
return EFI_SUCCESS;\r
}\r
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