28 #if defined(POLARSSL_TIMING_C)
32 #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
45 #include <sys/types.h>
57 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
58 (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
60 #define POLARSSL_HAVE_HARDCLOCK
71 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
72 defined(__GNUC__) && defined(__i386__)
74 #define POLARSSL_HAVE_HARDCLOCK
79 asm(
"rdtsc" :
"=a" (lo),
"=d" (hi) );
84 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
85 defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
87 #define POLARSSL_HAVE_HARDCLOCK
92 asm(
"rdtsc" :
"=a" (lo),
"=d" (hi) );
93 return( lo | (hi << 32) );
97 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
98 defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
100 #define POLARSSL_HAVE_HARDCLOCK
104 unsigned long tbl, tbu0, tbu1;
108 asm(
"mftbu %0" :
"=r" (tbu0) );
109 asm(
"mftb %0" :
"=r" (tbl ) );
110 asm(
"mftbu %0" :
"=r" (tbu1) );
112 while( tbu0 != tbu1 );
118 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
119 defined(__GNUC__) && defined(__sparc64__)
121 #if defined(__OpenBSD__)
122 #warning OpenBSD does not allow access to tick register using software version instead
124 #define POLARSSL_HAVE_HARDCLOCK
129 asm(
"rdpr %%tick, %0;" :
"=&r" (tick) );
135 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
136 defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__)
138 #define POLARSSL_HAVE_HARDCLOCK
143 asm(
".byte 0x83, 0x41, 0x00, 0x00" );
144 asm(
"mov %%g1, %0" :
"=r" (tick) );
149 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
150 defined(__GNUC__) && defined(__alpha__)
152 #define POLARSSL_HAVE_HARDCLOCK
157 asm(
"rpcc %0" :
"=r" (cc) );
158 return( cc & 0xFFFFFFFF );
162 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(POLARSSL_HAVE_ASM) && \
163 defined(__GNUC__) && defined(__ia64__)
165 #define POLARSSL_HAVE_HARDCLOCK
170 asm(
"mov %0 = ar.itc" :
"=r" (itc) );
175 #if !defined(POLARSSL_HAVE_HARDCLOCK) && defined(_MSC_VER) && \
176 !defined(EFIX64) && !defined(EFI32)
178 #define POLARSSL_HAVE_HARDCLOCK
182 LARGE_INTEGER offset;
184 QueryPerformanceCounter( &offset );
186 return (
unsigned long)( offset.QuadPart );
190 #if !defined(POLARSSL_HAVE_HARDCLOCK)
192 #define POLARSSL_HAVE_HARDCLOCK
194 static int hardclock_init = 0;
195 static struct timeval tv_init;
199 struct timeval tv_cur;
201 if( hardclock_init == 0 )
203 gettimeofday( &tv_init, NULL );
207 gettimeofday( &tv_cur, NULL );
208 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
209 + ( tv_cur.tv_usec - tv_init.tv_usec ) );
215 #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
220 LARGE_INTEGER offset, hfreq;
221 struct _hr_time *t = (
struct _hr_time *) val;
223 QueryPerformanceCounter( &offset );
224 QueryPerformanceFrequency( &hfreq );
226 delta = (
unsigned long)( ( 1000 *
227 ( offset.QuadPart - t->start.QuadPart ) ) /
231 QueryPerformanceCounter( &t->start );
236 DWORD WINAPI TimerProc( LPVOID uElapse )
238 Sleep( (DWORD) uElapse );
248 CloseHandle( CreateThread( NULL, 0, TimerProc,
249 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
252 void m_sleep(
int milliseconds )
254 Sleep( milliseconds );
262 struct timeval offset;
263 struct _hr_time *t = (
struct _hr_time *) val;
265 gettimeofday( &offset, NULL );
267 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
268 + ( offset.tv_usec - t->start.tv_usec ) / 1000;
272 t->start.tv_sec = offset.tv_sec;
273 t->start.tv_usec = offset.tv_usec;
279 #if defined(INTEGRITY)
280 void m_sleep(
int milliseconds )
282 usleep( milliseconds * 1000 );
287 static void sighandler(
int signum )
290 signal( signum, sighandler );
296 signal( SIGALRM, sighandler );
300 void m_sleep(
int milliseconds )
304 tv.tv_sec = milliseconds / 1000;
305 tv.tv_usec = milliseconds * 1000;
307 select( 0, NULL, NULL, NULL, &tv );
unsigned long get_timer(struct hr_time *val, int reset)
Return the elapsed time in milliseconds.
void set_alarm(int seconds)
Setup an alarm clock.
Configuration options (set of defines)
unsigned long hardclock(void)
Return the CPU cycle counter value.
void m_sleep(int milliseconds)
Sleep for a certain amount of time.
Portable interface to the CPU cycle counter.