diff options
Diffstat (limited to 'kmod/cachepc.h')
| -rwxr-xr-x | kmod/cachepc.h | 63 |
1 files changed, 45 insertions, 18 deletions
diff --git a/kmod/cachepc.h b/kmod/cachepc.h index 97746ec..0e02678 100755 --- a/kmod/cachepc.h +++ b/kmod/cachepc.h @@ -49,16 +49,21 @@ extern cacheline *cachepc_ds; cacheline * cachepc_prime(cacheline *head) { - cacheline *curr_cl; + cacheline *curr_cl; - //cachepc_cpuid(); - curr_cl = head; - do { - curr_cl = curr_cl->next; - } while(curr_cl != head); - //cachepc_cpuid(); + cachepc_mfence(); + cachepc_cpuid(); + + curr_cl = head; + do { + curr_cl = curr_cl->next; + } while (curr_cl != head); + curr_cl = curr_cl->prev; - return curr_cl->prev; + cachepc_mfence(); + cachepc_cpuid(); + + return curr_cl; } /* @@ -78,16 +83,20 @@ cachepc_prime(cacheline *head) cacheline * cachepc_prime_rev(cacheline *head) { - cacheline *curr_cl; + cacheline *curr_cl; - //cachepc_cpuid(); - curr_cl = head; - do { - curr_cl = curr_cl->prev; - } while(curr_cl != head); - //cachepc_cpuid(); + cachepc_mfence(); + cachepc_cpuid(); + + curr_cl = head; + do { + curr_cl = curr_cl->prev; + } while(curr_cl != head); + + cachepc_mfence(); + cachepc_cpuid(); - return curr_cl->prev; + return curr_cl->prev; } cacheline * @@ -97,6 +106,9 @@ cachepc_probe(cacheline *start_cl) cacheline *next_cl; cacheline *curr_cl; + cachepc_mfence(); + cachepc_cpuid(); + curr_cl = start_cl; do { @@ -134,21 +146,32 @@ cachepc_probe(cacheline *start_cl) curr_cl = next_cl; } while (__builtin_expect(curr_cl != start_cl, 1)); + cachepc_mfence(); + cachepc_cpuid(); + return curr_cl->next; } void cachepc_victim(void *p) { - cachepc_cpuid(); cachepc_mfence(); + cachepc_cpuid(); + cachepc_readq(p); + + cachepc_mfence(); + cachepc_cpuid(); } uint64_t cachepc_read_pmc(uint64_t event) { uint32_t lo, hi; + uint64_t res; + + cachepc_mfence(); + cachepc_cpuid(); event = 0xC0010201 + 2 * event; @@ -157,6 +180,10 @@ cachepc_read_pmc(uint64_t event) : "=a" (lo), "=d" (hi) : "c"(event) ); + res = ((uint64_t) hi << 32) | (uint64_t) lo; + + cachepc_mfence(); + cachepc_cpuid(); - return ((uint64_t) hi << 32) | (uint64_t) lo; + return res; } |
