28 #if defined(POLARSSL_TIMING_C)
45 #include <sys/types.h>
57 #if defined(POLARSSL_HAVE_ASM) && \
58 (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
69 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__i386__)
74 asm(
"rdtsc" :
"=a" (lo),
"=d" (hi) );
79 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \
80 (defined(__amd64__) || defined(__x86_64__))
85 asm(
"rdtsc" :
"=a" (lo),
"=d" (hi) );
86 return( lo | (hi << 32) );
90 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && \
91 (defined(__powerpc__) || defined(__ppc__))
95 unsigned long tbl, tbu0, tbu1;
99 asm(
"mftbu %0" :
"=r" (tbu0) );
100 asm(
"mftb %0" :
"=r" (tbl ) );
101 asm(
"mftbu %0" :
"=r" (tbu1) );
103 while( tbu0 != tbu1 );
109 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__sparc__)
114 asm(
".byte 0x83, 0x41, 0x00, 0x00" );
115 asm(
"mov %%g1, %0" :
"=r" (tick) );
120 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__alpha__)
125 asm(
"rpcc %0" :
"=r" (cc) );
126 return( cc & 0xFFFFFFFF );
130 #if defined(POLARSSL_HAVE_ASM) && defined(__GNUC__) && defined(__ia64__)
135 asm(
"mov %0 = ar.itc" :
"=r" (itc) );
140 #if defined(_MSC_VER)
144 LARGE_INTEGER offset;
146 QueryPerformanceCounter( &offset );
148 return (
unsigned long)( offset.QuadPart );
153 static int hardclock_init = 0;
154 static struct timeval tv_init;
158 struct timeval tv_cur;
160 if( hardclock_init == 0 )
162 gettimeofday( &tv_init, NULL );
166 gettimeofday( &tv_cur, NULL );
167 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
168 + ( tv_cur.tv_usec - tv_init.tv_usec ) );
187 LARGE_INTEGER offset, hfreq;
188 struct _hr_time *t = (
struct _hr_time *) val;
190 QueryPerformanceCounter( &offset );
191 QueryPerformanceFrequency( &hfreq );
193 delta = (
unsigned long)( ( 1000 *
194 ( offset.QuadPart - t->start.QuadPart ) ) /
198 QueryPerformanceCounter( &t->start );
203 DWORD WINAPI TimerProc( LPVOID uElapse )
205 Sleep( (DWORD) uElapse );
215 CloseHandle( CreateThread( NULL, 0, TimerProc,
216 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
219 void m_sleep(
int milliseconds )
221 Sleep( milliseconds );
229 struct timeval offset;
230 struct _hr_time *t = (
struct _hr_time *) val;
232 gettimeofday( &offset, NULL );
234 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
235 + ( offset.tv_usec - t->start.tv_usec ) / 1000;
239 t->start.tv_sec = offset.tv_sec;
240 t->start.tv_usec = offset.tv_usec;
246 static void sighandler(
int signum )
249 signal( signum, sighandler );
255 signal( SIGALRM, sighandler );
259 void m_sleep(
int milliseconds )
263 tv.tv_sec = milliseconds / 1000;
264 tv.tv_usec = milliseconds * 1000;
266 select( 0, NULL, NULL, NULL, &tv );