00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "xyssl/config.h"
00022
00023 #if defined(XYSSL_TIMING_C)
00024
00025 #include "xyssl/timing.h"
00026
00027 #if defined(WIN32)
00028
00029 #include <windows.h>
00030 #include <winbase.h>
00031
00032 struct _hr_time
00033 {
00034 LARGE_INTEGER start;
00035 };
00036
00037 #else
00038
00039 #include <unistd.h>
00040 #include <sys/types.h>
00041 #include <sys/time.h>
00042 #include <signal.h>
00043 #include <time.h>
00044
00045 struct _hr_time
00046 {
00047 struct timeval start;
00048 };
00049
00050 #endif
00051
00052 #if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
00053
00054 unsigned long hardclock( void )
00055 {
00056 unsigned long tsc;
00057 __asm rdtsc
00058 __asm mov [tsc], eax
00059 return( tsc );
00060 }
00061
00062 #else
00063 #if defined(__GNUC__) && defined(__i386__)
00064
00065 unsigned long hardclock( void )
00066 {
00067 unsigned long tsc;
00068 asm( "rdtsc" : "=a" (tsc) );
00069 return( tsc );
00070 }
00071
00072 #else
00073 #if defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
00074
00075 unsigned long hardclock( void )
00076 {
00077 unsigned long lo, hi;
00078 asm( "rdtsc" : "=a" (lo), "=d" (hi) );
00079 return( lo | (hi << 32) );
00080 }
00081
00082 #else
00083 #if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
00084
00085 unsigned long hardclock( void )
00086 {
00087 unsigned long tbl, tbu0, tbu1;
00088
00089 do
00090 {
00091 asm( "mftbu %0" : "=r" (tbu0) );
00092 asm( "mftb %0" : "=r" (tbl ) );
00093 asm( "mftbu %0" : "=r" (tbu1) );
00094 }
00095 while( tbu0 != tbu1 );
00096
00097 return( tbl );
00098 }
00099
00100 #else
00101 #if defined(__GNUC__) && defined(__sparc__)
00102
00103 unsigned long hardclock( void )
00104 {
00105 unsigned long tick;
00106 asm( ".byte 0x83, 0x41, 0x00, 0x00" );
00107 asm( "mov %%g1, %0" : "=r" (tick) );
00108 return( tick );
00109 }
00110
00111 #else
00112 #if defined(__GNUC__) && defined(__alpha__)
00113
00114 unsigned long hardclock( void )
00115 {
00116 unsigned long cc;
00117 asm( "rpcc %0" : "=r" (cc) );
00118 return( cc & 0xFFFFFFFF );
00119 }
00120
00121 #else
00122 #if defined(__GNUC__) && defined(__ia64__)
00123
00124 unsigned long hardclock( void )
00125 {
00126 unsigned long itc;
00127 asm( "mov %0 = ar.itc" : "=r" (itc) );
00128 return( itc );
00129 }
00130
00131 #else
00132 #if defined(WIN32)
00133 static int hardclock_init = 0;
00134 static SYSTEMTIME st_init;
00135
00136 unsigned int hardclock( void )
00137 {
00138 SYSTEMTIME st_cur;
00139
00140 if( hardclock_init == 0 )
00141 {
00142 GetSystemTime( &st_init );
00143 hardclock_init = 1;
00144 }
00145
00146 GetSystemTime( &st_cur );
00147 return( ( st_cur.wSecond - st_init.wSecond ) * 1000000
00148 + ( st_cur.wMilliseconds - st_init.wMilliseconds )*1000 );
00149 }
00150 #else
00151
00152 static int hardclock_init = 0;
00153 static struct timeval tv_init;
00154
00155 unsigned long hardclock( void )
00156 {
00157 struct timeval tv_cur;
00158
00159 if( hardclock_init == 0 )
00160 {
00161 gettimeofday( &tv_init, NULL );
00162 hardclock_init = 1;
00163 }
00164
00165 gettimeofday( &tv_cur, NULL );
00166 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
00167 + ( tv_cur.tv_usec - tv_init.tv_usec ) );
00168 }
00169
00170 #endif
00171 #endif
00172 #endif
00173 #endif
00174 #endif
00175 #endif
00176 #endif
00177 #endif
00178
00179 int alarmed = 0;
00180
00181 #if defined(WIN32)
00182
00183 unsigned long get_timer( struct hr_time *val, int reset )
00184 {
00185 unsigned long delta;
00186 LARGE_INTEGER offset, hfreq;
00187 struct _hr_time *t = (struct _hr_time *) val;
00188
00189 QueryPerformanceCounter( &offset );
00190 QueryPerformanceFrequency( &hfreq );
00191
00192 delta = (unsigned long)( ( 1000 *
00193 ( offset.QuadPart - t->start.QuadPart ) ) /
00194 hfreq.QuadPart );
00195
00196 if( reset )
00197 QueryPerformanceCounter( &t->start );
00198
00199 return( delta );
00200 }
00201
00202 DWORD WINAPI TimerProc( LPVOID uElapse )
00203 {
00204 Sleep( (DWORD) uElapse );
00205 alarmed = 1;
00206 return( TRUE );
00207 }
00208
00209 void set_alarm( int seconds )
00210 {
00211 DWORD ThreadId;
00212
00213 alarmed = 0;
00214 CloseHandle( CreateThread( NULL, 0, TimerProc,
00215 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
00216 }
00217
00218 void m_sleep( int milliseconds )
00219 {
00220 Sleep( milliseconds );
00221 }
00222
00223 #else
00224
00225 unsigned long get_timer( struct hr_time *val, int reset )
00226 {
00227 unsigned long delta;
00228 struct timeval offset;
00229 struct _hr_time *t = (struct _hr_time *) val;
00230
00231 gettimeofday( &offset, NULL );
00232
00233 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
00234 + ( offset.tv_usec - t->start.tv_usec ) / 1000;
00235
00236 if( reset )
00237 {
00238 t->start.tv_sec = offset.tv_sec;
00239 t->start.tv_usec = offset.tv_usec;
00240 }
00241
00242 return( delta );
00243 }
00244
00245 static void sighandler( int signum )
00246 {
00247 alarmed = 1;
00248 signal( signum, sighandler );
00249 }
00250
00251 void set_alarm( int seconds )
00252 {
00253 alarmed = 0;
00254 signal( SIGALRM, sighandler );
00255 alarm( seconds );
00256 }
00257
00258 void m_sleep( int milliseconds )
00259 {
00260 struct timeval tv;
00261
00262 tv.tv_sec = milliseconds / 1000;
00263 tv.tv_usec = milliseconds * 1000;
00264
00265 select( 0, NULL, NULL, NULL, &tv );
00266 }
00267
00268 #endif
00269
00270 #endif