#include /* CLOCKS_PER_SEC*/ #include /* HZ */ #include #if defined(__sparc__) /* This Sparc Linux version of __delay() */ static __inline__ void __delay(unsigned long loops) { __asm__ __volatile__("cmp %0, 0\n\t" "1: bne 1b\n\t" "subcc %0, 1, %0\n" : "=&r" (loops) : "0" (loops)); } #else static __inline__ void __delay(unsigned long loops) { register unsigned int iloops = (int) loops; __asm__ volatile ( ".align 2,0x90\n" "1: decl %0\n" "jns 1b\n" ::"a" (iloops) /*:"ax"*/); } #endif /* #if defined(__sparc__) */ unsigned long get_userspace_loops_per_sec() { unsigned long ticks, loops_per_sec = 1; while ((loops_per_sec <<= 1)) { ticks = clock(); while (ticks == clock()) ; ticks = clock(); __delay(loops_per_sec); ticks = clock() - ticks; if (ticks >= CLOCKS_PER_SEC) { loops_per_sec = (loops_per_sec / ticks) * HZ; return loops_per_sec; } } return -1; } #if defined(SELF) || defined(SELFTEST) || defined(SELF_BOGOMIPS) #include int main(void) { register unsigned long loops_per_sec; printf("Calibrating delay loop... "); fflush(stdout); loops_per_sec = get_userspace_loops_per_sec(); if (loops_per_sec < 0) { printf("failed\n"); return 1; } printf("ok - %lu.%02lu BogoMIPS\n", loops_per_sec/500000, (loops_per_sec/5000) % 100); return 0; } #endif