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
00133 static int hardclock_init = 0;
00134 static struct timeval tv_init;
00135
00136 unsigned long hardclock( void )
00137 {
00138 struct timeval tv_cur;
00139
00140 if( hardclock_init == 0 )
00141 {
00142 gettimeofday( &tv_init, NULL );
00143 hardclock_init = 1;
00144 }
00145
00146 gettimeofday( &tv_cur, NULL );
00147 return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
00148 + ( tv_cur.tv_usec - tv_init.tv_usec ) );
00149 }
00150
00151 #endif
00152 #endif
00153 #endif
00154 #endif
00155 #endif
00156 #endif
00157 #endif
00158
00159 int alarmed = 0;
00160
00161 #if defined(WIN32)
00162
00163 unsigned long get_timer( struct hr_time *val, int reset )
00164 {
00165 unsigned long delta;
00166 LARGE_INTEGER offset, hfreq;
00167 struct _hr_time *t = (struct _hr_time *) val;
00168
00169 QueryPerformanceCounter( &offset );
00170 QueryPerformanceFrequency( &hfreq );
00171
00172 delta = (unsigned long)( ( 1000 *
00173 ( offset.QuadPart - t->start.QuadPart ) ) /
00174 hfreq.QuadPart );
00175
00176 if( reset )
00177 QueryPerformanceCounter( &t->start );
00178
00179 return( delta );
00180 }
00181
00182 DWORD WINAPI TimerProc( LPVOID uElapse )
00183 {
00184 Sleep( (DWORD) uElapse );
00185 alarmed = 1;
00186 return( TRUE );
00187 }
00188
00189 void set_alarm( int seconds )
00190 {
00191 DWORD ThreadId;
00192
00193 alarmed = 0;
00194 CloseHandle( CreateThread( NULL, 0, TimerProc,
00195 (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
00196 }
00197
00198 void m_sleep( int milliseconds )
00199 {
00200 Sleep( milliseconds );
00201 }
00202
00203 #else
00204
00205 unsigned long get_timer( struct hr_time *val, int reset )
00206 {
00207 unsigned long delta;
00208 struct timeval offset;
00209 struct _hr_time *t = (struct _hr_time *) val;
00210
00211 gettimeofday( &offset, NULL );
00212
00213 delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
00214 + ( offset.tv_usec - t->start.tv_usec ) / 1000;
00215
00216 if( reset )
00217 {
00218 t->start.tv_sec = offset.tv_sec;
00219 t->start.tv_usec = offset.tv_usec;
00220 }
00221
00222 return( delta );
00223 }
00224
00225 static void sighandler( int signum )
00226 {
00227 alarmed = 1;
00228 signal( signum, sighandler );
00229 }
00230
00231 void set_alarm( int seconds )
00232 {
00233 alarmed = 0;
00234 signal( SIGALRM, sighandler );
00235 alarm( seconds );
00236 }
00237
00238 void m_sleep( int milliseconds )
00239 {
00240 struct timeval tv;
00241
00242 tv.tv_sec = milliseconds / 1000;
00243 tv.tv_usec = milliseconds * 1000;
00244
00245 select( 0, NULL, NULL, NULL, &tv );
00246 }
00247
00248 #endif
00249
00250 #endif