You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.6 KiB
131 lines
3.6 KiB
// This file was extracted from the TCG Published |
|
// Trusted Platform Module Library |
|
// Part 4: Supporting Routines |
|
// Family "2.0" |
|
// Level 00 Revision 01.16 |
|
// October 30, 2014 |
|
|
|
#include "PlatformData.h" |
|
#include "Platform.h" |
|
|
|
#ifdef __linux__ |
|
|
|
#include <sys/time.h> |
|
// Function clock() does not provide accurate wall clock time on linux, let's |
|
// substitite it with our own caclulations. |
|
// |
|
// Return current wall clock modulo milliseconds. |
|
static UINT64 clock(void) |
|
{ |
|
struct timeval tv; |
|
gettimeofday(&tv, NULL); |
|
return (UINT64)tv.tv_sec * 1000 + tv.tv_usec / 1000; |
|
} |
|
#else |
|
#include <time.h> |
|
#endif |
|
// |
|
// |
|
// Functions |
|
// |
|
// _plat__ClockReset() |
|
// |
|
// Set the current clock time as initial time. This function is called at a power on event to reset the clock |
|
// |
|
LIB_EXPORT void |
|
_plat__ClockReset( |
|
void |
|
) |
|
{ |
|
// Implementation specific: Microsoft C set CLOCKS_PER_SEC to be 1/1000, |
|
// so here the measurement of clock() is in millisecond. |
|
s_initClock = clock(); |
|
s_adjustRate = CLOCK_NOMINAL; |
|
return; |
|
} |
|
// |
|
// |
|
// _plat__ClockTimeFromStart() |
|
// |
|
// Function returns the compensated time from the start of the command when |
|
// _plat__ClockTimeFromStart() was called. |
|
// |
|
unsigned long long |
|
_plat__ClockTimeFromStart( |
|
void |
|
) |
|
{ |
|
unsigned long long currentClock = clock(); |
|
return ((currentClock - s_initClock) * CLOCK_NOMINAL) / s_adjustRate; |
|
} |
|
// |
|
// |
|
// _plat__ClockTimeElapsed() |
|
// |
|
// Get the time elapsed from current to the last time the _plat__ClockTimeElapsed() is called. For the first |
|
// _plat__ClockTimeElapsed() call after a power on event, this call report the elapsed time from power on to |
|
// the current call |
|
// |
|
LIB_EXPORT unsigned long long |
|
_plat__ClockTimeElapsed( |
|
void |
|
// |
|
) |
|
{ |
|
unsigned long long elapsed; |
|
unsigned long long currentClock = clock(); |
|
elapsed = ((currentClock - s_initClock) * CLOCK_NOMINAL) / s_adjustRate; |
|
s_initClock += (elapsed * s_adjustRate) / CLOCK_NOMINAL; |
|
#ifdef DEBUGGING_TIME |
|
// Put this in so that TPM time will pass much faster than real time when |
|
// doing debug. |
|
// A value of 1000 for DEBUG_TIME_MULTIPLER will make each ms into a second |
|
// A good value might be 100 |
|
elapsed *= DEBUG_TIME_MULTIPLIER |
|
#endif |
|
return elapsed; |
|
} |
|
// |
|
// |
|
// _plat__ClockAdjustRate() |
|
// |
|
// Adjust the clock rate |
|
// |
|
LIB_EXPORT void |
|
_plat__ClockAdjustRate( |
|
int adjust // IN: the adjust number. It could be positive |
|
// or negative |
|
) |
|
{ |
|
// We expect the caller should only use a fixed set of constant values to |
|
// adjust the rate |
|
switch(adjust) |
|
{ |
|
case CLOCK_ADJUST_COARSE: |
|
s_adjustRate += CLOCK_ADJUST_COARSE; |
|
break; |
|
case -CLOCK_ADJUST_COARSE: |
|
s_adjustRate -= CLOCK_ADJUST_COARSE; |
|
break; |
|
case CLOCK_ADJUST_MEDIUM: |
|
s_adjustRate += CLOCK_ADJUST_MEDIUM; |
|
break; |
|
case -CLOCK_ADJUST_MEDIUM: |
|
s_adjustRate -= CLOCK_ADJUST_MEDIUM; |
|
break; |
|
case CLOCK_ADJUST_FINE: |
|
s_adjustRate += CLOCK_ADJUST_FINE; |
|
break; |
|
case -CLOCK_ADJUST_FINE: |
|
s_adjustRate -= CLOCK_ADJUST_FINE; |
|
break; |
|
default: |
|
// ignore any other values; |
|
break; |
|
} |
|
if(s_adjustRate > (CLOCK_NOMINAL + CLOCK_ADJUST_LIMIT)) |
|
s_adjustRate = CLOCK_NOMINAL + CLOCK_ADJUST_LIMIT; |
|
if(s_adjustRate < (CLOCK_NOMINAL - CLOCK_ADJUST_LIMIT)) |
|
s_adjustRate = CLOCK_NOMINAL-CLOCK_ADJUST_LIMIT; |
|
return; |
|
}
|
|
|