Messages in this thread | | | Date | Tue, 29 Apr 1997 21:20:09 -0700 | From | Joe Fouche <> | Subject | Utilizing rdtsc on i586? |
| |
I made the following module to try out the Pentium cycle counter, but I believe it's broken. For one thing, it seems to cause random processes to segfault upon loading (at least, it did this before adding the cli()/sti() around the main code... not sure if it would do it anymore). For another, it returns 67 cycles for a for loop that [according to the assembly output] should take about 20. It returns around 5000 cycles if the index starts out as 1000. (I have a p100)
Hope there's a kind soul out there willing to point out my mistakes, or why this has anomalous output.
[cut here] #include <linux/config.h> #include <linux/module.h> #include <asm/system.h> #include <asm/segment.h> #include <asm/uaccess.h> #include <linux/types.h> #include <linux/stddef.h> #include <linux/timer.h> #include <linux/malloc.h>
#ifdef MODULE
int init_module(void) { unsigned int cnt3, cnt2, cnt1; int i; printk("cc: started... "); cli(); __asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt3)); /* put code to time here */ for(i=0;i<10;i++); /* end code to time here */ __asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt3)); sti(); printk(" operation took %d cycles\n", cnt2-cnt1); return 0; }
void cleanup_module(void) { } #endif [cut here] -- _ ____ Joe Fouche (jf@ugcs.caltech.edu) ___| |--- Deranged College Student
| |