#include #include #define CACHELINESIZE 64 #define THRESHOLD 200 unsigned measureflush(void *table, size_t tablesize, uint8_t *bitmap) { size_t i; uint32_t t1; uint32_t t2; unsigned int bit; unsigned int n_hits = 0; for (i = 0; i < tablesize / CACHELINESIZE; i++) { __asm__ volatile ( " xor %%rax, %%rax \n" " cpuid \n" " rdtsc \n" " mov %%eax, %%edi \n" " mov (%[flushaddr]), %%rbx \n" " xor %%rax, %%rax \n" " cpuid \n" " rdtsc \n" " clflush (%[flushaddr]) \n" : "=a"(t2), "=D"(t1) : [flushaddr] "r"((const char *)table + (CACHELINESIZE * i)) : "rbx", "rcx", "rdx", "cc"); bit = (t2 - t1 < THRESHOLD) ? 1 : 0; n_hits += bit; bitmap[i / 8] &= ~(1 << (i % 8)); bitmap[i / 8] |= bit << (i % 8); } return n_hits; }