28 #if defined(POLARSSL_TIMING_C)
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)
177 #define POLARSSL_HAVE_HARDCLOCK
181 LARGE_INTEGER offset;
183 QueryPerformanceCounter( &offset );
185 return (
unsigned long)( offset.QuadPart );
189 #if !defined(POLARSSL_HAVE_HARDCLOCK)
191 #define POLARSSL_HAVE_HARDCLOCK
193 static int hardclock_init = 0;
194 static struct timeval tv_init;
198 struct timeval tv_cur;
200 if( hardclock_init == 0 )
202 gettimeofday( &tv_init, NULL );
206 gettimeofday( &tv_cur, NULL );
207 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
208 + ( tv_cur.tv_usec - tv_init.tv_usec ) );
219 LARGE_INTEGER offset, hfreq;
220 struct _hr_time *t = (
struct _hr_time *) val;
222 QueryPerformanceCounter( &offset );
223 QueryPerformanceFrequency( &hfreq );
225 delta = (
unsigned long)( ( 1000 *
226 ( offset.QuadPart - t->start.QuadPart ) ) /
230 QueryPerformanceCounter( &t->start );
235 DWORD WINAPI TimerProc( LPVOID uElapse )
237 Sleep( (DWORD) uElapse );
247 CloseHandle( CreateThread( NULL, 0, TimerProc,
248 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
251 void m_sleep(
int milliseconds )
253 Sleep( milliseconds );
261 struct timeval offset;
262 struct _hr_time *t = (
struct _hr_time *) val;
264 gettimeofday( &offset, NULL );
268 t->start.tv_sec = offset.tv_sec;
269 t->start.tv_usec = offset.tv_usec;
273 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
274 + ( offset.tv_usec - t->start.tv_usec ) / 1000;
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 );