cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stat-cpi.py (2444B)


      1# SPDX-License-Identifier: GPL-2.0
      2
      3from __future__ import print_function
      4
      5data    = {}
      6times   = []
      7threads = []
      8cpus    = []
      9
     10def get_key(time, event, cpu, thread):
     11    return "%d-%s-%d-%d" % (time, event, cpu, thread)
     12
     13def store_key(time, cpu, thread):
     14    if (time not in times):
     15        times.append(time)
     16
     17    if (cpu not in cpus):
     18        cpus.append(cpu)
     19
     20    if (thread not in threads):
     21        threads.append(thread)
     22
     23def store(time, event, cpu, thread, val, ena, run):
     24    #print("event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" %
     25    #      (event, cpu, thread, time, val, ena, run))
     26
     27    store_key(time, cpu, thread)
     28    key = get_key(time, event, cpu, thread)
     29    data[key] = [ val, ena, run]
     30
     31def get(time, event, cpu, thread):
     32    key = get_key(time, event, cpu, thread)
     33    return data[key][0]
     34
     35def stat__cycles_k(cpu, thread, time, val, ena, run):
     36    store(time, "cycles", cpu, thread, val, ena, run);
     37
     38def stat__instructions_k(cpu, thread, time, val, ena, run):
     39    store(time, "instructions", cpu, thread, val, ena, run);
     40
     41def stat__cycles_u(cpu, thread, time, val, ena, run):
     42    store(time, "cycles", cpu, thread, val, ena, run);
     43
     44def stat__instructions_u(cpu, thread, time, val, ena, run):
     45    store(time, "instructions", cpu, thread, val, ena, run);
     46
     47def stat__cycles(cpu, thread, time, val, ena, run):
     48    store(time, "cycles", cpu, thread, val, ena, run);
     49
     50def stat__instructions(cpu, thread, time, val, ena, run):
     51    store(time, "instructions", cpu, thread, val, ena, run);
     52
     53def stat__interval(time):
     54    for cpu in cpus:
     55        for thread in threads:
     56            cyc = get(time, "cycles", cpu, thread)
     57            ins = get(time, "instructions", cpu, thread)
     58            cpi = 0
     59
     60            if ins != 0:
     61                cpi = cyc/float(ins)
     62
     63            print("%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins))
     64
     65def trace_end():
     66    pass
     67# XXX trace_end callback could be used as an alternative place
     68#     to compute same values as in the script above:
     69#
     70#    for time in times:
     71#        for cpu in cpus:
     72#            for thread in threads:
     73#                cyc = get(time, "cycles", cpu, thread)
     74#                ins = get(time, "instructions", cpu, thread)
     75#
     76#                if ins != 0:
     77#                    cpi = cyc/float(ins)
     78#
     79#                print("time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi))