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