#include #include #include #if defined(__i386__) typedef unsigned long long u64; # define __PRI64_PREFIX "ll" #define rdtscll(val) \ __asm__ __volatile__("rdtsc" : "=A" (val)) #elif defined(__x86_64__) typedef unsigned long u64; # define __PRI64_PREFIX "l" #define rdtscll(val) do { \ unsigned int a,d; \ asm volatile("rdtsc" : "=a" (a), "=d" (d)); \ (val) = ((unsigned long)a) | (((unsigned long)d)<<32); \ } while(0) #endif # define PRId64 __PRI64_PREFIX "d" u64 diff[1000000]; int count; static void pio_inb(unsigned port) { int i; u64 t1, t2; iopl(3); //ioperm(0x512, 1, 1); for (i = 0; i < count; i++) { rdtscll(t1); inb(port); rdtscll(t2); diff[i] = t2-t1; } for (i = 0; i < count; i++) printf("port:0x%x, tsc diff: %"PRId64"\n", port, diff[i]); } int main(int argc, char** argv) { if (argc != 3) { printf("usage: app 0xport_num count\n"); return -1; } count = atoi(argv[2]); pio_inb((unsigned)strtoul(argv[1], NULL, 16)); return 0; }